summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2019-12-04 11:46:37 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2019-12-04 11:46:37 +0200
commitc9b9eb331570704d020fcc7c7894f19febe7f26d (patch)
tree29e327054ebcc43af4fdb754ac5e8e67cf5c51b2
parentf7d35ffc7691bbbf65101fb1a496e441a2b00a83 (diff)
downloadmariadb-git-c9b9eb331570704d020fcc7c7894f19febe7f26d.tar.gz
MDEV-18497 : CTAS async replication from mariadb master crashes galera nodes (#1410)
In MariaDB 10.2 master could have been configured so that there is extra annotate events. When we peak next event type for CTAS we need to skip annotate events.
-rw-r--r--mysql-test/suite/galera/r/galera_as_slave_ctas.result14
-rw-r--r--sql/slave.cc24
2 files changed, 29 insertions, 9 deletions
diff --git a/mysql-test/suite/galera/r/galera_as_slave_ctas.result b/mysql-test/suite/galera/r/galera_as_slave_ctas.result
index 79114824008..13cbbc905e3 100644
--- a/mysql-test/suite/galera/r/galera_as_slave_ctas.result
+++ b/mysql-test/suite/galera/r/galera_as_slave_ctas.result
@@ -1,14 +1,28 @@
+connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
+connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
+connection node_2;
START SLAVE;
+connection node_1;
SHOW VARIABLES LIKE 'binlog_format';
Variable_name Value
binlog_format ROW
+connection node_1;
CREATE TABLE source (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE target AS SELECT * FROM source;
+connection node_2;
+connection node_3;
+connection node_1;
DROP TABLE target;
INSERT INTO source VALUES(1);
CREATE TABLE target AS SELECT * FROM source;
+connection node_2;
+connection node_3;
+connection node_1;
DROP TABLE source;
DROP TABLE target;
+connection node_3;
+connection node_2;
STOP SLAVE;
RESET SLAVE ALL;
+connection node_1;
RESET MASTER;
diff --git a/sql/slave.cc b/sql/slave.cc
index 17abf8d53f3..83edc52c3fd 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -7397,24 +7397,30 @@ err:
#ifdef WITH_WSREP
enum Log_event_type wsrep_peak_event(rpl_group_info *rgi, ulonglong* event_size)
{
+ enum Log_event_type ev_type;
+
mysql_mutex_lock(&rgi->rli->data_lock);
unsigned long long event_pos= rgi->event_relay_log_pos;
+ unsigned long long orig_future_pos= rgi->future_event_relay_log_pos;
unsigned long long future_pos= rgi->future_event_relay_log_pos;
- /* scan the log to read next event */
- my_b_seek(rgi->rli->cur_log, future_pos);
- rgi->rli->event_relay_log_pos= future_pos;
- rgi->event_relay_log_pos= future_pos;
-
- Log_event* ev = next_event(rgi, event_size);
- enum Log_event_type ev_type= (ev) ? ev->get_type_code() : UNKNOWN_EVENT;
- delete ev;
+ /* scan the log to read next event and we skip
+ annotate events. */
+ do {
+ my_b_seek(rgi->rli->cur_log, future_pos);
+ rgi->rli->event_relay_log_pos= future_pos;
+ rgi->event_relay_log_pos= future_pos;
+ Log_event* ev= next_event(rgi, event_size);
+ ev_type= (ev) ? ev->get_type_code() : UNKNOWN_EVENT;
+ delete ev;
+ future_pos+= *event_size;
+ } while (ev_type == ANNOTATE_ROWS_EVENT);
/* scan the log back and re-set the positions to original values */
rgi->rli->event_relay_log_pos= event_pos;
rgi->event_relay_log_pos= event_pos;
- my_b_seek(rgi->rli->cur_log, future_pos);
+ my_b_seek(rgi->rli->cur_log, orig_future_pos);
mysql_mutex_unlock(&rgi->rli->data_lock);