Skip to content

Commit

Permalink
MDEV-20715 : Implement system variable to disallow local GTIDs in Galera
Browse files Browse the repository at this point in the history
Added a new wsrep_mode feature DISALLOW_LOCAL_GTID for this.
Nodes can have GTIDs for local transactions in the following scenarios:

A DDL statement is executed with wsrep_OSU_method=RSU set.
A DML statement writes to a non-InnoDB table.
A DML statement writes to an InnoDB table with wsrep_on=OFF set.

If user has set wsrep_mode=DISALLOW_LOCAL_GTID these operations
produce a error ERROR HY000: Galera replication not supported
  • Loading branch information
Jan Lindström committed Mar 1, 2021
1 parent b47304e commit ebb2db5
Show file tree
Hide file tree
Showing 12 changed files with 429 additions and 11 deletions.
99 changes: 99 additions & 0 deletions mysql-test/suite/galera/r/galera_disallow_local_gtid.result
@@ -0,0 +1,99 @@
connection node_2;
connection node_1;
call mtr.add_suppression("WSREP: ALTER TABLE isolation failure");
connection node_1;
CREATE TABLE tab(a int not null primary key) engine=InnoDB;
CREATE TABLE tab1(a int not null primary key) engine=MyISAM;
CREATE TABLE tab2(a int not null primary key) engine=Aria;
CREATE TABLE tab3(a int not null primary key) engine=MEMORY;
SET GLOBAL wsrep_mode = DISALLOW_LOCAL_GTID;
SET SESSION wsrep_OSU_method='RSU';
ALTER TABLE tab FORCE;
ERROR HY000: Galera replication not supported
SET SESSiON sql_log_bin=0;
ALTER TABLE tab FORCE;
SET SESSION wsrep_OSU_method='TOI';
SET SESSION sql_log_bin=1;
SET SESSION wsrep_on=OFF;
INSERT INTO tab VALUES (1);
ERROR HY000: Galera replication not supported
SET SESSiON sql_log_bin=0;
INSERT INTO tab VALUES (1);
SET SESSiON sql_log_bin=1;
SET SESSION wsrep_on=ON;
INSERT INTO tab VALUES (2);
SELECT * FROM tab;
a
1
2
connection node_2;
SELECT * FROM tab;
a
2
connection node_1;
INSERT INTO tab1 VALUES(1);
ERROR HY000: Galera replication not supported
INSERT INTO tab2 VALUES(1);
ERROR HY000: Galera replication not supported
INSERT INTO tab3 VALUES(1);
ERROR HY000: Galera replication not supported
SET GLOBAL wsrep_mode = "DISALLOW_LOCAL_GTID,REPLICATE_MYISAM,REPLICATE_ARIA";
INSERT INTO tab1 VALUES(2);
INSERT INTO tab2 VALUES(2);
INSERT INTO tab3 VALUES(2);
ERROR HY000: Galera replication not supported
SET SESSiON sql_log_bin=0;
INSERT INTO tab1 VALUES(3);
INSERT INTO tab2 VALUES(3);
INSERT INTO tab3 VALUES(3);
SET SESSION sql_log_bin=1;
SET SESSION wsrep_on=OFF;
INSERT INTO tab1 VALUES(4);
ERROR HY000: Galera replication not supported
INSERT INTO tab2 VALUES(4);
ERROR HY000: Galera replication not supported
INSERT INTO tab3 VALUES(4);
ERROR HY000: Galera replication not supported
SET SESSiON sql_log_bin=0;
INSERT INTO tab1 VALUES(5);
INSERT INTO tab2 VALUES(5);
INSERT INTO tab3 VALUES(5);
SET SESSION wsrep_on=ON;
INSERT INTO tab1 VALUES(6);
INSERT INTO tab2 VALUES(6);
INSERT INTO tab3 VALUES(6);
SELECT * FROM tab1;
a
2
3
5
6
SELECT * FROM tab2;
a
2
3
5
6
SELECT * FROM tab3;
a
3
5
6
connection node_2;
SELECT * FROM tab1;
a
2
3
6
SELECT * FROM tab2;
a
2
3
6
SELECT * FROM tab3;
a
connection node_1;
DROP TABLE tab;
DROP TABLE tab1;
DROP TABLE tab2;
DROP TABLE tab3;
79 changes: 79 additions & 0 deletions mysql-test/suite/galera/r/galera_var_wsrep_mode.result
@@ -0,0 +1,79 @@
connection node_2;
connection node_1;
SELECT @@wsrep_mode;
@@wsrep_mode

SET GLOBAL wsrep_mode=DEFAULT;
SELECT @@wsrep_mode;
@@wsrep_mode

SET SESSION wsrep_mode=DEFAULT;
ERROR HY000: Variable 'wsrep_mode' is a GLOBAL variable and should be set with SET GLOBAL
SELECT @@global.wsrep_mode;
@@global.wsrep_mode

SELECT @@session.wsrep_mode;
ERROR HY000: Variable 'wsrep_mode' is a GLOBAL variable
SET GLOBAL wsrep_mode=A;
ERROR 42000: Variable 'wsrep_mode' can't be set to the value of 'A'
SET GLOBAL wsrep_mode='A';
ERROR 42000: Variable 'wsrep_mode' can't be set to the value of 'A'
SET GLOBAL wsrep_mode=NULL;
ERROR 42000: Variable 'wsrep_mode' can't be set to the value of 'NULL'
SET GLOBAL wsrep_mode=64;
ERROR 42000: Variable 'wsrep_mode' can't be set to the value of '64'
SET GLOBAL wsrep_mode=REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
SET GLOBAL wsrep_mode=1;
SELECT @@wsrep_mode;
@@wsrep_mode
STRICT_REPLICATION
SET GLOBAL wsrep_mode=32;
SELECT @@wsrep_mode;
@@wsrep_mode
DISALLOW_LOCAL_GTID
SET GLOBAL wsrep_mode='';
SELECT @@wsrep_mode;
@@wsrep_mode

SET GLOBAL wsrep_mode=STRICT_REPLICATION;
SELECT @@wsrep_mode;
@@wsrep_mode
STRICT_REPLICATION
SET GLOBAL wsrep_mode=BINLOG_ROW_FORMAT_ONLY;
SELECT @@wsrep_mode;
@@wsrep_mode
BINLOG_ROW_FORMAT_ONLY
SET GLOBAL wsrep_mode=REQUIRED_PRIMARY_KEY;
SELECT @@wsrep_mode;
@@wsrep_mode
REQUIRED_PRIMARY_KEY
SET GLOBAL wsrep_mode=REPLICATE_MYISAM;
SELECT @@wsrep_mode;
@@wsrep_mode
REPLICATE_MYISAM
SET GLOBAL wsrep_mode=REPLICATE_ARIA;
SELECT @@wsrep_mode;
@@wsrep_mode
REPLICATE_ARIA
SET GLOBAL wsrep_mode=DISALLOW_LOCAL_GTID;
SELECT @@wsrep_mode;
@@wsrep_mode
DISALLOW_LOCAL_GTID
SET GLOBAL wsrep_mode='STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY';
SELECT @@wsrep_mode;
@@wsrep_mode
STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY
SET GLOBAL wsrep_mode='STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY,REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM,REPLICATE_ARIA,DISALLOW_LOCAL_GTID';
SELECT @@wsrep_mode;
@@wsrep_mode
STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY,REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM,REPLICATE_ARIA,DISALLOW_LOCAL_GTID
SET GLOBAL wsrep_mode='BINLOG_ROW_FORMAT_ONLY,STRICT_REPLICATION';
SELECT @@wsrep_mode;
@@wsrep_mode
STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY
SET GLOBAL wsrep_mode='STRICT_REPLICATION,REQUIRED_PRIMARY_KEY,REPLICATE_ARIA,DISALLOW_LOCAL_GTID';
SELECT @@wsrep_mode;
@@wsrep_mode
STRICT_REPLICATION,REQUIRED_PRIMARY_KEY,REPLICATE_ARIA,DISALLOW_LOCAL_GTID
SET GLOBAL wsrep_mode=DEFAULT;
104 changes: 104 additions & 0 deletions mysql-test/suite/galera/t/galera_disallow_local_gtid.test
@@ -0,0 +1,104 @@
--source include/galera_cluster.inc
--source include/have_aria.inc
#
# Nodes can have GTIDs for local transactions in the following scenarios:
#
# A DDL statement is executed with wsrep_OSU_method=RSU set.
# A DML statement writes to a non-InnoDB table.
# A DML statement writes to an InnoDB table with wsrep_on=OFF set.
#
call mtr.add_suppression("WSREP: ALTER TABLE isolation failure");
#
# A DDL statement is executed with wsrep_OSU_method=RSU set.
#
--connection node_1
CREATE TABLE tab(a int not null primary key) engine=InnoDB;
CREATE TABLE tab1(a int not null primary key) engine=MyISAM;
CREATE TABLE tab2(a int not null primary key) engine=Aria;
CREATE TABLE tab3(a int not null primary key) engine=MEMORY;

SET GLOBAL wsrep_mode = DISALLOW_LOCAL_GTID;
SET SESSION wsrep_OSU_method='RSU';

--error ER_GALERA_REPLICATION_NOT_SUPPORTED
ALTER TABLE tab FORCE;

SET SESSiON sql_log_bin=0;
ALTER TABLE tab FORCE;
SET SESSION wsrep_OSU_method='TOI';
#
# A DML statement writes to an InnoDB table with wsrep_on=OFF set.
#
SET SESSION sql_log_bin=1;
SET SESSION wsrep_on=OFF;
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab VALUES (1);
SET SESSiON sql_log_bin=0;
INSERT INTO tab VALUES (1);
SET SESSiON sql_log_bin=1;
SET SESSION wsrep_on=ON;
INSERT INTO tab VALUES (2);

SELECT * FROM tab;
--connection node_2
SELECT * FROM tab;
#
# A DML statement writes to a non-InnoDB table.
#
--connection node_1
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab1 VALUES(1);
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab2 VALUES(1);
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab3 VALUES(1);
#
# Set MyISAM and Aria replication on using TOI
#
SET GLOBAL wsrep_mode = "DISALLOW_LOCAL_GTID,REPLICATE_MYISAM,REPLICATE_ARIA";
INSERT INTO tab1 VALUES(2);
INSERT INTO tab2 VALUES(2);
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab3 VALUES(2);
SET SESSiON sql_log_bin=0;
INSERT INTO tab1 VALUES(3);
INSERT INTO tab2 VALUES(3);
INSERT INTO tab3 VALUES(3);
SET SESSION sql_log_bin=1;
SET SESSION wsrep_on=OFF;
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab1 VALUES(4);
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab2 VALUES(4);
--error ER_GALERA_REPLICATION_NOT_SUPPORTED
INSERT INTO tab3 VALUES(4);
SET SESSiON sql_log_bin=0;
INSERT INTO tab1 VALUES(5);
INSERT INTO tab2 VALUES(5);
INSERT INTO tab3 VALUES(5);
SET SESSION wsrep_on=ON;
INSERT INTO tab1 VALUES(6);
INSERT INTO tab2 VALUES(6);
INSERT INTO tab3 VALUES(6);

SELECT * FROM tab1;
SELECT * FROM tab2;
SELECT * FROM tab3;

--connection node_2
SELECT * FROM tab1;
SELECT * FROM tab2;
SELECT * FROM tab3;

--connection node_1
--disable_query_log
SET SESSION sql_log_bin=DEFAULT;
SET GLOBAL wsrep_mode=DEFAULT;
set GLOBAL wsrep_OSU_method=DEFAULT;
--enable_query_log

DROP TABLE tab;
DROP TABLE tab1;
DROP TABLE tab2;
DROP TABLE tab3;

65 changes: 65 additions & 0 deletions mysql-test/suite/galera/t/galera_var_wsrep_mode.test
@@ -0,0 +1,65 @@
--source include/galera_cluster.inc

# default
SELECT @@wsrep_mode;

SET GLOBAL wsrep_mode=DEFAULT;
SELECT @@wsrep_mode;

--error ER_GLOBAL_VARIABLE
SET SESSION wsrep_mode=DEFAULT;
SELECT @@global.wsrep_mode;
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT @@session.wsrep_mode;

#
# Incorrect input
#
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL wsrep_mode=A;
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL wsrep_mode='A';
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL wsrep_mode=NULL;
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL wsrep_mode=64;
--error ER_PARSE_ERROR
SET GLOBAL wsrep_mode=REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM;
#
# Correct input
#
SET GLOBAL wsrep_mode=1;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=32;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode='';
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=STRICT_REPLICATION;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=BINLOG_ROW_FORMAT_ONLY;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=REQUIRED_PRIMARY_KEY;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=REPLICATE_MYISAM;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=REPLICATE_ARIA;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode=DISALLOW_LOCAL_GTID;
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode='STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY';
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode='STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY,REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM,REPLICATE_ARIA,DISALLOW_LOCAL_GTID';
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode='BINLOG_ROW_FORMAT_ONLY,STRICT_REPLICATION';
SELECT @@wsrep_mode;
SET GLOBAL wsrep_mode='STRICT_REPLICATION,REQUIRED_PRIMARY_KEY,REPLICATE_ARIA,DISALLOW_LOCAL_GTID';
SELECT @@wsrep_mode;

# reset
SET GLOBAL wsrep_mode=DEFAULT;






2 changes: 1 addition & 1 deletion mysql-test/suite/sys_vars/r/sysvars_wsrep.result
Expand Up @@ -342,7 +342,7 @@ VARIABLE_COMMENT Set of WSREP features that are enabled.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY,REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM,REPLICATE_ARIA
ENUM_VALUE_LIST STRICT_REPLICATION,BINLOG_ROW_FORMAT_ONLY,REQUIRED_PRIMARY_KEY,REPLICATE_MYISAM,REPLICATE_ARIA,DISALLOW_LOCAL_GTID
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
GLOBAL_VALUE_PATH NULL
Expand Down

0 comments on commit ebb2db5

Please sign in to comment.