MDEV-6594: Use separate domain_id for Galera transactions
This commit is contained in:
parent
0f8cb3c399
commit
34d86ac9ff
11
mysql-test/suite/galera/include/print_gtid.inc
Normal file
11
mysql-test/suite/galera/include/print_gtid.inc
Normal file
@ -0,0 +1,11 @@
|
||||
--echo list of GTID variables :
|
||||
--disable_query_log
|
||||
query_vertical
|
||||
SELECT @@global.gtid_domain_id AS gtid_domain_id,
|
||||
@@global.gtid_binlog_pos AS gtid_binlog_pos,
|
||||
@@global.gtid_binlog_state AS gtid_binlog_state,
|
||||
@@global.gtid_current_pos AS gtid_current_pos,
|
||||
@@global.gtid_slave_pos AS gtid_slave_pos,
|
||||
@@global.wsrep_gtid_domain_id AS wsrep_gtid_domain_id,
|
||||
@@global.wsrep_gtid_mode AS wsrep_gtid_mode;
|
||||
--enable_query_log
|
74
mysql-test/suite/galera/r/galera_var_gtid_domain_id.result
Normal file
74
mysql-test/suite/galera/r/galera_var_gtid_domain_id.result
Normal file
@ -0,0 +1,74 @@
|
||||
# On node_1
|
||||
list of GTID variables :
|
||||
gtid_domain_id 1
|
||||
gtid_binlog_pos
|
||||
gtid_binlog_state
|
||||
gtid_current_pos
|
||||
gtid_slave_pos
|
||||
wsrep_gtid_domain_id 9999
|
||||
wsrep_gtid_mode 1
|
||||
# On node_2
|
||||
list of GTID variables :
|
||||
gtid_domain_id 2
|
||||
gtid_binlog_pos
|
||||
gtid_binlog_state
|
||||
gtid_current_pos
|
||||
gtid_slave_pos
|
||||
wsrep_gtid_domain_id 9999
|
||||
wsrep_gtid_mode 1
|
||||
# On node_1
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
CREATE TABLE t2(i INT) ENGINE=MEMORY;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
1
|
||||
SELECT * FROM t2;
|
||||
i
|
||||
list of GTID variables :
|
||||
gtid_domain_id 1
|
||||
gtid_binlog_pos 9999-1-3
|
||||
gtid_binlog_state 9999-1-3
|
||||
gtid_current_pos 9999-1-3
|
||||
gtid_slave_pos
|
||||
wsrep_gtid_domain_id 9999
|
||||
wsrep_gtid_mode 1
|
||||
# On node_2
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
1
|
||||
list of GTID variables :
|
||||
gtid_domain_id 2
|
||||
gtid_binlog_pos 9999-1-3
|
||||
gtid_binlog_state 9999-1-3
|
||||
gtid_current_pos
|
||||
gtid_slave_pos
|
||||
wsrep_gtid_domain_id 9999
|
||||
wsrep_gtid_mode 1
|
||||
# On node_1
|
||||
INSERT INTO t2 VALUES(1);
|
||||
SELECT * FROM t2;
|
||||
i
|
||||
1
|
||||
list of GTID variables :
|
||||
gtid_domain_id 1
|
||||
gtid_binlog_pos 1-1-1,9999-1-3
|
||||
gtid_binlog_state 1-1-1,9999-1-3
|
||||
gtid_current_pos 1-1-1,9999-1-3
|
||||
gtid_slave_pos
|
||||
wsrep_gtid_domain_id 9999
|
||||
wsrep_gtid_mode 1
|
||||
# On node_2
|
||||
SELECT * FROM t2;
|
||||
i
|
||||
list of GTID variables :
|
||||
gtid_domain_id 2
|
||||
gtid_binlog_pos 9999-1-3
|
||||
gtid_binlog_state 9999-1-3
|
||||
gtid_current_pos
|
||||
gtid_slave_pos
|
||||
wsrep_gtid_domain_id 9999
|
||||
wsrep_gtid_mode 1
|
||||
# On node_1
|
||||
DROP TABLE t1, t2;
|
||||
# End of test
|
16
mysql-test/suite/galera/t/galera_var_gtid_domain_id.cnf
Normal file
16
mysql-test/suite/galera/t/galera_var_gtid_domain_id.cnf
Normal file
@ -0,0 +1,16 @@
|
||||
!include ../galera_2nodes.cnf
|
||||
|
||||
[mysqld]
|
||||
log-bin
|
||||
log-slave-updates
|
||||
|
||||
[mysqld.1]
|
||||
gtid_domain_id=1
|
||||
wsrep_gtid_mode=ON
|
||||
wsrep_gtid_domain_id=9999
|
||||
|
||||
[mysqld.2]
|
||||
gtid_domain_id=2
|
||||
wsrep_gtid_mode=ON
|
||||
#wsrep_gitd_domain_id value will be inherited from donor node (mysqld.1)
|
||||
#wsrep_gitd_domain_id=X
|
53
mysql-test/suite/galera/t/galera_var_gtid_domain_id.test
Normal file
53
mysql-test/suite/galera/t/galera_var_gtid_domain_id.test
Normal file
@ -0,0 +1,53 @@
|
||||
# Test for @@wsrep_gtid_mode and @@wsrep_gtid_domain_id variables
|
||||
#
|
||||
# When @@wsrep_gtid_mode=ON, all DDL/DML commands and transactions that
|
||||
# are meant to be replicated over Galera cluster nodes are tagged with
|
||||
# galera gtid_domain_id (@@wsrep_gtid_domain_id), while others are tagged
|
||||
# with the local domain_id (@@gtid_domain_id).
|
||||
|
||||
--source include/galera_cluster.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
# print initial GTIDs
|
||||
source include/print_gtid.inc;
|
||||
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
# print initial GTIDs
|
||||
source include/print_gtid.inc;
|
||||
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
CREATE TABLE t2(i INT) ENGINE=MEMORY;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
source include/print_gtid.inc;
|
||||
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
SELECT * FROM t1;
|
||||
source include/print_gtid.inc;
|
||||
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
INSERT INTO t2 VALUES(1);
|
||||
SELECT * FROM t2;
|
||||
source include/print_gtid.inc;
|
||||
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
SELECT * FROM t2;
|
||||
source include/print_gtid.inc;
|
||||
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
# Cleanup
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--source include/galera_end.inc
|
||||
--echo # End of test
|
||||
|
@ -183,6 +183,34 @@ NUMERIC_BLOCK_SIZE NULL
|
||||
ENUM_VALUE_LIST MIXED,STATEMENT,ROW,NONE
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT REQUIRED
|
||||
VARIABLE_NAME WSREP_GTID_DOMAIN_ID
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE 0
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 0
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE INT UNSIGNED
|
||||
VARIABLE_COMMENT When wsrep_gtid_mode is set, this value is used as gtid_domain_id for galera transactions and also copied to the joiner nodes during state transfer. It is ignored, otherwise.
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 4294967295
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT REQUIRED
|
||||
VARIABLE_NAME WSREP_GTID_MODE
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE OFF
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE OFF
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE BOOLEAN
|
||||
VARIABLE_COMMENT Automatically update the (joiner) node's wsrep_gtid_domain_id value with that of donor's (received during state transfer) and use it in place of gtid_domain_id for all galera transactions. When OFF (default), wsrep_gtid_domain_id is simply ignored (backward compatibility).
|
||||
NUMERIC_MIN_VALUE NULL
|
||||
NUMERIC_MAX_VALUE NULL
|
||||
NUMERIC_BLOCK_SIZE NULL
|
||||
ENUM_VALUE_LIST OFF,ON
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT OPTIONAL
|
||||
VARIABLE_NAME WSREP_LOAD_DATA_SPLITTING
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE ON
|
||||
|
@ -0,0 +1,47 @@
|
||||
#
|
||||
# wsrep_gtid_domain_id
|
||||
#
|
||||
# save the initial value
|
||||
SET @wsrep_gtid_domain_id_global_saved = @@global.wsrep_gtid_domain_id;
|
||||
# default
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
@@global.wsrep_gtid_domain_id
|
||||
0
|
||||
|
||||
# scope
|
||||
SELECT @@session.wsrep_gtid_domain_id;
|
||||
ERROR HY000: Variable 'wsrep_gtid_domain_id' is a GLOBAL variable
|
||||
SET @@global.wsrep_gtid_domain_id=1;
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
@@global.wsrep_gtid_domain_id
|
||||
1
|
||||
|
||||
# valid values
|
||||
SET @@global.wsrep_gtid_domain_id=10;
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
@@global.wsrep_gtid_domain_id
|
||||
10
|
||||
SET @@global.wsrep_gtid_domain_id=0;
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
@@global.wsrep_gtid_domain_id
|
||||
0
|
||||
SET @@global.wsrep_gtid_domain_id=default;
|
||||
SELECT @global.wsrep_gtid_domain_id;
|
||||
@global.wsrep_gtid_domain_id
|
||||
NULL
|
||||
|
||||
# invalid values
|
||||
SET @@global.wsrep_gtid_domain_id=NULL;
|
||||
ERROR 42000: Incorrect argument type to variable 'wsrep_gtid_domain_id'
|
||||
SET @@global.wsrep_gtid_domain_id='junk';
|
||||
ERROR 42000: Incorrect argument type to variable 'wsrep_gtid_domain_id'
|
||||
SET @@global.wsrep_gtid_domain_id=-1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect wsrep_gtid_domain_id value: '-1'
|
||||
SELECT @global.wsrep_gtid_domain_id;
|
||||
@global.wsrep_gtid_domain_id
|
||||
NULL
|
||||
|
||||
# restore the initial value
|
||||
SET @@global.wsrep_gtid_domain_id = @wsrep_gtid_domain_id_global_saved;
|
||||
# End of test
|
31
mysql-test/suite/sys_vars/r/wsrep_gtid_mode_basic.result
Normal file
31
mysql-test/suite/sys_vars/r/wsrep_gtid_mode_basic.result
Normal file
@ -0,0 +1,31 @@
|
||||
#
|
||||
# wsrep_gtid_mode
|
||||
#
|
||||
# save the initial value
|
||||
SET @wsrep_gtid_mode_global_saved = @@global.wsrep_gtid_mode;
|
||||
# default
|
||||
SELECT @@global.wsrep_gtid_mode;
|
||||
@@global.wsrep_gtid_mode
|
||||
0
|
||||
SELECT @@session.wsrep_gtid_mode;
|
||||
ERROR HY000: Variable 'wsrep_gtid_mode' is a GLOBAL variable
|
||||
|
||||
# scope and valid values
|
||||
SET @@global.wsrep_gtid_mode=OFF;
|
||||
SELECT @@global.wsrep_gtid_mode;
|
||||
@@global.wsrep_gtid_mode
|
||||
0
|
||||
SET @@global.wsrep_gtid_mode=ON;
|
||||
SELECT @@global.wsrep_gtid_mode;
|
||||
@@global.wsrep_gtid_mode
|
||||
1
|
||||
|
||||
# invalid values
|
||||
SET @@global.wsrep_gtid_mode=NULL;
|
||||
ERROR 42000: Variable 'wsrep_gtid_mode' can't be set to the value of 'NULL'
|
||||
SET @@global.wsrep_gtid_mode='junk';
|
||||
ERROR 42000: Variable 'wsrep_gtid_mode' can't be set to the value of 'junk'
|
||||
|
||||
# restore the initial value
|
||||
SET @@global.wsrep_gtid_mode = @wsrep_gtid_mode_global_saved;
|
||||
# End of test
|
43
mysql-test/suite/sys_vars/t/wsrep_gtid_domain_id_basic.test
Normal file
43
mysql-test/suite/sys_vars/t/wsrep_gtid_domain_id_basic.test
Normal file
@ -0,0 +1,43 @@
|
||||
--source include/have_wsrep.inc
|
||||
|
||||
--echo #
|
||||
--echo # wsrep_gtid_domain_id
|
||||
--echo #
|
||||
|
||||
--echo # save the initial value
|
||||
SET @wsrep_gtid_domain_id_global_saved = @@global.wsrep_gtid_domain_id;
|
||||
|
||||
--echo # default
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
|
||||
--echo
|
||||
--echo # scope
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
SELECT @@session.wsrep_gtid_domain_id;
|
||||
SET @@global.wsrep_gtid_domain_id=1;
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
|
||||
--echo
|
||||
--echo # valid values
|
||||
SET @@global.wsrep_gtid_domain_id=10;
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
SET @@global.wsrep_gtid_domain_id=0;
|
||||
SELECT @@global.wsrep_gtid_domain_id;
|
||||
SET @@global.wsrep_gtid_domain_id=default;
|
||||
SELECT @global.wsrep_gtid_domain_id;
|
||||
|
||||
--echo
|
||||
--echo # invalid values
|
||||
--error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.wsrep_gtid_domain_id=NULL;
|
||||
--error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.wsrep_gtid_domain_id='junk';
|
||||
# expect warning : Truncated incorrect wsrep_gtid_domain_id value: '-1'
|
||||
SET @@global.wsrep_gtid_domain_id=-1;
|
||||
SELECT @global.wsrep_gtid_domain_id;
|
||||
|
||||
--echo
|
||||
--echo # restore the initial value
|
||||
SET @@global.wsrep_gtid_domain_id = @wsrep_gtid_domain_id_global_saved;
|
||||
|
||||
--echo # End of test
|
33
mysql-test/suite/sys_vars/t/wsrep_gtid_mode_basic.test
Normal file
33
mysql-test/suite/sys_vars/t/wsrep_gtid_mode_basic.test
Normal file
@ -0,0 +1,33 @@
|
||||
--source include/have_wsrep.inc
|
||||
|
||||
--echo #
|
||||
--echo # wsrep_gtid_mode
|
||||
--echo #
|
||||
|
||||
--echo # save the initial value
|
||||
SET @wsrep_gtid_mode_global_saved = @@global.wsrep_gtid_mode;
|
||||
|
||||
--echo # default
|
||||
SELECT @@global.wsrep_gtid_mode;
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
SELECT @@session.wsrep_gtid_mode;
|
||||
|
||||
--echo
|
||||
--echo # scope and valid values
|
||||
SET @@global.wsrep_gtid_mode=OFF;
|
||||
SELECT @@global.wsrep_gtid_mode;
|
||||
SET @@global.wsrep_gtid_mode=ON;
|
||||
SELECT @@global.wsrep_gtid_mode;
|
||||
|
||||
--echo
|
||||
--echo # invalid values
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET @@global.wsrep_gtid_mode=NULL;
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET @@global.wsrep_gtid_mode='junk';
|
||||
|
||||
--echo
|
||||
--echo # restore the initial value
|
||||
SET @@global.wsrep_gtid_mode = @wsrep_gtid_mode_global_saved;
|
||||
|
||||
--echo # End of test
|
@ -91,6 +91,10 @@ case "$1" in
|
||||
WSREP_SST_OPT_BINLOG="$2"
|
||||
shift
|
||||
;;
|
||||
'--gtid-domain-id')
|
||||
readonly WSREP_SST_OPT_GTID_DOMAIN_ID="$2"
|
||||
shift
|
||||
;;
|
||||
*) # must be command
|
||||
# usage
|
||||
# exit 1
|
||||
|
@ -96,6 +96,17 @@ DROP PREPARE stmt;"
|
||||
|
||||
SET_START_POSITION="SET GLOBAL wsrep_start_position='$WSREP_SST_OPT_GTID';"
|
||||
|
||||
SET_WSREP_GTID_DOMAIN_ID=""
|
||||
if [ -n WSREP_SST_OPT_GTID_DOMAIN_ID]
|
||||
then
|
||||
SET_WSREP_GTID_DOMAIN_ID="
|
||||
SET @val = (SELECT GLOBAL_VALUE FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME = 'WSREP_GTID_STRICT_MODE' AND GLOBAL_VALUE > 0);
|
||||
SET @stmt = IF (@val IS NOT NULL, 'SET GLOBAL WSREP_GTID_DOMAIN_ID=$WSREP_SST_OPT_GTID_DOMAIN_ID', 'SET @dummy = 0');
|
||||
PREPARE stmt FROM @stmt;
|
||||
EXECUTE stmt;
|
||||
DROP PREPARE stmt;"
|
||||
fi
|
||||
|
||||
# Retrieve the donor's @@global.gtid_binlog_state.
|
||||
GTID_BINLOG_STATE=$(echo "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_state'" |\
|
||||
mysql $AUTH -S$WSREP_SST_OPT_SOCKET --disable-reconnect --connect_timeout=10 |\
|
||||
@ -157,7 +168,8 @@ then
|
||||
echo $SET_GTID_BINLOG_STATE && echo $SQL_LOG_BIN_OFF && \
|
||||
echo $STOP_WSREP && $MYSQLDUMP && echo $CSV_TABLES_FIX && \
|
||||
echo $RESTORE_GENERAL_LOG && echo $RESTORE_SLOW_QUERY_LOG && \
|
||||
echo $SET_START_POSITION || echo "SST failed to complete;") | $MYSQL
|
||||
echo $SET_START_POSITION && echo $SET_WSREP_GTID_DOMAIN_ID \
|
||||
|| echo "SST failed to complete;") | $MYSQL
|
||||
else
|
||||
wsrep_log_info "Bypassing state dump."
|
||||
echo $SET_START_POSITION | $MYSQL
|
||||
|
@ -131,7 +131,9 @@ then
|
||||
|
||||
echo "flush tables"
|
||||
|
||||
# wait for tables flushed and state ID written to the file
|
||||
# Wait for :
|
||||
# (a) tables to be flushed, and
|
||||
# (b) state ID & wsrep_gtid_domain_id to be written to the file.
|
||||
while [ ! -r "$FLUSHED" ] && ! grep -q ':' "$FLUSHED" >/dev/null 2>&1
|
||||
do
|
||||
sleep 0.2
|
||||
@ -217,7 +219,10 @@ then
|
||||
|
||||
else # BYPASS
|
||||
wsrep_log_info "Bypassing state dump."
|
||||
STATE="$WSREP_SST_OPT_GTID"
|
||||
|
||||
# Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id
|
||||
# (separated by a space).
|
||||
STATE="$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID"
|
||||
fi
|
||||
|
||||
echo "continue" # now server can resume updating data
|
||||
@ -323,7 +328,8 @@ EOF
|
||||
fi
|
||||
if [ -r "$MAGIC_FILE" ]
|
||||
then
|
||||
cat "$MAGIC_FILE" # output UUID:seqno
|
||||
# UUID:seqno & wsrep_gtid_domain_id is received here.
|
||||
cat "$MAGIC_FILE" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
else
|
||||
# this message should cause joiner to abort
|
||||
echo "rsync process ended without creating '$MAGIC_FILE'"
|
||||
|
@ -604,7 +604,9 @@ then
|
||||
|
||||
wsrep_log_info "Streaming GTID file before SST"
|
||||
|
||||
echo "${WSREP_SST_OPT_GTID}" > "${MAGIC_FILE}"
|
||||
# Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id
|
||||
# (separated by a space).
|
||||
echo "${WSREP_SST_OPT_GTID} ${WSREP_SST_OPT_GTID_DOMAIN_ID}" > "${MAGIC_FILE}"
|
||||
|
||||
ttcmd="$tcmd"
|
||||
|
||||
@ -660,7 +662,10 @@ then
|
||||
|
||||
wsrep_log_info "Bypassing the SST for IST"
|
||||
echo "continue" # now server can resume updating data
|
||||
echo "${WSREP_SST_OPT_GTID}" > "${MAGIC_FILE}"
|
||||
|
||||
# Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id
|
||||
# (separated by a space).
|
||||
echo "${WSREP_SST_OPT_GTID} ${WSREP_SST_OPT_GTID_DOMAIN_ID}" > "${MAGIC_FILE}"
|
||||
echo "1" > "${DATA}/${IST_FILE}"
|
||||
get_keys
|
||||
if [[ $encrypt -eq 1 ]];then
|
||||
@ -923,7 +928,7 @@ then
|
||||
wsrep_log_error "SST magic file ${MAGIC_FILE} not found/readable"
|
||||
exit 2
|
||||
fi
|
||||
cat "${MAGIC_FILE}" # output UUID:seqno
|
||||
cat "${MAGIC_FILE}" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
wsrep_log_info "Total time on joiner: $totime seconds"
|
||||
fi
|
||||
|
||||
|
@ -487,13 +487,14 @@ then
|
||||
# innobackupex implicitly writes PID to fixed location in ${TMPDIR}
|
||||
XTRABACKUP_PID="${TMPDIR}/xtrabackup_pid"
|
||||
|
||||
|
||||
else # BYPASS FOR IST
|
||||
|
||||
wsrep_log_info "Bypassing the SST for IST"
|
||||
STATE="${WSREP_SST_OPT_GTID}"
|
||||
echo "continue" # now server can resume updating data
|
||||
echo "${STATE}" > "${MAGIC_FILE}"
|
||||
|
||||
# Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id
|
||||
# (separated by a space)
|
||||
echo "${WSREP_SST_OPT_GTID} ${WSREP_SST_OPT_GTID_DOMAIN_ID}" > "${MAGIC_FILE}"
|
||||
echo "1" > "${DATA}/${IST_FILE}"
|
||||
get_keys
|
||||
pushd ${DATA} 1>/dev/null
|
||||
@ -708,7 +709,7 @@ then
|
||||
exit 2
|
||||
fi
|
||||
|
||||
cat "${MAGIC_FILE}" # output UUID:seqno
|
||||
cat "${MAGIC_FILE}" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
wsrep_log_info "Total time on joiner: $totime seconds"
|
||||
fi
|
||||
|
||||
|
21
sql/log.cc
21
sql/log.cc
@ -5616,13 +5616,26 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone,
|
||||
bool is_transactional, uint64 commit_id)
|
||||
{
|
||||
rpl_gtid gtid;
|
||||
uint32 domain_id= thd->variables.gtid_domain_id;
|
||||
uint32 server_id= thd->variables.server_id;
|
||||
uint64 seq_no= thd->variables.gtid_seq_no;
|
||||
uint32 domain_id;
|
||||
uint32 server_id;
|
||||
uint64 seq_no;
|
||||
int err;
|
||||
DBUG_ENTER("write_gtid_event");
|
||||
DBUG_PRINT("enter", ("standalone: %d", standalone));
|
||||
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (WSREP(thd) && thd->wsrep_trx_meta.gtid.seqno != -1 && wsrep_gtid_mode)
|
||||
{
|
||||
domain_id= wsrep_gtid_domain_id;
|
||||
} else {
|
||||
#endif /* WITH_WSREP */
|
||||
domain_id= thd->variables.gtid_domain_id;
|
||||
#ifdef WITH_WSREP
|
||||
}
|
||||
#endif /* WITH_WSREP */
|
||||
server_id= thd->variables.server_id;
|
||||
seq_no= thd->variables.gtid_seq_no;
|
||||
|
||||
if (thd->variables.option_bits & OPTION_GTID_BEGIN)
|
||||
{
|
||||
DBUG_PRINT("error", ("OPTION_GTID_BEGIN is set. "
|
||||
|
@ -4859,6 +4859,22 @@ static Sys_var_mybool Sys_wsrep_dirty_reads(
|
||||
"is not ready.", SESSION_ONLY(wsrep_dirty_reads), NO_CMD_LINE,
|
||||
DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG);
|
||||
|
||||
static Sys_var_uint Sys_wsrep_gtid_domain_id(
|
||||
"wsrep_gtid_domain_id", "When wsrep_gtid_mode is set, this value is "
|
||||
"used as gtid_domain_id for galera transactions and also copied to the "
|
||||
"joiner nodes during state transfer. It is ignored, otherwise.",
|
||||
GLOBAL_VAR(wsrep_gtid_domain_id), CMD_LINE(REQUIRED_ARG),
|
||||
VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1), NO_MUTEX_GUARD,
|
||||
NOT_IN_BINLOG);
|
||||
|
||||
static Sys_var_mybool Sys_wsrep_gtid_mode(
|
||||
"wsrep_gtid_mode", "Automatically update the (joiner) node's "
|
||||
"wsrep_gtid_domain_id value with that of donor's (received during "
|
||||
"state transfer) and use it in place of gtid_domain_id for all galera "
|
||||
"transactions. When OFF (default), wsrep_gtid_domain_id is simply "
|
||||
"ignored (backward compatibility).",
|
||||
GLOBAL_VAR(wsrep_gtid_mode), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
|
||||
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
static bool fix_host_cache_size(sys_var *, THD *, enum_var_type)
|
||||
|
@ -89,6 +89,12 @@ my_bool wsrep_restart_slave_activated = 0; // node has dropped, and slave
|
||||
my_bool wsrep_slave_UK_checks = 0; // slave thread does UK checks
|
||||
my_bool wsrep_slave_FK_checks = 0; // slave thread does FK checks
|
||||
bool wsrep_new_cluster = false; // Bootstrap the cluster ?
|
||||
|
||||
// Use wsrep_gtid_domain_id for galera transactions?
|
||||
bool wsrep_gtid_mode = 0;
|
||||
// gtid_domain_id for galera transactions.
|
||||
uint32 wsrep_gtid_domain_id = 0;
|
||||
|
||||
/*
|
||||
* End configuration options
|
||||
*/
|
||||
@ -1711,6 +1717,12 @@ pthread_handler_t start_wsrep_THD(void *arg)
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
thd->thread_id=thread_id++;
|
||||
|
||||
if (wsrep_gtid_mode)
|
||||
{
|
||||
/* Adjust domain_id. */
|
||||
thd->variables.gtid_domain_id= wsrep_gtid_domain_id;
|
||||
}
|
||||
|
||||
thd->real_id=pthread_self(); // Keep purify happy
|
||||
thread_count++;
|
||||
thread_created++;
|
||||
|
@ -88,6 +88,8 @@ extern my_bool wsrep_slave_FK_checks;
|
||||
extern my_bool wsrep_slave_UK_checks;
|
||||
extern ulong wsrep_running_threads;
|
||||
extern bool wsrep_new_cluster;
|
||||
extern bool wsrep_gtid_mode;
|
||||
extern uint32 wsrep_gtid_domain_id;
|
||||
|
||||
enum enum_wsrep_OSU_method { WSREP_OSU_TOI, WSREP_OSU_RSU };
|
||||
enum enum_wsrep_sync_wait {
|
||||
|
@ -435,17 +435,53 @@ static void* sst_joiner_thread (void* a)
|
||||
|
||||
if (!tmp)
|
||||
{
|
||||
WSREP_ERROR("Failed to read uuid:seqno from joiner script.");
|
||||
WSREP_ERROR("Failed to read uuid:seqno and wsrep_gtid_domain_id from "
|
||||
"joiner script.");
|
||||
if (proc.error()) err = proc.error();
|
||||
}
|
||||
else
|
||||
{
|
||||
err= sst_scan_uuid_seqno (out, &ret_uuid, &ret_seqno);
|
||||
// Read state ID (UUID:SEQNO) followed by wsrep_gtid_domain_id (if any).
|
||||
const char *pos= strchr(out, ' ');
|
||||
|
||||
if (!pos) {
|
||||
// There is no wsrep_gtid_domain_id (some older version SST script?).
|
||||
err= sst_scan_uuid_seqno (out, &ret_uuid, &ret_seqno);
|
||||
|
||||
} else {
|
||||
// Scan state ID first followed by wsrep_gtid_domain_id.
|
||||
char uuid[512];
|
||||
uint32 domain_id;
|
||||
size_t len= pos - out + 1;
|
||||
|
||||
if (len > sizeof(uuid)) goto err; // safety check
|
||||
memcpy(uuid, out, len); // including '\0'
|
||||
err= sst_scan_uuid_seqno (uuid, &ret_uuid, &ret_seqno);
|
||||
|
||||
if (err)
|
||||
{
|
||||
goto err;
|
||||
}
|
||||
else if (wsrep_gtid_mode)
|
||||
{
|
||||
domain_id= strtol(pos + 1, NULL, 10);
|
||||
if (domain_id < 1000 || domain_id > 0xFFFF)
|
||||
{
|
||||
WSREP_ERROR("Failed to get donor wsrep_gtid_domain_id.");
|
||||
err= EINVAL;
|
||||
goto err;
|
||||
} else {
|
||||
wsrep_gtid_domain_id= domain_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
|
||||
if (err)
|
||||
{
|
||||
ret_uuid= WSREP_UUID_UNDEFINED;
|
||||
ret_uuid= WSREP_UUID_UNDEFINED;
|
||||
ret_seqno= -err;
|
||||
}
|
||||
|
||||
@ -784,11 +820,12 @@ static int sst_donate_mysqldump (const char* addr,
|
||||
WSREP_SST_OPT_LPORT" '%u' "
|
||||
WSREP_SST_OPT_SOCKET" '%s' "
|
||||
" %s "
|
||||
WSREP_SST_OPT_GTID" '%s:%lld'"
|
||||
WSREP_SST_OPT_GTID" '%s:%lld' "
|
||||
WSREP_SST_OPT_GTID_DOMAIN_ID" '%d'"
|
||||
"%s",
|
||||
user, pswd, host, port, mysqld_port, mysqld_unix_port,
|
||||
wsrep_defaults_file, uuid_str,
|
||||
(long long)seqno, bypass ? " "WSREP_SST_OPT_BYPASS : "");
|
||||
wsrep_defaults_file, uuid_str, (long long)seqno,
|
||||
wsrep_gtid_domain_id, bypass ? " "WSREP_SST_OPT_BYPASS : "");
|
||||
|
||||
WSREP_DEBUG("Running: '%s'", cmd_str);
|
||||
|
||||
@ -885,8 +922,10 @@ static int sst_flush_tables(THD* thd)
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(file, "%s:%lld\n",
|
||||
wsrep_cluster_state_uuid, (long long)wsrep_locked_seqno);
|
||||
// Write cluster state ID and wsrep_gtid_domain_id.
|
||||
fprintf(file, "%s:%lld %d\n",
|
||||
wsrep_cluster_state_uuid, (long long)wsrep_locked_seqno,
|
||||
wsrep_gtid_domain_id);
|
||||
fsync(fileno(file));
|
||||
fclose(file);
|
||||
if (rename(tmp_name, real_name) == -1)
|
||||
@ -1058,12 +1097,13 @@ static int sst_donate_other (const char* method,
|
||||
WSREP_SST_OPT_DATA" '%s' "
|
||||
" %s "
|
||||
" %s '%s' "
|
||||
WSREP_SST_OPT_GTID" '%s:%lld'"
|
||||
WSREP_SST_OPT_GTID" '%s:%lld' "
|
||||
WSREP_SST_OPT_GTID_DOMAIN_ID" '%d'"
|
||||
"%s",
|
||||
method, addr, sst_auth_real, mysqld_unix_port,
|
||||
mysql_real_data_home, wsrep_defaults_file,
|
||||
binlog_opt, binlog_opt_val,
|
||||
uuid, (long long) seqno,
|
||||
uuid, (long long) seqno, wsrep_gtid_domain_id,
|
||||
bypass ? " "WSREP_SST_OPT_BYPASS : "");
|
||||
my_free(binlog_opt_val);
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
||||
#define WSREP_SST_OPT_SOCKET "--socket"
|
||||
#define WSREP_SST_OPT_GTID "--gtid"
|
||||
#define WSREP_SST_OPT_BYPASS "--bypass"
|
||||
#define WSREP_SST_OPT_GTID_DOMAIN_ID "--gtid-domain-id"
|
||||
|
||||
#define WSREP_SST_MYSQLDUMP "mysqldump"
|
||||
#define WSREP_SST_RSYNC "rsync"
|
||||
|
Loading…
x
Reference in New Issue
Block a user