BUG#30017 log-slave-updates incorrect behavior for cluster

- let the receiving injector thread decide what to do
parent 483555d3
...@@ -2812,10 +2812,16 @@ int ha_ndbcluster::write_row(byte *record) ...@@ -2812,10 +2812,16 @@ int ha_ndbcluster::write_row(byte *record)
if (unlikely(m_slow_path)) if (unlikely(m_slow_path))
{ {
if (!(thd->options & OPTION_BIN_LOG)) /*
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); ignore OPTION_BIN_LOG for slave thd. It is used to indicate
else if (thd->slave_thread) log-slave-updates option. This is instead handled in the
injector thread, by looking explicitly at the
opt_log_slave_updates flag.
*/
if (thd->slave_thread)
op->setAnyValue(thd->server_id); op->setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
m_rows_changed++; m_rows_changed++;
...@@ -3101,10 +3107,16 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) ...@@ -3101,10 +3107,16 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
if (unlikely(m_slow_path)) if (unlikely(m_slow_path))
{ {
if (!(thd->options & OPTION_BIN_LOG)) /*
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); ignore OPTION_BIN_LOG for slave thd. It is used to indicate
else if (thd->slave_thread) log-slave-updates option. This is instead handled in the
injector thread, by looking explicitly at the
opt_log_slave_updates flag
*/
if (thd->slave_thread)
op->setAnyValue(thd->server_id); op->setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
/* /*
Execute update operation if we are not doing a scan for update Execute update operation if we are not doing a scan for update
...@@ -3168,12 +3180,18 @@ int ha_ndbcluster::delete_row(const byte *record) ...@@ -3168,12 +3180,18 @@ int ha_ndbcluster::delete_row(const byte *record)
if (unlikely(m_slow_path)) if (unlikely(m_slow_path))
{ {
if (!(thd->options & OPTION_BIN_LOG)) /*
((NdbOperation *)trans->getLastDefinedOperation())-> ignore OPTION_BIN_LOG for slave thd. It is used to indicate
setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); log-slave-updates option. This is instead handled in the
else if (thd->slave_thread) injector thread, by looking explicitly at the
opt_log_slave_updates flag
*/
if (thd->slave_thread)
((NdbOperation *)trans->getLastDefinedOperation())-> ((NdbOperation *)trans->getLastDefinedOperation())->
setAnyValue(thd->server_id); setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
((NdbOperation *)trans->getLastDefinedOperation())->
setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
if (!(m_primary_key_update || m_delete_cannot_batch)) if (!(m_primary_key_update || m_delete_cannot_batch))
// If deleting from cursor, NoCommit will be handled in next_result // If deleting from cursor, NoCommit will be handled in next_result
...@@ -3207,10 +3225,16 @@ int ha_ndbcluster::delete_row(const byte *record) ...@@ -3207,10 +3225,16 @@ int ha_ndbcluster::delete_row(const byte *record)
if (unlikely(m_slow_path)) if (unlikely(m_slow_path))
{ {
if (!(thd->options & OPTION_BIN_LOG)) /*
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); ignore OPTION_BIN_LOG for slave thd. It is used to indicate
else if (thd->slave_thread) log-slave-updates option. This is instead handled in the
injector thread, by looking explicitly at the
opt_log_slave_updates flag
*/
if (thd->slave_thread)
op->setAnyValue(thd->server_id); op->setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
} }
......
...@@ -114,6 +114,9 @@ NDB_SHARE *ndb_apply_status_share= 0; ...@@ -114,6 +114,9 @@ NDB_SHARE *ndb_apply_status_share= 0;
NDB_SHARE *ndb_schema_share= 0; NDB_SHARE *ndb_schema_share= 0;
pthread_mutex_t ndb_schema_share_mutex; 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 */ /* Schema object distribution handling */
HASH ndb_schema_objects; HASH ndb_schema_objects;
typedef struct st_ndb_schema_object { typedef struct st_ndb_schema_object {
...@@ -3297,6 +3300,14 @@ ndb_binlog_thread_handle_data_event(Ndb *ndb, NdbEventOperation *pOp, ...@@ -3297,6 +3300,14 @@ ndb_binlog_thread_handle_data_event(Ndb *ndb, NdbEventOperation *pOp,
originating_server_id); originating_server_id);
return 0; 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; TABLE *table= share->table;
DBUG_ASSERT(trans.good()); DBUG_ASSERT(trans.good());
...@@ -3949,6 +3960,8 @@ pthread_handler_t ndb_binlog_thread_func(void *arg) ...@@ -3949,6 +3960,8 @@ pthread_handler_t ndb_binlog_thread_func(void *arg)
! IS_NDB_BLOB_PREFIX(pOp->getEvent()->getTable()->getName())); ! IS_NDB_BLOB_PREFIX(pOp->getEvent()->getTable()->getName()));
DBUG_ASSERT(gci <= ndb_latest_received_binlog_epoch); 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-> i_ndb->
setReportThreshEventGCISlip(ndb_report_thresh_binlog_epoch_slip); setReportThreshEventGCISlip(ndb_report_thresh_binlog_epoch_slip);
i_ndb->setReportThreshEventFreeMem(ndb_report_thresh_binlog_mem_usage); i_ndb->setReportThreshEventFreeMem(ndb_report_thresh_binlog_mem_usage);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment