summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSachin Setiya <sachin.setiya@mariadb.com>2017-05-26 15:23:15 +0530
committerSachin Setiya <sachin.setiya@mariadb.com>2017-05-26 15:23:15 +0530
commit945fb51812a9c9969d7a15e5fbf90ced9b14a23b (patch)
tree961765bee0e35c4e2859f7b17ca54e750468e94b
parent6bc9949210806a5c9630d5af17c74c8f2c54a227 (diff)
downloadmariadb-git-9544.tar.gz
MDEV-9544 FLUSH [RELAY] LOGS does not rotate logs for a named slave9544
Problem:- In the case of multisource replication/named slave when we run "FLUSH LOGS" , it does not flush logs. Solution:- A new function Master_info_index->flush_all_relay_logs() is created which will rotate relay logs for all named slave. This will be called in reload_acl_and_cache function when connection_name.length == 0
-rw-r--r--mysql-test/suite/multi_source/mdev-9544.cnf22
-rw-r--r--mysql-test/suite/multi_source/mdev-9544.result69
-rw-r--r--mysql-test/suite/multi_source/mdev-9544.test112
-rw-r--r--sql/rpl_mi.cc17
-rw-r--r--sql/rpl_mi.h1
-rw-r--r--sql/sql_reload.cc8
6 files changed, 227 insertions, 2 deletions
diff --git a/mysql-test/suite/multi_source/mdev-9544.cnf b/mysql-test/suite/multi_source/mdev-9544.cnf
new file mode 100644
index 00000000000..b43aca5370d
--- /dev/null
+++ b/mysql-test/suite/multi_source/mdev-9544.cnf
@@ -0,0 +1,22 @@
+!include my.cnf
+
+[mysqld.1]
+log-bin
+log-slave-updates
+
+[mysqld.2]
+log-bin
+log-slave-updates
+
+[mysqld.3]
+log-bin
+log-slave-updates
+
+[mysqld.4]
+server-id=4
+log-bin=server4-bin
+log-slave-updates
+
+[ENV]
+SERVER_MYPORT_4= @mysqld.4.port
+SERVER_MYSOCK_4= @mysqld.4.socket
diff --git a/mysql-test/suite/multi_source/mdev-9544.result b/mysql-test/suite/multi_source/mdev-9544.result
new file mode 100644
index 00000000000..a0b650a6db1
--- /dev/null
+++ b/mysql-test/suite/multi_source/mdev-9544.result
@@ -0,0 +1,69 @@
+create database a;
+use a;
+create table t1(a int);
+insert into t1 values(1);
+create table t2(a int);
+insert into t2 values(1);
+create database b;
+use b;
+create table t1(a int);
+insert into t1 values(1);
+create table t2(a int);
+insert into t2 values(1);
+create database c;
+use c;
+create table t1(a int);
+insert into t1 values(1);
+create table t2(a int);
+insert into t2 values(1);
+change master 'm1' to master_port=MYPORT_1 , master_host='127.0.0.1', master_user='root';
+change master 'm2' to master_port=MYPORT_2 , master_host='127.0.0.1', master_user='root';
+change master to master_port=MYPORT_3 , master_host='127.0.0.1', master_user='root';
+start all slaves;
+set default_master_connection = 'm1';
+include/wait_for_slave_to_start.inc
+set default_master_connection = 'm2';
+include/wait_for_slave_to_start.inc
+set default_master_connection = '';
+include/wait_for_slave_to_start.inc
+use a;
+show tables;
+Tables_in_a
+t1
+t2
+use b;
+show tables;
+Tables_in_b
+t1
+t2
+use c;
+show tables;
+Tables_in_c
+t1
+t2
+#TEST
+SET default_master_connection = "m1";
+SET default_master_connection = "m2";
+SET default_master_connection = "";
+flush logs;
+SET default_master_connection = "m1";
+#log Rotated
+SET default_master_connection = "m2";
+#log Rotated
+SET default_master_connection = "";
+#log Rotated
+#CleanUp
+drop database a;
+drop database b;
+drop database c;
+stop all slaves;
+Warnings:
+Note 1938 SLAVE 'm2' stopped
+Note 1938 SLAVE '' stopped
+Note 1938 SLAVE 'm1' stopped
+SET default_master_connection = "m1";
+include/wait_for_slave_to_stop.inc
+SET default_master_connection = "m2";
+include/wait_for_slave_to_stop.inc
+SET default_master_connection = "";
+include/wait_for_slave_to_stop.inc
diff --git a/mysql-test/suite/multi_source/mdev-9544.test b/mysql-test/suite/multi_source/mdev-9544.test
new file mode 100644
index 00000000000..025a86d660b
--- /dev/null
+++ b/mysql-test/suite/multi_source/mdev-9544.test
@@ -0,0 +1,112 @@
+--source include/not_embedded.inc
+--source include/have_innodb.inc
+--source include/have_debug.inc
+
+--connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1)
+--connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2)
+--connect (server_3,127.0.0.1,root,,,$SERVER_MYPORT_3)
+--connect (server_4,127.0.0.1,root,,,$SERVER_MYPORT_4)
+
+--connection server_1
+create database a;
+use a;
+create table t1(a int);
+insert into t1 values(1);
+create table t2(a int);
+insert into t2 values(1);
+--save_master_pos
+
+--connection server_2
+create database b;
+use b;
+create table t1(a int);
+insert into t1 values(1);
+create table t2(a int);
+insert into t2 values(1);
+--save_master_pos
+
+--connection server_3
+create database c;
+use c;
+create table t1(a int);
+insert into t1 values(1);
+create table t2(a int);
+insert into t2 values(1);
+--save_master_pos
+
+--connection server_4
+--disable_warnings
+--replace_result $SERVER_MYPORT_1 MYPORT_1
+eval change master 'm1' to master_port=$SERVER_MYPORT_1 , master_host='127.0.0.1', master_user='root';
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+eval change master 'm2' to master_port=$SERVER_MYPORT_2 , master_host='127.0.0.1', master_user='root';
+--replace_result $SERVER_MYPORT_3 MYPORT_3
+eval change master to master_port=$SERVER_MYPORT_3 , master_host='127.0.0.1', master_user='root';
+start all slaves;
+set default_master_connection = 'm1';
+--source include/wait_for_slave_to_start.inc
+set default_master_connection = 'm2';
+--source include/wait_for_slave_to_start.inc
+set default_master_connection = '';
+--source include/wait_for_slave_to_start.inc
+
+--enable_warnings
+--sync_with_master 0,'m1'
+--sync_with_master 0,'m2'
+--sync_with_master 0,''
+use a;
+show tables;
+use b;
+show tables;
+use c;
+show tables;
+--echo #TEST
+SET default_master_connection = "m1";
+--let $old_m1 = query_get_value("show relaylog events;", "Log_name",1)
+SET default_master_connection = "m2";
+--let $old_m2 = query_get_value("show relaylog events;", "Log_name",1)
+SET default_master_connection = "";
+--let $old__ = query_get_value("show relaylog events;", "Log_name",1)
+flush logs;
+--sleep 2
+SET default_master_connection = "m1";
+--let $new_m1 = query_get_value("show relaylog events;", "Log_name",1)
+--if ($new_m1 != $old_m1) {
+ --echo #log Rotated
+}
+SET default_master_connection = "m2";
+--let $new_m2 = query_get_value("show relaylog events;", "Log_name",1)
+--if ($new_m2 != $old_m2) {
+ --echo #log Rotated
+}
+SET default_master_connection = "";
+--let $new__ = query_get_value("show relaylog events;", "Log_name",1)
+--if ($new__ != $old__) {
+ --echo #log Rotated
+}
+
+--echo #CleanUp
+--connection server_1
+drop database a;
+--save_master_pos
+
+--connection server_2
+drop database b;
+--save_master_pos
+
+--connection server_3
+drop database c;
+--save_master_pos
+
+--connection server_4
+--sync_with_master 0,'m1'
+--sync_with_master 0,'m2'
+--sync_with_master 0,''
+stop all slaves;
+SET default_master_connection = "m1";
+--source include/wait_for_slave_to_stop.inc
+SET default_master_connection = "m2";
+--source include/wait_for_slave_to_stop.inc
+SET default_master_connection = "";
+--source include/wait_for_slave_to_stop.inc
+
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index c9dcf7b8fd7..3b32afb75bd 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -1980,4 +1980,21 @@ void prot_store_ids(THD *thd, DYNAMIC_ARRAY *ids)
return;
}
+bool Master_info_index::flush_all_relay_logs()
+{
+ for (uint i=0; i < master_info_hash.records; i++)
+ {
+ Master_info *mi;
+ mi= (Master_info *)my_hash_element(&master_info_hash, i);
+ mysql_mutex_lock(&mi->data_lock);
+ if (rotate_relay_log(mi))
+ {
+ mysql_mutex_unlock(&mi->data_lock);
+ return true;
+ }
+ mysql_mutex_unlock(&mi->data_lock);
+ }
+ return false;
+}
+
#endif /* HAVE_REPLICATION */
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index 31c0f280ac1..03ca5d00e41 100644
--- a/sql/rpl_mi.h
+++ b/sql/rpl_mi.h
@@ -354,6 +354,7 @@ public:
bool start_all_slaves(THD *thd);
bool stop_all_slaves(THD *thd);
void free_connections();
+ bool flush_all_relay_logs();
};
diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc
index 995c4c0a838..376dfeb1542 100644
--- a/sql/sql_reload.cc
+++ b/sql/sql_reload.cc
@@ -181,8 +181,12 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options,
slave is not likely to have the same connection names.
*/
tmp_write_to_binlog= 0;
-
- if (!(mi= (get_master_info(&connection_name,
+ if (connection_name.length == 0)
+ {
+ if (master_info_index->flush_all_relay_logs())
+ *write_to_binlog= -1;
+ }
+ else if (!(mi= (get_master_info(&connection_name,
Sql_condition::WARN_LEVEL_ERROR))))
{
result= 1;