summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2022-01-20 11:30:49 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2022-01-20 11:53:41 +0200
commita0f711e928178b90523f62983ce0ee52d21a5824 (patch)
tree90ae4b7a91b7a657ec78f3866e47f46d0f799c27
parent66465914c1a22ae30f96a57aca7e8635a2506f8d (diff)
downloadmariadb-git-bb-10.5-MDEV-26223.tar.gz
MDEV-26223 Galera cluster node consider old server_id value even after modification of server_id [wsrep_gtid_mode=ON]bb-10.5-MDEV-26223
For non bootstrap node server id should be ignored because using custom value can lead to inconsistency problem with replicated GTID in cluster. Providing warning message when this happens. Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
-rw-r--r--mysql-test/suite/galera/r/galera_gtid_server_id.result82
-rw-r--r--mysql-test/suite/galera/t/galera_gtid_server_id.cnf16
-rw-r--r--mysql-test/suite/galera/t/galera_gtid_server_id.test27
-rw-r--r--sql/sys_vars.cc17
-rw-r--r--sql/wsrep_mysqld.cc8
5 files changed, 148 insertions, 2 deletions
diff --git a/mysql-test/suite/galera/r/galera_gtid_server_id.result b/mysql-test/suite/galera/r/galera_gtid_server_id.result
new file mode 100644
index 00000000000..815e7e98885
--- /dev/null
+++ b/mysql-test/suite/galera/r/galera_gtid_server_id.result
@@ -0,0 +1,82 @@
+connection node_2;
+connection node_1;
+connection node_1;
+select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
+@@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode
+0 11 1 1
+connection node_2;
+select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
+@@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode
+0 12 1 1
+connection node_1;
+CREATE TABLE t1(id int not null primary key) engine=innodb;
+INSERT INTO t1 values (1);
+show global variables like '%gtid%';
+Variable_name Value
+gtid_binlog_pos 1-11-2
+gtid_binlog_state 1-11-2
+gtid_cleanup_batch_size 64
+gtid_current_pos 1-11-2
+gtid_domain_id 0
+gtid_ignore_duplicates OFF
+gtid_pos_auto_engines
+gtid_slave_pos
+gtid_strict_mode OFF
+wsrep_gtid_domain_id 1
+wsrep_gtid_mode ON
+connection node_2;
+SET SESSION wsrep_sync_wait=15;
+show global variables like '%gtid%';
+Variable_name Value
+gtid_binlog_pos 1-11-2
+gtid_binlog_state 1-11-2
+gtid_cleanup_batch_size 64
+gtid_current_pos
+gtid_domain_id 0
+gtid_ignore_duplicates OFF
+gtid_pos_auto_engines
+gtid_slave_pos
+gtid_strict_mode OFF
+wsrep_gtid_domain_id 1
+wsrep_gtid_mode ON
+SET GLOBAL server_id=200;
+ERROR 42000: Variable 'server_id' can't be set to the value of '200'
+SHOW WARNINGS;
+Level Code Message
+Warning 1231 Can't change server_id because wsrep and wsrep_gtid_mode is set. You can set server_id only with wsrep_new_cluster.
+Error 1231 Variable 'server_id' can't be set to the value of '200'
+SET SESSION server_id=200;
+ERROR 42000: Variable 'server_id' can't be set to the value of '200'
+SHOW WARNINGS;
+Level Code Message
+Warning 1231 Can't change server_id because wsrep and wsrep_gtid_mode is set. You can set server_id only with wsrep_new_cluster.
+Error 1231 Variable 'server_id' can't be set to the value of '200'
+INSERT INTO t1 values(2);
+show global variables like '%gtid%';
+Variable_name Value
+gtid_binlog_pos 1-11-3
+gtid_binlog_state 1-11-3
+gtid_cleanup_batch_size 64
+gtid_current_pos
+gtid_domain_id 0
+gtid_ignore_duplicates OFF
+gtid_pos_auto_engines
+gtid_slave_pos
+gtid_strict_mode OFF
+wsrep_gtid_domain_id 1
+wsrep_gtid_mode ON
+connection node_1;
+show global variables like '%gtid%';
+Variable_name Value
+gtid_binlog_pos 1-11-3
+gtid_binlog_state 1-11-3
+gtid_cleanup_batch_size 64
+gtid_current_pos 1-11-3
+gtid_domain_id 0
+gtid_ignore_duplicates OFF
+gtid_pos_auto_engines
+gtid_slave_pos
+gtid_strict_mode OFF
+wsrep_gtid_domain_id 1
+wsrep_gtid_mode ON
+DROP TABLE t1;
diff --git a/mysql-test/suite/galera/t/galera_gtid_server_id.cnf b/mysql-test/suite/galera/t/galera_gtid_server_id.cnf
new file mode 100644
index 00000000000..bda7a00ab2e
--- /dev/null
+++ b/mysql-test/suite/galera/t/galera_gtid_server_id.cnf
@@ -0,0 +1,16 @@
+!include ../galera_2nodes.cnf
+
+[mysqld.1]
+wsrep_gtid_domain_id=1
+wsrep_gtid_mode=ON
+server-id=11
+log_slave_updates
+log_bin
+
+[mysqld.2]
+wsrep_gtid_domain_id=1
+wsrep_gtid_mode=ON
+server-id=12
+log_slave_updates
+log_bin
+
diff --git a/mysql-test/suite/galera/t/galera_gtid_server_id.test b/mysql-test/suite/galera/t/galera_gtid_server_id.test
new file mode 100644
index 00000000000..6e1d6b93a01
--- /dev/null
+++ b/mysql-test/suite/galera/t/galera_gtid_server_id.test
@@ -0,0 +1,27 @@
+--source include/galera_cluster.inc
+
+--connection node_1
+select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
+--connection node_2
+select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
+
+--connection node_1
+CREATE TABLE t1(id int not null primary key) engine=innodb;
+INSERT INTO t1 values (1);
+show global variables like '%gtid%';
+--connection node_2
+SET SESSION wsrep_sync_wait=15;
+show global variables like '%gtid%';
+# This should give error
+--error ER_WRONG_VALUE_FOR_VAR
+SET GLOBAL server_id=200;
+SHOW WARNINGS;
+# This should give error
+--error ER_WRONG_VALUE_FOR_VAR
+SET SESSION server_id=200;
+SHOW WARNINGS;
+INSERT INTO t1 values(2);
+show global variables like '%gtid%';
+--connection node_1
+show global variables like '%gtid%';
+DROP TABLE t1;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 1eb0b656d44..095bee0ca05 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -3223,6 +3223,21 @@ static Sys_var_charptr_fscs Sys_secure_file_priv(
PREALLOCATED READ_ONLY GLOBAL_VAR(opt_secure_file_priv),
CMD_LINE(REQUIRED_ARG), DEFAULT(0));
+static bool check_server_id(sys_var *self, THD *thd, set_var *var)
+{
+#ifdef WITH_WSREP
+ if (WSREP_ON && WSREP_PROVIDER_EXISTS && !wsrep_new_cluster && wsrep_gtid_mode)
+ {
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_WRONG_VALUE_FOR_VAR,
+ "Can't change server_id because wsrep and wsrep_gtid_mode is set."
+ " You can set server_id only with wsrep_new_cluster. ");
+ return true;
+ }
+#endif /* WITH_WSREP */
+ return false;
+}
+
static bool fix_server_id(sys_var *self, THD *thd, enum_var_type type)
{
if (type == OPT_GLOBAL)
@@ -3247,7 +3262,7 @@ Sys_server_id(
"replication partners",
SESSION_VAR(server_id), CMD_LINE(REQUIRED_ARG, OPT_SERVER_ID),
VALID_RANGE(1, UINT_MAX32), DEFAULT(1), BLOCK_SIZE(1), NO_MUTEX_GUARD,
- NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_server_id));
+ NOT_IN_BINLOG, ON_CHECK(check_server_id), ON_UPDATE(fix_server_id));
static Sys_var_on_access_global<Sys_var_mybool,
PRIV_SET_SYSTEM_GLOBAL_VAR_SLAVE_COMPRESSED_PROTOCOL>
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index 31265a8b689..6970164ae3c 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -802,7 +802,6 @@ int wsrep_init_server()
void wsrep_init_globals()
{
- wsrep_gtid_server.domain_id= wsrep_gtid_domain_id;
wsrep_init_sidno(Wsrep_server_state::instance().connected_gtid().id());
/* Recover last written wsrep gtid */
wsrep_init_gtid();
@@ -817,6 +816,13 @@ void wsrep_init_globals()
wsrep_get_binlog_gtid_seqno(new_gtid);
wsrep_gtid_server.gtid(new_gtid);
}
+ else
+ {
+ if (wsrep_gtid_mode && wsrep_gtid_server.server_id != global_system_variables.server_id)
+ {
+ WSREP_WARN("Ignoring server id for non bootstrap node.");
+ }
+ }
wsrep_init_schema();
if (WSREP_ON)
{