From abb2f9488d3e1ca4e4dacc8a315ae6ed6f13fd68 Mon Sep 17 00:00:00 2001 From: kevg Date: Mon, 26 Dec 2016 18:46:02 +0300 Subject: [PATCH] IB: skip sys_trx_start when comparing master and slave rows [closes #107] --- mysql-test/suite/versioning/r/rpl_row.result | 13 +++++++++++++ mysql-test/suite/versioning/r/rpl_stmt.result | 13 +++++++++++++ mysql-test/suite/versioning/t/rpl_test.inc | 11 +++++++++++ sql/log_event.cc | 10 ++++------ sql/table.h | 6 ++++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/mysql-test/suite/versioning/r/rpl_row.result b/mysql-test/suite/versioning/r/rpl_row.result index e193dc90ee0..6d41ed6ff7b 100644 --- a/mysql-test/suite/versioning/r/rpl_row.result +++ b/mysql-test/suite/versioning/r/rpl_row.result @@ -109,5 +109,18 @@ connection slave; select * from t1; x connection master; +create or replace table t1 (a int) with system versioning engine = innodb; +insert into t1 values (1); +update t1 set a=2; +select * from t1 for system_time all; +a +2 +1 +connection slave; +select * from t1 for system_time all; +a +2 +1 +connection master; drop table t1; include/rpl_end.inc diff --git a/mysql-test/suite/versioning/r/rpl_stmt.result b/mysql-test/suite/versioning/r/rpl_stmt.result index e193dc90ee0..6d41ed6ff7b 100644 --- a/mysql-test/suite/versioning/r/rpl_stmt.result +++ b/mysql-test/suite/versioning/r/rpl_stmt.result @@ -109,5 +109,18 @@ connection slave; select * from t1; x connection master; +create or replace table t1 (a int) with system versioning engine = innodb; +insert into t1 values (1); +update t1 set a=2; +select * from t1 for system_time all; +a +2 +1 +connection slave; +select * from t1 for system_time all; +a +2 +1 +connection master; drop table t1; include/rpl_end.inc diff --git a/mysql-test/suite/versioning/t/rpl_test.inc b/mysql-test/suite/versioning/t/rpl_test.inc index bba67efc19b..74ed3bfd15b 100644 --- a/mysql-test/suite/versioning/t/rpl_test.inc +++ b/mysql-test/suite/versioning/t/rpl_test.inc @@ -86,5 +86,16 @@ select * from t1 for system_time all; sync_slave_with_master; select * from t1; +# at this point in this particular test master and slave have different curr_trx_id +# and the same rows have different sys_trx_start +# slave should ignore sys_trx_start while searching for a record to update in a InnoDB table +connection master; +create or replace table t1 (a int) with system versioning engine = innodb; +insert into t1 values (1); +update t1 set a=2; +select * from t1 for system_time all; +sync_slave_with_master; +select * from t1 for system_time all; + connection master; drop table t1; diff --git a/sql/log_event.cc b/sql/log_event.cc index 0e48791fd5c..4a48ebce077 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -12766,7 +12766,7 @@ uint8 Write_rows_log_event::get_trg_event_map() Returns TRUE if different. */ -static bool record_compare(TABLE *table, bool skip_sys_start) +static bool record_compare(TABLE *table) { bool result= FALSE; /** @@ -12799,7 +12799,7 @@ static bool record_compare(TABLE *table, bool skip_sys_start) /* Compare fields */ for (Field **ptr=table->field ; *ptr ; ptr++) { - if (skip_sys_start && *ptr == table->vers_start_field()) + if (table->versioned_by_engine() && *ptr == table->vers_start_field()) { continue; } @@ -12997,7 +12997,6 @@ int Rows_log_event::find_row(rpl_group_info *rgi) prepare_record(table, m_width, FALSE); error= unpack_current_row(rgi); - bool skip_sys_start= false; if (table->versioned()) { @@ -13011,7 +13010,6 @@ int Rows_log_event::find_row(rpl_group_info *rgi) bitmap_set_bit(table->write_set, sys_trx_end->field_index); sys_trx_end->set_max(); table->vers_start_field()->set_notnull(); - skip_sys_start= true; } } @@ -13190,7 +13188,7 @@ int Rows_log_event::find_row(rpl_group_info *rgi) /* We use this to test that the correct key is used in test cases. */ DBUG_EXECUTE_IF("slave_crash_if_index_scan", abort();); - while (record_compare(table, skip_sys_start)) + while (record_compare(table)) { while ((error= table->file->ha_index_next(table->record[0]))) { @@ -13254,7 +13252,7 @@ int Rows_log_event::find_row(rpl_group_info *rgi) goto end; } } - while (record_compare(table, skip_sys_start)); + while (record_compare(table)); /* Note: above record_compare will take into accout all record fields diff --git a/sql/table.h b/sql/table.h index 552e51284a6..da91162523a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1522,6 +1522,12 @@ public: return s->versioned && !file->versioned(); } + bool versioned_by_engine() const + { + DBUG_ASSERT(file); + return s->versioned && file->versioned(); + } + Field *vers_start_field() const { DBUG_ASSERT(s->versioned);