From: magnus.blaudd Date: November 9 2011 6:34am Subject: bzr push into mysql-5.5-cluster branch (magnus.blaudd:3644 to 3645) List-Archive: http://lists.mysql.com/commits/141871 Message-Id: <201111090635.pA96Z017010893@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3645 magnus.blaudd@stripped 2011-11-09 ndb schema dist - first step towards determing in one place if NDB_SHARE should subscribe to events - move as much as possible for initializing share into 'NDB_SHARE::create' - share pointer is required both in 'ndbcluster_create_event' and 'ndbcluster_create_event_ops' modified: sql/ha_ndbcluster.cc sql/ha_ndbcluster_binlog.cc sql/ndb_share.cc sql/ndb_share.h 3644 magnus.blaudd@stripped 2011-11-08 ndb schema dist - factor out the code which creates a NDB_SHARE into 'NDB_SHARE::create' modified: sql/ha_ndbcluster.cc sql/ndb_share.h === modified file 'sql/ha_ndbcluster.cc' --- a/sql/ha_ndbcluster.cc 2011-11-08 21:07:35 +0000 +++ b/sql/ha_ndbcluster.cc 2011-11-09 06:31:45 +0000 @@ -13608,6 +13608,7 @@ int ndbcluster_undo_rename_share(THD *th return 0; } + int ndbcluster_rename_share(THD *thd, NDB_SHARE *share) { NDB_SHARE *tmp; @@ -13740,6 +13741,29 @@ NDB_SHARE::create(const char* key, size_ share->commit_count= 0; share->commit_count_lock= 0; +#ifdef HAVE_NDB_BINLOG + share->m_cfn_share= NULL; +#endif + + share->op= 0; + share->new_op= 0; + share->event_data= 0; + + { + // Create array of bitmap for keeping track of subscribed nodes + // NOTE! Only the NDB_SHARE for ndb_schema really needs this + int no_nodes= g_ndb_cluster_connection->no_db_nodes(); + share->subscriber_bitmap= (MY_BITMAP*) + alloc_root(&share->mem_root, no_nodes * sizeof(MY_BITMAP)); + for (int i= 0; i < no_nodes; i++) + { + bitmap_init(&share->subscriber_bitmap[i], + (Uint32*)alloc_root(&share->mem_root, max_ndb_nodes/8), + max_ndb_nodes, FALSE); + bitmap_clear_all(&share->subscriber_bitmap[i]); + } + } + if (ndbcluster_binlog_init_share(current_thd, share, table)) { DBUG_PRINT("error", ("get_share: %s could not init share", key)); === modified file 'sql/ha_ndbcluster_binlog.cc' --- a/sql/ha_ndbcluster_binlog.cc 2011-11-08 10:34:21 +0000 +++ b/sql/ha_ndbcluster_binlog.cc 2011-11-09 06:31:45 +0000 @@ -362,48 +362,9 @@ ndb_binlog_open_shadow_table(THD *thd, N */ int ndbcluster_binlog_init_share(THD *thd, NDB_SHARE *share, TABLE *_table) { - MEM_ROOT *mem_root= &share->mem_root; - int do_event_op= ndb_binlog_running; - int error= 0; DBUG_ENTER("ndbcluster_binlog_init_share"); -#ifdef HAVE_NDB_BINLOG - share->m_cfn_share= NULL; -#endif - - share->op= 0; - share->new_op= 0; - share->event_data= 0; - - if (!ndb_schema_share && - strcmp(share->db, NDB_REP_DB) == 0 && - strcmp(share->table_name, NDB_SCHEMA_TABLE) == 0) - do_event_op= 1; - else if (!ndb_apply_status_share && - strcmp(share->db, NDB_REP_DB) == 0 && - strcmp(share->table_name, NDB_APPLY_TABLE) == 0) - do_event_op= 1; - - if (Ndb_dist_priv_util::is_distributed_priv_table(share->db, - share->table_name)) - { - do_event_op= 0; - } - - { - int i, no_nodes= g_ndb_cluster_connection->no_db_nodes(); - share->subscriber_bitmap= (MY_BITMAP*) - alloc_root(mem_root, no_nodes * sizeof(MY_BITMAP)); - for (i= 0; i < no_nodes; i++) - { - bitmap_init(&share->subscriber_bitmap[i], - (Uint32*)alloc_root(mem_root, max_ndb_nodes/8), - max_ndb_nodes, FALSE); - bitmap_clear_all(&share->subscriber_bitmap[i]); - } - } - - if (!do_event_op) + if (!share->need_events(ndb_binlog_running)) { if (_table) { @@ -416,7 +377,7 @@ int ndbcluster_binlog_init_share(THD *th { share->flags|= NSF_NO_BINLOG; } - DBUG_RETURN(error); + DBUG_RETURN(0); } DBUG_RETURN(ndb_binlog_open_shadow_table(thd, share)); @@ -2751,10 +2712,12 @@ class Ndb_schema_event_handler { void handle_offline_alter_table_commit(Ndb_schema_op* schema) { + DBUG_ENTER("handle_offline_alter_table_commit"); + assert(is_post_epoch()); // Always after epoch if (schema->node_id == own_nodeid()) - return; + DBUG_VOID_RETURN; write_schema_op_to_binlog(m_thd, schema); ndbapi_invalidate_table(schema->db, schema->name); @@ -2802,13 +2765,14 @@ class Ndb_schema_event_handler { "from binlog schema event '%s' from node %d.", schema->db, schema->name, schema->query, schema->node_id); - return; + DBUG_VOID_RETURN; } if (ndb_create_table_from_engine(m_thd, schema->db, schema->name)) { print_could_not_discover_error(m_thd, schema); } + DBUG_VOID_RETURN; } @@ -5147,7 +5111,6 @@ int ndbcluster_create_binlog_setup(THD * const char *table_name, TABLE * table) { - int do_event_op= ndb_binlog_running; DBUG_ENTER("ndbcluster_create_binlog_setup"); DBUG_PRINT("enter",("key: %s key_len: %d %s.%s", key, key_len, db, table_name)); @@ -5171,25 +5134,7 @@ int ndbcluster_create_binlog_setup(THD * DBUG_RETURN(0); // replication already setup, or should not } - if (Ndb_dist_priv_util::is_distributed_priv_table(db, table_name)) - { - // The distributed privilege tables are distributed by writing - // the CREATE USER, GRANT, REVOKE etc. to ndb_schema -> no need - // to listen to events from this table - DBUG_PRINT("info", ("Skipping binlogging of table %s/%s", db, table_name)); - do_event_op= 0; - } - - if (!ndb_schema_share && - strcmp(share->db, NDB_REP_DB) == 0 && - strcmp(share->table_name, NDB_SCHEMA_TABLE) == 0) - do_event_op= 1; - else if (!ndb_apply_status_share && - strcmp(share->db, NDB_REP_DB) == 0 && - strcmp(share->table_name, NDB_APPLY_TABLE) == 0) - do_event_op= 1; - - if (!do_event_op) + if (!share->need_events(ndb_binlog_running)) { set_binlog_nologging(share); pthread_mutex_unlock(&share->mutex); @@ -5296,11 +5241,8 @@ ndbcluster_create_event(THD *thd, Ndb *n ndbtab->getName(), ndbtab->getObjectVersion(), event_name, share ? share->key : "(nil)")); DBUG_ASSERT(! IS_NDB_BLOB_PREFIX(ndbtab->getName())); - if (!share) - { - DBUG_PRINT("info", ("share == NULL")); - DBUG_RETURN(0); - } + DBUG_ASSERT(share); + if (get_binlog_nologging(share)) { if (opt_ndb_extra_logging && ndb_binlog_running) @@ -5480,8 +5422,7 @@ ndbcluster_create_event_ops(THD *thd, ND DBUG_ENTER("ndbcluster_create_event_ops"); DBUG_PRINT("enter", ("table: %s event: %s", ndbtab->getName(), event_name)); DBUG_ASSERT(! IS_NDB_BLOB_PREFIX(ndbtab->getName())); - - DBUG_ASSERT(share != 0); + DBUG_ASSERT(share); if (get_binlog_nologging(share)) { @@ -5495,7 +5436,6 @@ ndbcluster_create_event_ops(THD *thd, ND assert(!Ndb_dist_priv_util::is_distributed_priv_table(share->db, share->table_name)); - Ndb_event_data *event_data= share->event_data; int do_ndb_schema_share= 0, do_ndb_apply_status_share= 0; #ifdef HAVE_NDB_BINLOG uint len= (int)strlen(share->table_name); @@ -5520,6 +5460,10 @@ ndbcluster_create_event_ops(THD *thd, ND DBUG_RETURN(0); } + // Check that the share agrees + DBUG_ASSERT(share->need_events(ndb_binlog_running)); + + Ndb_event_data *event_data= share->event_data; if (share->op) { event_data= (Ndb_event_data *) share->op->getCustomData(); === modified file 'sql/ndb_share.cc' --- a/sql/ndb_share.cc 2011-11-07 19:00:35 +0000 +++ b/sql/ndb_share.cc 2011-11-09 06:31:45 +0000 @@ -17,6 +17,8 @@ #include "ndb_share.h" #include "ndb_event_data.h" +#include "ndb_dist_priv_util.h" +#include "ha_ndbcluster_tables.h" #include @@ -46,3 +48,50 @@ NDB_SHARE::destroy(NDB_SHARE* share) my_free(share); } + +bool +NDB_SHARE::need_events(bool default_on) const +{ + DBUG_ENTER("NDB_SHARE::need_events"); + DBUG_PRINT("enter", ("db: %s, table_name: %s", + db, table_name)); + + if (default_on) + { + // Events are on by default, check if it should be turned off + + if (Ndb_dist_priv_util::is_distributed_priv_table(db, table_name)) + { + /* + The distributed privilege tables are distributed by writing + the CREATE USER, GRANT, REVOKE etc. to ndb_schema -> no need + to listen to events from those table + */ + DBUG_PRINT("exit", ("no events for dist priv table")); + DBUG_RETURN(false); + } + + DBUG_PRINT("exit", ("need events(the default for this mysqld)")); + DBUG_RETURN(true); + } + + // Events are off by default, check if it should be turned on + if (strcmp(db, NDB_REP_DB) == 0) + { + // The table is in "mysql" database + if (strcmp(table_name, NDB_SCHEMA_TABLE) == 0) + { + DBUG_PRINT("exit", ("need events for " NDB_SCHEMA_TABLE)); + DBUG_RETURN(true); + } + + if (strcmp(table_name, NDB_APPLY_TABLE) == 0) + { + DBUG_PRINT("exit", ("need events for " NDB_APPLY_TABLE)); + DBUG_RETURN(true); + } + } + + DBUG_PRINT("exit", ("no events(the default for this mysqld)")); + DBUG_RETURN(false); +} === modified file 'sql/ndb_share.h' --- a/sql/ndb_share.h 2011-11-08 21:07:35 +0000 +++ b/sql/ndb_share.h 2011-11-09 06:31:45 +0000 @@ -192,6 +192,12 @@ struct NDB_SHARE { struct TABLE* table, const char* db_name, const char* table_name); static void destroy(NDB_SHARE* share); + + /* + Returns true if this share need to subscribe to + events from the table. + */ + bool need_events(bool default_on) const; }; No bundle (reason: useless for push emails).