From: Date: August 23 2007 4:13pm Subject: bk commit into 5.1 tree (tomas:1.2570) BUG#30017 List-Archive: http://lists.mysql.com/commits/32961 X-Bug: 30017 Message-Id: <20070823141334.75A181801C016@linux.local> 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@stripped, 2007-08-23 16:13:21+02:00, tomas@stripped +2 -0 BUG#30017 log-slave-updates incorrect behavior for cluster - let the receiving injector thread decide what to do (recommit for 5.1.22 target) sql/ha_ndbcluster.cc@stripped, 2007-08-23 16:13:12+02:00, tomas@stripped +37 -13 BUG#30017 log-slave-updates incorrect behavior for cluster - let the receiving injector thread decide what to do sql/ha_ndbcluster_binlog.cc@stripped, 2007-08-23 16:13:13+02:00, tomas@stripped +13 -0 BUG#30017 log-slave-updates incorrect behavior for cluster - let the receiving injector thread decide what to do diff -Nrup a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc --- a/sql/ha_ndbcluster.cc 2007-08-03 00:14:02 +02:00 +++ b/sql/ha_ndbcluster.cc 2007-08-23 16:13:12 +02:00 @@ -2812,11 +2812,17 @@ int ha_ndbcluster::write_row(uchar *reco if (unlikely(m_slow_path)) { + /* + ignore TNTO_NO_LOGGING for slave thd. It is used to indicate + log-slave-updates option. This is instead handled in the + injector thread, by looking explicitly at the + opt_log_slave_updates flag. + */ Thd_ndb *thd_ndb= get_thd_ndb(thd); - if (thd_ndb->trans_options & TNTO_NO_LOGGING) - op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); - else if (thd->slave_thread) + if (thd->slave_thread) op->setAnyValue(thd->server_id); + else if (thd_ndb->trans_options & TNTO_NO_LOGGING) + op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); } m_rows_changed++; @@ -3102,11 +3108,17 @@ int ha_ndbcluster::update_row(const ucha if (unlikely(m_slow_path)) { + /* + ignore TNTO_NO_LOGGING for slave thd. It is used to indicate + log-slave-updates option. This is instead handled in the + injector thread, by looking explicitly at the + opt_log_slave_updates flag. + */ Thd_ndb *thd_ndb= get_thd_ndb(thd); - if (thd_ndb->trans_options & TNTO_NO_LOGGING) - op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); - else if (thd->slave_thread) + if (thd->slave_thread) op->setAnyValue(thd->server_id); + else if (thd_ndb->trans_options & TNTO_NO_LOGGING) + op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); } /* Execute update operation if we are not doing a scan for update @@ -3170,13 +3182,19 @@ int ha_ndbcluster::delete_row(const ucha if (unlikely(m_slow_path)) { + /* + ignore TNTO_NO_LOGGING for slave thd. It is used to indicate + log-slave-updates option. This is instead handled in the + injector thread, by looking explicitly at the + opt_log_slave_updates flag. + */ Thd_ndb *thd_ndb= get_thd_ndb(thd); - if (thd_ndb->trans_options & TNTO_NO_LOGGING) - ((NdbOperation *)trans->getLastDefinedOperation())-> - setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); - else if (thd->slave_thread) + if (thd->slave_thread) ((NdbOperation *)trans->getLastDefinedOperation())-> setAnyValue(thd->server_id); + else if (thd_ndb->trans_options & TNTO_NO_LOGGING) + ((NdbOperation *)trans->getLastDefinedOperation())-> + setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); } if (!(m_primary_key_update || m_delete_cannot_batch)) // If deleting from cursor, NoCommit will be handled in next_result @@ -3210,11 +3228,17 @@ int ha_ndbcluster::delete_row(const ucha if (unlikely(m_slow_path)) { + /* + ignore TNTO_NO_LOGGING for slave thd. It is used to indicate + log-slave-updates option. This is instead handled in the + injector thread, by looking explicitly at the + opt_log_slave_updates flag. + */ Thd_ndb *thd_ndb= get_thd_ndb(thd); - if (thd_ndb->trans_options & TNTO_NO_LOGGING) - op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); - else if (thd->slave_thread) + if (thd->slave_thread) op->setAnyValue(thd->server_id); + else if (thd_ndb->trans_options & TNTO_NO_LOGGING) + op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); } } diff -Nrup a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc --- a/sql/ha_ndbcluster_binlog.cc 2007-08-03 16:54:34 +02:00 +++ b/sql/ha_ndbcluster_binlog.cc 2007-08-23 16:13:13 +02:00 @@ -114,6 +114,9 @@ NDB_SHARE *ndb_apply_status_share= 0; NDB_SHARE *ndb_schema_share= 0; pthread_mutex_t ndb_schema_share_mutex; +extern my_bool opt_log_slave_updates; +static my_bool g_ndb_log_slave_updates; + /* Schema object distribution handling */ HASH ndb_schema_objects; typedef struct st_ndb_schema_object { @@ -3296,6 +3299,14 @@ ndb_binlog_thread_handle_data_event(Ndb originating_server_id); return 0; } + else if (!g_ndb_log_slave_updates) + { + /* + This event comes from a slave applier since it has an originating + server id set. Since option to log slave updates is not set, skip it. + */ + return 0; + } TABLE *table= share->table; DBUG_ASSERT(trans.good()); @@ -3942,6 +3953,8 @@ restart: ! IS_NDB_BLOB_PREFIX(pOp->getEvent()->getTable()->getName())); DBUG_ASSERT(gci <= ndb_latest_received_binlog_epoch); + /* initialize some variables for this epoch */ + g_ndb_log_slave_updates= opt_log_slave_updates; i_ndb-> setReportThreshEventGCISlip(ndb_report_thresh_binlog_epoch_slip); i_ndb->setReportThreshEventFreeMem(ndb_report_thresh_binlog_mem_usage);