Below is the list of changes that have just been committed into a local
5.1 repository of tomas. When tomas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2130 06/02/06 11:47:12 tomas@stripped +7 -0
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/sql_table.cc
1.303 06/02/06 11:47:06 tomas@stripped +4 -0
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/sql_db.cc
1.127 06/02/06 11:47:05 tomas@stripped +2 -2
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/handler.h
1.188 06/02/06 11:47:05 tomas@stripped +2 -1
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/handler.cc
1.214 06/02/06 11:47:05 tomas@stripped +17 -7
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/ha_ndbcluster_binlog.h
1.6 06/02/06 11:47:05 tomas@stripped +16 -10
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/ha_ndbcluster_binlog.cc
1.13 06/02/06 11:47:05 tomas@stripped +56 -14
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
sql/ha_ndbcluster.cc
1.258 06/02/06 11:47:05 tomas@stripped +1 -7
Bug #17038, distribution of schema operation to multiple binlogs missing/multiple
entries, partial fix
- log alter table directly in server instead of in handler
- acknowledge alter table _after_ all binlog events have been processed
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: tomas
# Host: poseidon.ndb.mysql.com
# Root: /home/tomas/mysql-5.1-new
--- 1.213/sql/handler.cc 2006-01-19 22:40:51 +01:00
+++ 1.214/sql/handler.cc 2006-02-06 11:47:05 +01:00
@@ -2529,12 +2529,11 @@
const char *table_name;
};
-static my_bool binlog_log_query_handlerton(THD *thd,
- st_plugin_int *plugin,
- void *args)
+static my_bool binlog_log_query_handlerton2(THD *thd,
+ const handlerton *hton,
+ void *args)
{
struct binlog_log_query_st *b= (struct binlog_log_query_st*)args;
- handlerton *hton= (handlerton *) plugin->plugin->info;
if (hton->state == SHOW_OPTION_YES && hton->binlog_log_query)
hton->binlog_log_query(thd,
b->binlog_command,
@@ -2545,7 +2544,15 @@
return FALSE;
}
-void ha_binlog_log_query(THD *thd, enum_binlog_command binlog_command,
+static my_bool binlog_log_query_handlerton(THD *thd,
+ st_plugin_int *plugin,
+ void *args)
+{
+ return binlog_log_query_handlerton2(thd, (const handlerton *)
plugin->plugin->info, args);
+}
+
+void ha_binlog_log_query(THD *thd, const handlerton *hton,
+ enum_binlog_command binlog_command,
const char *query, uint query_length,
const char *db, const char *table_name)
{
@@ -2555,8 +2562,11 @@
b.query_length= query_length;
b.db= db;
b.table_name= table_name;
- plugin_foreach(thd, binlog_log_query_handlerton,
- MYSQL_STORAGE_ENGINE_PLUGIN, &b);
+ if (hton == 0)
+ plugin_foreach(thd, binlog_log_query_handlerton,
+ MYSQL_STORAGE_ENGINE_PLUGIN, &b);
+ else
+ binlog_log_query_handlerton2(thd, hton, &b);
}
#endif
--- 1.187/sql/handler.h 2006-02-01 14:52:27 +01:00
+++ 1.188/sql/handler.h 2006-02-06 11:47:05 +01:00
@@ -2020,7 +2020,8 @@
int ha_reset_logs(THD *thd);
int ha_binlog_index_purge_file(THD *thd, const char *file);
void ha_reset_slave(THD *thd);
-void ha_binlog_log_query(THD *thd, enum_binlog_command binlog_command,
+void ha_binlog_log_query(THD *thd, const handlerton *db_type,
+ enum_binlog_command binlog_command,
const char *query, uint query_length,
const char *db, const char *table_name);
void ha_binlog_wait(THD *thd);
--- 1.126/sql/sql_db.cc 2006-02-02 14:48:05 +01:00
+++ 1.127/sql/sql_db.cc 2006-02-06 11:47:05 +01:00
@@ -501,7 +501,7 @@
query_length= thd->query_length;
}
- ha_binlog_log_query(thd, LOGCOM_CREATE_DB,
+ ha_binlog_log_query(thd, 0, LOGCOM_CREATE_DB,
query, query_length,
db, "");
@@ -579,7 +579,7 @@
thd->variables.collation_database= thd->db_charset;
}
- ha_binlog_log_query(thd, LOGCOM_ALTER_DB,
+ ha_binlog_log_query(thd, 0, LOGCOM_ALTER_DB,
thd->query, thd->query_length,
db, "");
--- 1.302/sql/sql_table.cc 2006-02-02 09:59:19 +01:00
+++ 1.303/sql/sql_table.cc 2006-02-06 11:47:06 +01:00
@@ -4974,6 +4974,10 @@
}
thd->proc_info="end";
+ ha_binlog_log_query(thd, create_info->db_type, LOGCOM_ALTER_TABLE,
+ thd->query, thd->query_length,
+ db, table_name);
+
DBUG_ASSERT(!(mysql_bin_log.is_open() && binlog_row_based &&
(create_info->options & HA_LEX_CREATE_TMP_TABLE)));
write_bin_log(thd, TRUE, thd->query, thd->query_length);
--- 1.257/sql/ha_ndbcluster.cc 2006-02-02 11:13:28 +01:00
+++ 1.258/sql/ha_ndbcluster.cc 2006-02-06 11:47:05 +01:00
@@ -4770,13 +4770,7 @@
"Creating event for logging table failed. "
"See error log for details.");
}
- if (is_old_table_tmpfile)
- ndbcluster_log_schema_op(current_thd, share,
- current_thd->query, current_thd->query_length,
- m_dbname, new_tabname,
- 0, 0,
- SOT_ALTER_TABLE);
- else
+ if (!is_old_table_tmpfile)
ndbcluster_log_schema_op(current_thd, share,
current_thd->query, current_thd->query_length,
m_dbname, new_tabname,
--- 1.12/sql/ha_ndbcluster_binlog.cc 2006-02-02 16:44:15 +01:00
+++ 1.13/sql/ha_ndbcluster_binlog.cc 2006-02-06 11:47:05 +01:00
@@ -441,6 +441,7 @@
break;
case LOGCOM_ALTER_TABLE:
type= SOT_ALTER_TABLE;
+ log= 1;
break;
case LOGCOM_RENAME_TABLE:
type= SOT_RENAME_TABLE;
@@ -461,8 +462,10 @@
break;
}
if (log)
+ {
ndbcluster_log_schema_op(thd, 0, query, query_length,
db, table_name, 0, 0, type);
+ }
DBUG_VOID_RETURN;
}
@@ -891,6 +894,7 @@
}
char tmp_buf2[FN_REFLEN];
+ int get_a_share= 0;
switch (type)
{
case SOT_DROP_TABLE:
@@ -900,13 +904,15 @@
/* redo the drop table query as is may contain several tables */
query= tmp_buf2;
query_length= (uint) (strxmov(tmp_buf2, "drop table `",
- table_name, "`", NullS) - tmp_buf2);
- break;
+ table_name, "`", NullS) - tmp_buf2);
+ // fall through
case SOT_CREATE_TABLE:
- break;
+ // fall through
case SOT_RENAME_TABLE:
- break;
+ // fall through
case SOT_ALTER_TABLE:
+ if (!share)
+ get_a_share= 1;
break;
case SOT_DROP_DB:
break;
@@ -922,6 +928,14 @@
abort(); /* should not happen, programming error */
}
+ if (get_a_share)
+ {
+ char key[FN_REFLEN];
+ (void)strxnmov(key, FN_REFLEN, share_prefix, db,
+ "/", table_name, NullS);
+ share= get_share(key, 0, false, false);
+ }
+
const NdbError *ndb_error= 0;
uint32 node_id= g_ndb_cluster_connection->node_id();
Uint64 epoch= 0;
@@ -956,7 +970,7 @@
}
Ndb *ndb= thd_ndb->ndb;
- char old_db[128];
+ char old_db[FN_REFLEN];
strcpy(old_db, ndb->getDatabaseName());
char tmp_buf[SCHEMA_QUERY_SIZE];
@@ -974,9 +988,8 @@
strcmp(NDB_SCHEMA_TABLE, table_name))
{
ndb_error= &dict->getNdbError();
- goto end;
}
- DBUG_RETURN(0);
+ goto end;
}
{
@@ -1119,6 +1132,10 @@
}
(void) pthread_mutex_unlock(&share->mutex);
}
+
+ if (get_a_share)
+ free_share(&share);
+
DBUG_RETURN(0);
}
@@ -1328,7 +1345,10 @@
ndb_binlog_thread_handle_schema_event(THD *thd, Ndb *ndb,
NdbEventOperation *pOp,
List<Cluster_replication_schema>
- *schema_list, MEM_ROOT *mem_root)
+ *post_epoch_log_list,
+ List<Cluster_replication_schema>
+ *post_epoch_unlock_list,
+ MEM_ROOT *mem_root)
{
DBUG_ENTER("ndb_binlog_thread_handle_schema_event");
NDB_SHARE *share= (NDB_SHARE *)pOp->getCustomData();
@@ -1357,7 +1377,7 @@
{
case SOT_DROP_TABLE:
/* binlog dropping table after any table operations */
- schema_list->push_back(schema, mem_root);
+ post_epoch_log_list->push_back(schema, mem_root);
log_query= 0;
break;
case SOT_RENAME_TABLE:
@@ -1389,7 +1409,7 @@
TRUE, /* print error */
TRUE); /* don't binlog the query */
/* binlog dropping database after any table operations */
- schema_list->push_back(schema, mem_root);
+ post_epoch_log_list->push_back(schema, mem_root);
log_query= 0;
break;
case SOT_CREATE_DB:
@@ -1431,7 +1451,18 @@
{
DBUG_DUMP("slock", (char*)schema->slock, schema->slock_length);
if (bitmap_is_set(&slock, node_id))
- ndbcluster_update_slock(thd, schema->db, schema->name);
+ {
+ /*
+ If it is an SOT_ALTER_TABLE we need to acknowledge the
+ schema operation _after_ all the events have been
+ processed so that all schema events coming through
+ the event operation has been processed
+ */
+ if ((enum SCHEMA_OP_TYPE)schema->type == SOT_ALTER_TABLE)
+ post_epoch_unlock_list->push_back(schema, mem_root);
+ else
+ ndbcluster_update_slock(thd, schema->db, schema->name);
+ }
}
if (log_query)
@@ -2724,7 +2755,8 @@
MEM_ROOT *old_root= *root_ptr;
MEM_ROOT mem_root;
init_sql_alloc(&mem_root, 4096, 0);
- List<Cluster_replication_schema> schema_list;
+ List<Cluster_replication_schema> post_epoch_log_list;
+ List<Cluster_replication_schema> post_epoch_unlock_list;
*root_ptr= &mem_root;
if (unlikely(schema_res > 0))
@@ -2737,7 +2769,9 @@
{
if (!pOp->hasError())
ndb_binlog_thread_handle_schema_event(thd, schema_ndb, pOp,
- &schema_list, &mem_root);
+ &post_epoch_log_list,
+ &post_epoch_unlock_list,
+ &mem_root);
else
sql_print_error("NDB: error %lu (%s) on handling "
"binlog schema event",
@@ -2864,9 +2898,17 @@
}
}
+ /*
+ process any operations that should be done after
+ the epoch is complete
+ */
{
Cluster_replication_schema *schema;
- while ((schema= schema_list.pop()))
+ while ((schema= post_epoch_unlock_list.pop()))
+ {
+ ndbcluster_update_slock(thd, schema->db, schema->name);
+ }
+ while ((schema= post_epoch_log_list.pop()))
{
char *thd_db_save= thd->db;
thd->db= schema->db;
--- 1.5/sql/ha_ndbcluster_binlog.h 2006-02-01 01:12:04 +01:00
+++ 1.6/sql/ha_ndbcluster_binlog.h 2006-02-06 11:47:05 +01:00
@@ -29,18 +29,24 @@
#define INJECTOR_EVENT_LEN 200
+/*
+ The numbers below must not change as they
+ are passed between mysql servers, and if changed
+ would break compatablility. Add new numbers to
+ the end.
+*/
enum SCHEMA_OP_TYPE
{
- SOT_DROP_TABLE,
- SOT_CREATE_TABLE,
- SOT_RENAME_TABLE,
- SOT_ALTER_TABLE,
- SOT_DROP_DB,
- SOT_CREATE_DB,
- SOT_ALTER_DB,
- SOT_CLEAR_SLOCK,
- SOT_TABLESPACE,
- SOT_LOGFILE_GROUP
+ SOT_DROP_TABLE= 0,
+ SOT_CREATE_TABLE= 1,
+ SOT_RENAME_TABLE= 2,
+ SOT_ALTER_TABLE= 3,
+ SOT_DROP_DB= 4,
+ SOT_CREATE_DB= 5,
+ SOT_ALTER_DB= 6,
+ SOT_CLEAR_SLOCK= 7,
+ SOT_TABLESPACE= 8,
+ SOT_LOGFILE_GROUP= 9
};
const uint max_ndb_nodes= 64; /* multiple of 32 */
| Thread |
|---|
| • bk commit into 5.1 tree (tomas:1.2130) BUG#17038 | tomas | 6 Feb |