diff options
-rw-r--r-- | mysql-test/suite/galera/r/binlog_checksum.result | 36 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/binlog_checksum.test | 36 | ||||
-rw-r--r-- | sql/sql_class.cc | 1 | ||||
-rw-r--r-- | sql/sql_class.h | 1 | ||||
-rw-r--r-- | sql/wsrep_applier.cc | 28 | ||||
-rw-r--r-- | sql/wsrep_mysqld.cc | 10 |
6 files changed, 105 insertions, 7 deletions
diff --git a/mysql-test/suite/galera/r/binlog_checksum.result b/mysql-test/suite/galera/r/binlog_checksum.result new file mode 100644 index 00000000000..5c1981fc17f --- /dev/null +++ b/mysql-test/suite/galera/r/binlog_checksum.result @@ -0,0 +1,36 @@ +# On node_1 +SET @binlog_checksum_saved= @@GLOBAL.BINLOG_CHECKSUM; +SET @@GLOBAL.BINLOG_CHECKSUM=CRC32; +# On node_2 +SET @binlog_checksum_saved= @@GLOBAL.BINLOG_CHECKSUM; +SET @@GLOBAL.BINLOG_CHECKSUM=CRC32; +USE test; +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5); +SELECT * FROM t1; +c1 +1 +2 +3 +4 +5 +SELECT * FROM test.t1; +c1 +1 +2 +3 +4 +5 + +# On node_2 +SELECT * FROM test.t1; +c1 +1 +2 +3 +4 +5 +DROP TABLE t1; +SET @@GLOBAL.BINLOG_CHECKSUM = @binlog_checksum_saved; +SET @@GLOBAL.BINLOG_CHECKSUM = @binlog_checksum_saved; +# End of test diff --git a/mysql-test/suite/galera/t/binlog_checksum.test b/mysql-test/suite/galera/t/binlog_checksum.test new file mode 100644 index 00000000000..5aab68a7746 --- /dev/null +++ b/mysql-test/suite/galera/t/binlog_checksum.test @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # On node_1 +--connection node_1 +SET @binlog_checksum_saved= @@GLOBAL.BINLOG_CHECKSUM; +SET @@GLOBAL.BINLOG_CHECKSUM=CRC32; + +--echo # On node_2 +--connection node_2 +SET @binlog_checksum_saved= @@GLOBAL.BINLOG_CHECKSUM; +SET @@GLOBAL.BINLOG_CHECKSUM=CRC32; + +USE test; +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5); +SELECT * FROM t1; +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + +--let $galera_diff_statement = SELECT * FROM t1 +--source include/galera_diff.inc + +# Cleanup +DROP TABLE t1; +--connection node_1 +SET @@GLOBAL.BINLOG_CHECKSUM = @binlog_checksum_saved; +--connection node_2 +SET @@GLOBAL.BINLOG_CHECKSUM = @binlog_checksum_saved; + +--source include/galera_end.inc +--echo # End of test diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 9fa508cdc97..d40ca89a5ab 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1000,6 +1000,7 @@ THD::THD() wsrep_applier(is_applier), wsrep_applier_closing(FALSE), wsrep_client_thread(0), + wsrep_apply_format(0), wsrep_apply_toi(false), #endif m_parser_state(NULL), diff --git a/sql/sql_class.h b/sql/sql_class.h index 477be6e8004..3418e16f275 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2389,6 +2389,7 @@ public: const char* wsrep_TOI_pre_query; /* a query to apply before the actual TOI query */ size_t wsrep_TOI_pre_query_len; + void* wsrep_apply_format; bool wsrep_apply_toi; /* applier processing in TOI */ #endif /* WITH_WSREP */ /** diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index 03f544a4444..3736431cd30 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -17,7 +17,6 @@ #include "wsrep_binlog.h" // wsrep_dump_rbr_buf() #include "log_event.h" // EVENT_LEN_OFFSET, etc. - #include "wsrep_applier.h" /* @@ -64,7 +63,25 @@ err: #include "rpl_rli.h" // class Relay_log_info; #include "sql_base.h" // close_temporary_table() -extern const Format_description_log_event *wsrep_format_desc; +static inline void +wsrep_set_apply_format(THD* thd, Format_description_log_event* ev) +{ + if (thd->wsrep_apply_format) + { + delete (Format_description_log_event*)thd->wsrep_apply_format; + } + thd->wsrep_apply_format= ev; +} + +static inline Format_description_log_event* +wsrep_get_apply_format(THD* thd) +{ + if (thd->wsrep_apply_format) + { + return (Format_description_log_event*) thd->wsrep_apply_format; + } + return thd->wsrep_rli->relay_log.description_event_for_exec; +} static wsrep_cb_status_t wsrep_apply_events(THD* thd, const void* events_buf, @@ -98,7 +115,8 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd, { int exec_res; int error = 0; - Log_event* ev= wsrep_read_log_event(&buf, &buf_len, wsrep_format_desc); + Log_event* ev= wsrep_read_log_event(&buf, &buf_len, + wsrep_get_apply_format(thd)); if (!ev) { @@ -111,6 +129,9 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd, typ= ev->get_type_code(); switch (typ) { + case FORMAT_DESCRIPTION_EVENT: + wsrep_set_apply_format(thd, (Format_description_log_event*)ev); + continue; case WRITE_ROWS_EVENT: case UPDATE_ROWS_EVENT: case DELETE_ROWS_EVENT: @@ -339,6 +360,7 @@ wsrep_cb_status_t wsrep_commit_cb(void* const ctx, else rcode = wsrep_rollback(thd, meta->gtid.seqno); + wsrep_set_apply_format(thd, NULL); thd->mdl_context.release_transactional_locks(); free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC)); thd->tx_isolation= (enum_tx_isolation) thd->variables.tx_isolation; diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index d93c5a3a02d..a48e28b73f6 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -28,7 +28,6 @@ #include "log_event.h" #include <slave.h> -Format_description_log_event *wsrep_format_desc = NULL; wsrep_t *wsrep = NULL; my_bool wsrep_emulate_bin_log = FALSE; // activating parts of binlog interface @@ -498,7 +497,6 @@ int wsrep_init() wsrep_ready_set(FALSE); assert(wsrep_provider); - wsrep_format_desc= new Format_description_log_event(4); wsrep_init_position(); if ((rcode= wsrep_load(wsrep_provider, &wsrep, wsrep_log_cb)) != WSREP_OK) @@ -718,8 +716,6 @@ void wsrep_deinit(bool free_options) provider_version[0]= '\0'; provider_vendor[0]= '\0'; - delete wsrep_format_desc; - wsrep_format_desc= NULL; wsrep_inited= 0; if (free_options) @@ -1133,6 +1129,12 @@ int wsrep_to_buf_helper( return 1; int ret(0); + + Format_description_log_event *tmp_fd= new Format_description_log_event(4); + tmp_fd->checksum_alg= binlog_checksum_options; + tmp_fd->write(&tmp_io_cache); + delete tmp_fd; + /* if there is prepare query, add event for it */ if (thd->wsrep_TOI_pre_query) { |