mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-7702 Spiral patch 004_mariadb-10.0.15.slave-trx-retry.diff
This is about adding more options to force slave retries Two new variables has been added: slave_transaction_retry_errors - Tells the slave thread to retry transaction for replication when a query event returns an error from the provided list. Deadlock and elapsed lock wait timeout errors are automatically added to this list slave-transaction-retry-interval - Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors Other changes: - Simplifed code for slave_skip_errors (to be aligned with slave_transaction_retry_errors) - Renamed print_slave_skip_errors() to make_slave_skip_errors_printable() - Remove printing error from init_slave_skip_errors as my_bitmap_init() will do that if needed. - Generalize has_temporary_error()
This commit is contained in:
@ -1118,8 +1118,19 @@ The following options may be given as the first argument:
|
||||
(Defaults to on; use --skip-slave-sql-verify-checksum to disable.)
|
||||
--slave-transaction-retries=#
|
||||
Number of times the slave SQL thread will retry a
|
||||
transaction in case it failed with a deadlock or elapsed
|
||||
lock wait timeout, before giving up and stopping
|
||||
transaction in case it failed with a deadlock, elapsed
|
||||
lock wait timeout or listed in
|
||||
slave_transaction_retry_errors, before giving up and
|
||||
stopping
|
||||
--slave-transaction-retry-errors=name
|
||||
Tells the slave thread to retry transaction for
|
||||
replication when a query event returns an error from the
|
||||
provided list. Deadlock and elapsed lock wait timeout
|
||||
errors are automatically added to this list
|
||||
--slave-transaction-retry-interval=#
|
||||
Interval of the slave SQL thread will retry a transaction
|
||||
in case it failed with a deadlock or elapsed lock wait
|
||||
timeout or listed in slave_transaction_retry_errors
|
||||
--slave-type-conversions=name
|
||||
Set of slave type conversions that are enabled. If the
|
||||
variable is empty, no conversions are allowed and it is
|
||||
@ -1585,9 +1596,11 @@ slave-parallel-mode conservative
|
||||
slave-parallel-threads 0
|
||||
slave-parallel-workers 0
|
||||
slave-run-triggers-for-rbr NO
|
||||
slave-skip-errors (No default value)
|
||||
slave-skip-errors OFF
|
||||
slave-sql-verify-checksum TRUE
|
||||
slave-transaction-retries 10
|
||||
slave-transaction-retry-errors 1213,1205
|
||||
slave-transaction-retry-interval 0
|
||||
slave-type-conversions
|
||||
slow-launch-time 2
|
||||
slow-query-log FALSE
|
||||
|
@ -0,0 +1,21 @@
|
||||
select @@global.slave_transaction_retry_errors;
|
||||
@@global.slave_transaction_retry_errors
|
||||
1213,1205,10,20,400
|
||||
select @@session.slave_transaction_retry_errors;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_errors' is a GLOBAL variable
|
||||
show global variables like 'slave_transaction_retry_errors';
|
||||
Variable_name Value
|
||||
slave_transaction_retry_errors 1213,1205,10,20,400
|
||||
show session variables like 'slave_transaction_retry_errors';
|
||||
Variable_name Value
|
||||
slave_transaction_retry_errors 1213,1205,10,20,400
|
||||
select * from information_schema.global_variables where variable_name='slave_transaction_retry_errors';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
SLAVE_TRANSACTION_RETRY_ERRORS 1213,1205,10,20,400
|
||||
select * from information_schema.session_variables where variable_name='slave_transaction_retry_errors';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
SLAVE_TRANSACTION_RETRY_ERRORS 1213,1205,10,20,400
|
||||
set global slave_transaction_retry_errors=1;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_errors' is a read only variable
|
||||
set session slave_transaction_retry_errors=1;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_errors' is a read only variable
|
@ -0,0 +1,126 @@
|
||||
SET @start_global_value = @@global.slave_transaction_retry_interval;
|
||||
SELECT @start_global_value;
|
||||
@start_global_value
|
||||
0
|
||||
'#--------------------FN_DYNVARS_149_01-------------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = 50;
|
||||
SET @@global.slave_transaction_retry_interval = DEFAULT;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
0
|
||||
'#--------------------FN_DYNVARS_149_02-------------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = DEFAULT;
|
||||
SELECT @@global.slave_transaction_retry_interval = 10;
|
||||
@@global.slave_transaction_retry_interval = 10
|
||||
0
|
||||
'#--------------------FN_DYNVARS_149_03-------------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = 0;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
0
|
||||
SET @@global.slave_transaction_retry_interval = 1;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
1
|
||||
SET @@global.slave_transaction_retry_interval = 15;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
15
|
||||
SET @@global.slave_transaction_retry_interval = 1024;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
1024
|
||||
SET @@global.slave_transaction_retry_interval = 2147483648;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_transaction_retry_interval value: '2147483648'
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
3600
|
||||
SET @@global.slave_transaction_retry_interval = 2147483648*2-1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_transaction_retry_interval value: '4294967295'
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
3600
|
||||
SET @@global.slave_transaction_retry_interval = 2147483649*2;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_transaction_retry_interval value: '4294967298'
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
3600
|
||||
SET @@global.slave_transaction_retry_interval = 4294967295;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_transaction_retry_interval value: '4294967295'
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
3600
|
||||
'#--------------------FN_DYNVARS_149_04-------------------------#'
|
||||
SET @@slave_transaction_retry_interval = 2;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_interval' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
SET @@session.slave_transaction_retry_interval = 3;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_interval' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
SET @@local.slave_transaction_retry_interval = 4;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_interval' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
'#------------------FN_DYNVARS_149_05-----------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = -1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_transaction_retry_interval value: '-1'
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
0
|
||||
SET @@global.slave_transaction_retry_interval = 2147483649*2147483649;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_transaction_retry_interval value: '4611686022722355201'
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
3600
|
||||
SET @@global.slave_transaction_retry_interval = 65530.34;
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_transaction_retry_interval'
|
||||
SET @@global.slave_transaction_retry_interval = '100';
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_transaction_retry_interval'
|
||||
SET @@global.slave_transaction_retry_interval = 7483649.56;
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_transaction_retry_interval'
|
||||
SET @@global.slave_transaction_retry_interval = ON;
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_transaction_retry_interval'
|
||||
SET @@global.slave_transaction_retry_interval = OFF;
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_transaction_retry_interval'
|
||||
'#------------------FN_DYNVARS_149_06-----------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = 3000;
|
||||
SELECT @@global.slave_transaction_retry_interval = VARIABLE_VALUE
|
||||
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_transaction_retry_interval';
|
||||
@@global.slave_transaction_retry_interval = VARIABLE_VALUE
|
||||
1
|
||||
'#------------------FN_DYNVARS_149_07-----------------------#'
|
||||
SELECT count(VARIABLE_VALUE)
|
||||
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_transaction_retry_interval';
|
||||
count(VARIABLE_VALUE)
|
||||
1
|
||||
'#------------------FN_DYNVARS_149_08-----------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = TRUE;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
1
|
||||
SET @@global.slave_transaction_retry_interval = FALSE;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
0
|
||||
'#---------------------FN_DYNVARS_149_09----------------------#'
|
||||
SET @@global.slave_transaction_retry_interval = 60*60;
|
||||
SELECT @@slave_transaction_retry_interval = @@global.slave_transaction_retry_interval;
|
||||
@@slave_transaction_retry_interval = @@global.slave_transaction_retry_interval
|
||||
1
|
||||
'#---------------------FN_DYNVARS_149_10----------------------#'
|
||||
SET slave_transaction_retry_interval = 2048;
|
||||
ERROR HY000: Variable 'slave_transaction_retry_interval' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
SELECT slave_transaction_retry_interval;
|
||||
ERROR 42S22: Unknown column 'slave_transaction_retry_interval' in 'field list'
|
||||
SELECT @@slave_transaction_retry_interval;
|
||||
@@slave_transaction_retry_interval
|
||||
3600
|
||||
SET global slave_transaction_retry_interval = 99;
|
||||
SET @@global.slave_transaction_retry_interval = @start_global_value;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
@@global.slave_transaction_retry_interval
|
||||
0
|
@ -1176,10 +1176,19 @@
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
-VARIABLE_TYPE BIGINT UNSIGNED
|
||||
+VARIABLE_TYPE INT UNSIGNED
|
||||
VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout, before giving up and stopping
|
||||
VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 4294967295
|
||||
@@ -4426,7 +4426,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 0
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
-VARIABLE_TYPE BIGINT UNSIGNED
|
||||
+VARIABLE_TYPE INT UNSIGNED
|
||||
VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 3600
|
||||
@@ -4257,7 +4257,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 2
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1188,7 +1197,7 @@
|
||||
VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 31536000
|
||||
@@ -4485,7 +4485,7 @@
|
||||
@@ -4316,7 +4316,7 @@
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size
|
||||
NUMERIC_MIN_VALUE 1024
|
||||
@ -1197,7 +1206,7 @@
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
@@ -4790,7 +4790,7 @@
|
||||
@@ -4621,7 +4621,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 256
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1206,7 +1215,7 @@
|
||||
VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection.
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 524288
|
||||
@@ -4888,7 +4888,7 @@
|
||||
@@ -4719,7 +4719,7 @@
|
||||
GLOBAL_VALUE_ORIGIN AUTO
|
||||
DEFAULT_VALUE 400
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1215,7 +1224,7 @@
|
||||
VARIABLE_COMMENT The number of cached table definitions
|
||||
NUMERIC_MIN_VALUE 400
|
||||
NUMERIC_MAX_VALUE 524288
|
||||
@@ -4902,7 +4902,7 @@
|
||||
@@ -4733,7 +4733,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 2000
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1224,7 +1233,7 @@
|
||||
VARIABLE_COMMENT The number of cached open tables
|
||||
NUMERIC_MIN_VALUE 1
|
||||
NUMERIC_MAX_VALUE 1048576
|
||||
@@ -4972,7 +4972,7 @@
|
||||
@@ -4761,7 +4761,7 @@
|
||||
GLOBAL_VALUE_ORIGIN AUTO
|
||||
DEFAULT_VALUE 256
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1233,7 +1242,7 @@
|
||||
VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 16384
|
||||
@@ -4986,7 +4986,7 @@
|
||||
@@ -4775,7 +4775,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 10
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1242,7 +1251,7 @@
|
||||
VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release.
|
||||
NUMERIC_MIN_VALUE 1
|
||||
NUMERIC_MAX_VALUE 512
|
||||
@@ -5191,15 +5191,15 @@
|
||||
@@ -4980,15 +4980,15 @@
|
||||
READ_ONLY YES
|
||||
COMMAND_LINE_ARGUMENT REQUIRED
|
||||
VARIABLE_NAME TMP_DISK_TABLE_SIZE
|
||||
@ -1262,7 +1271,7 @@
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
@@ -5213,7 +5213,7 @@
|
||||
@@ -5002,7 +5002,7 @@
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size.
|
||||
NUMERIC_MIN_VALUE 1024
|
||||
@ -1271,7 +1280,7 @@
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
@@ -5227,7 +5227,7 @@
|
||||
@@ -5016,7 +5016,7 @@
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table.
|
||||
NUMERIC_MIN_VALUE 1024
|
||||
@ -1280,7 +1289,7 @@
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
@@ -5238,7 +5238,7 @@
|
||||
@@ -5027,7 +5027,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 8192
|
||||
VARIABLE_SCOPE SESSION
|
||||
@ -1289,7 +1298,7 @@
|
||||
VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log
|
||||
NUMERIC_MIN_VALUE 1024
|
||||
NUMERIC_MAX_VALUE 134217728
|
||||
@@ -5252,7 +5252,7 @@
|
||||
@@ -5041,7 +5041,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 4096
|
||||
VARIABLE_SCOPE SESSION
|
||||
@ -1298,7 +1307,7 @@
|
||||
VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log
|
||||
NUMERIC_MIN_VALUE 1024
|
||||
NUMERIC_MAX_VALUE 134217728
|
||||
@@ -5350,7 +5350,7 @@
|
||||
@@ -5139,7 +5139,7 @@
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 28800
|
||||
VARIABLE_SCOPE SESSION
|
||||
@ -1307,7 +1316,7 @@
|
||||
VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it
|
||||
NUMERIC_MIN_VALUE 1
|
||||
NUMERIC_MAX_VALUE 31536000
|
||||
@@ -5455,7 +5455,7 @@
|
||||
@@ -5243,7 +5243,7 @@
|
||||
COMMAND_LINE_ARGUMENT OPTIONAL
|
||||
VARIABLE_NAME OPEN_FILES_LIMIT
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
@ -1316,7 +1325,7 @@
|
||||
VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 4294967295
|
||||
@@ -5468,7 +5468,7 @@
|
||||
@@ -5256,7 +5256,7 @@
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
|
||||
NUMERIC_MIN_VALUE 0
|
||||
@ -1325,7 +1334,7 @@
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
@@ -5478,7 +5478,7 @@
|
||||
@@ -5266,7 +5266,7 @@
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
|
||||
NUMERIC_MIN_VALUE 0
|
||||
@ -1334,7 +1343,7 @@
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
@@ -5573,7 +5573,7 @@
|
||||
@@ -5351,7 +5351,7 @@
|
||||
VARIABLE_NAME LOG_TC_SIZE
|
||||
GLOBAL_VALUE_ORIGIN AUTO
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
|
@ -4399,13 +4399,41 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 10
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout, before giving up and stopping
|
||||
VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping
|
||||
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 SLAVE_TRANSACTION_RETRY_ERRORS
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE 1213,1205
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE VARCHAR
|
||||
VARIABLE_COMMENT Tells the slave thread to retry transaction for replication when a query event returns an error from the provided list. Deadlock and elapsed lock wait timeout errors are automatically added to this list
|
||||
NUMERIC_MIN_VALUE NULL
|
||||
NUMERIC_MAX_VALUE NULL
|
||||
NUMERIC_BLOCK_SIZE NULL
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY YES
|
||||
COMMAND_LINE_ARGUMENT REQUIRED
|
||||
VARIABLE_NAME SLAVE_TRANSACTION_RETRY_INTERVAL
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE 0
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE 0
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE BIGINT UNSIGNED
|
||||
VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 3600
|
||||
NUMERIC_BLOCK_SIZE 1
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT REQUIRED
|
||||
VARIABLE_NAME SLAVE_TYPE_CONVERSIONS
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE
|
||||
|
@ -0,0 +1 @@
|
||||
--slave_transaction_retry_errors="10,20, 5000, 400"
|
@ -0,0 +1,19 @@
|
||||
--source include/not_embedded.inc
|
||||
#
|
||||
# only global
|
||||
#
|
||||
select @@global.slave_transaction_retry_errors;
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
select @@session.slave_transaction_retry_errors;
|
||||
show global variables like 'slave_transaction_retry_errors';
|
||||
show session variables like 'slave_transaction_retry_errors';
|
||||
select * from information_schema.global_variables where variable_name='slave_transaction_retry_errors';
|
||||
select * from information_schema.session_variables where variable_name='slave_transaction_retry_errors';
|
||||
|
||||
#
|
||||
# show that it's read-only
|
||||
#
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
set global slave_transaction_retry_errors=1;
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
set session slave_transaction_retry_errors=1;
|
@ -0,0 +1,190 @@
|
||||
--source include/not_embedded.inc
|
||||
#
|
||||
# only global
|
||||
#
|
||||
####### mysql-test\t\slave_transaction_retry_interval_basic.test ##############
|
||||
# #
|
||||
# Variable Name: slave_transaction_retry_interval #
|
||||
# Scope: GLOBAL #
|
||||
# Access Type: Dynamic #
|
||||
# Data Type: numeric #
|
||||
# Default Value: 10 #
|
||||
# Range: #
|
||||
# #
|
||||
# #
|
||||
# Creation Date: 2008-02-07 #
|
||||
# Author: Rizwan #
|
||||
# #
|
||||
# Description: Test Cases of Dynamic System Variable #
|
||||
# slave_transaction_retry_interval #
|
||||
# that checks the behavior of this variable in the following ways#
|
||||
# * Default Value #
|
||||
# * Valid & Invalid values #
|
||||
# * Scope & Access method #
|
||||
# * Data Integrity #
|
||||
# #
|
||||
# Reference: http://dev.mysql.com/doc/refman/5.1/en/ #
|
||||
# server-system-variables.html #
|
||||
# #
|
||||
###############################################################################
|
||||
|
||||
--source include/not_embedded.inc
|
||||
--source include/load_sysvars.inc
|
||||
|
||||
###################################################################
|
||||
# START OF slave_transaction_retry_interval TESTS #
|
||||
###################################################################
|
||||
|
||||
|
||||
#############################################################
|
||||
# Save initial value #
|
||||
#############################################################
|
||||
|
||||
SET @start_global_value = @@global.slave_transaction_retry_interval;
|
||||
SELECT @start_global_value;
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_149_01-------------------------#'
|
||||
###################################################################
|
||||
# Display the DEFAULT value of slave_transaction_retry_interval #
|
||||
###################################################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = 50;
|
||||
SET @@global.slave_transaction_retry_interval = DEFAULT;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_149_02-------------------------#'
|
||||
###################################################################
|
||||
# Check the DEFAULT value of slave_transaction_retry_interval #
|
||||
###################################################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = DEFAULT;
|
||||
SELECT @@global.slave_transaction_retry_interval = 10;
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_149_03-------------------------#'
|
||||
###############################################################################
|
||||
# Change the value of slave_transaction_retry_interval to a valid value for
|
||||
# GLOBAL Scope
|
||||
###############################################################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = 0;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 1;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 15;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 1024;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 2147483648;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 2147483648*2-1;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 2147483649*2;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = 4294967295;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_149_04-------------------------#'
|
||||
##############################################################################
|
||||
# Check if variable can be access with session scope #
|
||||
##############################################################################
|
||||
|
||||
--Error ER_GLOBAL_VARIABLE
|
||||
SET @@slave_transaction_retry_interval = 2;
|
||||
|
||||
--Error ER_GLOBAL_VARIABLE
|
||||
SET @@session.slave_transaction_retry_interval = 3;
|
||||
|
||||
--Error ER_GLOBAL_VARIABLE
|
||||
SET @@local.slave_transaction_retry_interval = 4;
|
||||
|
||||
|
||||
--echo '#------------------FN_DYNVARS_149_05-----------------------#'
|
||||
############################################################################
|
||||
# Change the value of slave_transaction_retry_interval to an invalid value #
|
||||
############################################################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = -1;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = 2147483649*2147483649;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_transaction_retry_interval = 65530.34;
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_transaction_retry_interval = '100';
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_transaction_retry_interval = 7483649.56;
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_transaction_retry_interval = ON;
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_transaction_retry_interval = OFF;
|
||||
|
||||
--echo '#------------------FN_DYNVARS_149_06-----------------------#'
|
||||
####################################################################
|
||||
# Check if the value in GLOBAL Table matches value in variable #
|
||||
####################################################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = 3000;
|
||||
SELECT @@global.slave_transaction_retry_interval = VARIABLE_VALUE
|
||||
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_transaction_retry_interval';
|
||||
|
||||
|
||||
--echo '#------------------FN_DYNVARS_149_07-----------------------#'
|
||||
###########################################################################
|
||||
# Check if the value is present in INFORMATION_SCHEMA.SESSION_VARIABLES #
|
||||
###########################################################################
|
||||
|
||||
SELECT count(VARIABLE_VALUE)
|
||||
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_transaction_retry_interval';
|
||||
|
||||
|
||||
--echo '#------------------FN_DYNVARS_149_08-----------------------#'
|
||||
####################################################################
|
||||
# Check if TRUE and FALSE values can be used on variable #
|
||||
####################################################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = TRUE;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
SET @@global.slave_transaction_retry_interval = FALSE;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
|
||||
|
||||
--echo '#---------------------FN_DYNVARS_149_09----------------------#'
|
||||
###############################################################################
|
||||
# Check if accessing variable with and without GLOBAL point to same variable #
|
||||
###############################################################################
|
||||
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = 60*60;
|
||||
SELECT @@slave_transaction_retry_interval = @@global.slave_transaction_retry_interval;
|
||||
|
||||
|
||||
--echo '#---------------------FN_DYNVARS_149_10----------------------#'
|
||||
###############################################################################
|
||||
# Check if slave_transaction_retry_interval can be accessed without @@ sign
|
||||
# and scope
|
||||
###############################################################################
|
||||
|
||||
--Error ER_GLOBAL_VARIABLE
|
||||
SET slave_transaction_retry_interval = 2048;
|
||||
--Error ER_BAD_FIELD_ERROR
|
||||
SELECT slave_transaction_retry_interval;
|
||||
|
||||
SELECT @@slave_transaction_retry_interval;
|
||||
|
||||
#verifying another another syntax for setting value
|
||||
SET global slave_transaction_retry_interval = 99;
|
||||
|
||||
####################################
|
||||
# Restore initial value #
|
||||
####################################
|
||||
|
||||
SET @@global.slave_transaction_retry_interval = @start_global_value;
|
||||
SELECT @@global.slave_transaction_retry_interval;
|
||||
|
||||
########################################################
|
||||
# END OF slave_transaction_retry_interval TESTS #
|
||||
########################################################
|
@ -444,6 +444,7 @@ my_bool opt_replicate_annotate_row_events= 0;
|
||||
my_bool opt_mysql56_temporal_format=0, strict_password_validation= 1;
|
||||
my_bool opt_explicit_defaults_for_timestamp= 0;
|
||||
char *opt_slave_skip_errors;
|
||||
char *opt_slave_transaction_retry_errors;
|
||||
|
||||
/*
|
||||
Legacy global handlerton. These will be removed (please do not add more).
|
||||
@ -499,6 +500,7 @@ ulong what_to_log;
|
||||
ulong slow_launch_time;
|
||||
ulong open_files_limit, max_binlog_size;
|
||||
ulong slave_trans_retries;
|
||||
ulong slave_trans_retry_interval;
|
||||
uint slave_net_timeout;
|
||||
ulong slave_exec_mode_options;
|
||||
ulong slave_run_triggers_for_rbr= 0;
|
||||
@ -9638,8 +9640,10 @@ static int get_options(int *argc_ptr, char ***argv_ptr)
|
||||
flush_time= 0;
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
if (opt_slave_skip_errors)
|
||||
init_slave_skip_errors(opt_slave_skip_errors);
|
||||
if (init_slave_skip_errors(opt_slave_skip_errors))
|
||||
return 1;
|
||||
if (init_slave_transaction_retry_errors(opt_slave_transaction_retry_errors))
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
if (global_system_variables.max_join_size == HA_POS_ERROR)
|
||||
|
@ -208,6 +208,7 @@ extern my_bool slave_allow_batching;
|
||||
extern my_bool allow_slave_start;
|
||||
extern LEX_CSTRING reason_slave_blocked;
|
||||
extern ulong slave_trans_retries;
|
||||
extern ulong slave_trans_retry_interval;
|
||||
extern uint slave_net_timeout;
|
||||
extern int max_user_connections;
|
||||
extern volatile ulong cached_thread_count;
|
||||
|
167
sql/slave.cc
167
sql/slave.cc
@ -72,6 +72,9 @@
|
||||
bool use_slave_mask = 0;
|
||||
MY_BITMAP slave_error_mask;
|
||||
char slave_skip_error_names[SHOW_VAR_FUNC_BUFF_SIZE];
|
||||
uint *slave_transaction_retry_errors;
|
||||
uint slave_transaction_retry_error_length= 0;
|
||||
char slave_transaction_retry_error_names[SHOW_VAR_FUNC_BUFF_SIZE];
|
||||
|
||||
char* slave_load_tmpdir = 0;
|
||||
Master_info *active_mi= 0;
|
||||
@ -156,7 +159,8 @@ static bool wait_for_relay_log_space(Relay_log_info* rli);
|
||||
static bool io_slave_killed(Master_info* mi);
|
||||
static bool sql_slave_killed(rpl_group_info *rgi);
|
||||
static int init_slave_thread(THD*, Master_info *, SLAVE_THD_TYPE);
|
||||
static void print_slave_skip_errors(void);
|
||||
static void make_slave_skip_errors_printable(void);
|
||||
static void make_slave_transaction_retry_errors_printable(void);
|
||||
static int safe_connect(THD* thd, MYSQL* mysql, Master_info* mi);
|
||||
static int safe_reconnect(THD*, MYSQL*, Master_info*, bool);
|
||||
static int connect_to_master(THD*, MYSQL*, Master_info*, bool, bool);
|
||||
@ -635,7 +639,6 @@ start_slave_background_thread()
|
||||
sql_print_error("Failed to create thread while initialising slave");
|
||||
return 1;
|
||||
}
|
||||
|
||||
mysql_mutex_lock(&LOCK_slave_background);
|
||||
while (!slave_background_thread_gtid_loaded)
|
||||
mysql_cond_wait(&COND_slave_background, &LOCK_slave_background);
|
||||
@ -706,15 +709,6 @@ int init_slave()
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
If --slave-skip-errors=... was not used, the string value for the
|
||||
system variable has not been set up yet. Do it now.
|
||||
*/
|
||||
if (!use_slave_mask)
|
||||
{
|
||||
print_slave_skip_errors();
|
||||
}
|
||||
|
||||
/*
|
||||
If master_host is not specified, try to read it from the master_info file.
|
||||
If master_host is specified, create the master_info file if it doesn't
|
||||
@ -817,7 +811,7 @@ int init_recovery(Master_info* mi, const char** errmsg)
|
||||
Convert slave skip errors bitmap into a printable string.
|
||||
*/
|
||||
|
||||
static void print_slave_skip_errors(void)
|
||||
static void make_slave_skip_errors_printable(void)
|
||||
{
|
||||
/*
|
||||
To be safe, we want 10 characters of room in the buffer for a number
|
||||
@ -826,7 +820,7 @@ static void print_slave_skip_errors(void)
|
||||
plus a NUL terminator. That is a max 6 digit number.
|
||||
*/
|
||||
const size_t MIN_ROOM= 10;
|
||||
DBUG_ENTER("print_slave_skip_errors");
|
||||
DBUG_ENTER("make_slave_skip_errors_printable");
|
||||
DBUG_ASSERT(sizeof(slave_skip_error_names) > MIN_ROOM);
|
||||
DBUG_ASSERT(MAX_SLAVE_ERROR <= 999999); // 6 digits
|
||||
|
||||
@ -848,14 +842,14 @@ static void print_slave_skip_errors(void)
|
||||
else
|
||||
{
|
||||
char *buff= slave_skip_error_names;
|
||||
char *bend= buff + sizeof(slave_skip_error_names);
|
||||
char *bend= buff + sizeof(slave_skip_error_names) - MIN_ROOM;
|
||||
int errnum;
|
||||
|
||||
for (errnum= 0; errnum < MAX_SLAVE_ERROR; errnum++)
|
||||
{
|
||||
if (bitmap_is_set(&slave_error_mask, errnum))
|
||||
{
|
||||
if (buff + MIN_ROOM >= bend)
|
||||
if (buff >= bend)
|
||||
break; /* purecov: tested */
|
||||
buff= int10_to_str(errnum, buff, 10);
|
||||
*buff++= ',';
|
||||
@ -885,24 +879,24 @@ static void print_slave_skip_errors(void)
|
||||
Called from get_options() in mysqld.cc on start-up
|
||||
*/
|
||||
|
||||
void init_slave_skip_errors(const char* arg)
|
||||
bool init_slave_skip_errors(const char* arg)
|
||||
{
|
||||
const char *p;
|
||||
DBUG_ENTER("init_slave_skip_errors");
|
||||
|
||||
if (!arg || !*arg) // No errors defined
|
||||
goto end;
|
||||
|
||||
if (my_bitmap_init(&slave_error_mask,0,MAX_SLAVE_ERROR,0))
|
||||
{
|
||||
fprintf(stderr, "Badly out of memory, please check your system status\n");
|
||||
exit(1);
|
||||
}
|
||||
use_slave_mask = 1;
|
||||
DBUG_RETURN(1);
|
||||
|
||||
use_slave_mask= 1;
|
||||
for (;my_isspace(system_charset_info,*arg);++arg)
|
||||
/* empty */;
|
||||
if (!my_strnncoll(system_charset_info,(uchar*)arg,4,(const uchar*)"all",4))
|
||||
{
|
||||
bitmap_set_all(&slave_error_mask);
|
||||
print_slave_skip_errors();
|
||||
DBUG_VOID_RETURN;
|
||||
goto end;
|
||||
}
|
||||
for (p= arg ; *p; )
|
||||
{
|
||||
@ -914,11 +908,109 @@ void init_slave_skip_errors(const char* arg)
|
||||
while (!my_isdigit(system_charset_info,*p) && *p)
|
||||
p++;
|
||||
}
|
||||
/* Convert slave skip errors bitmap into a printable string. */
|
||||
print_slave_skip_errors();
|
||||
|
||||
end:
|
||||
make_slave_skip_errors_printable();
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/**
|
||||
Make printable version if slave_transaction_retry_errors
|
||||
This is never empty as at least ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT
|
||||
will be there
|
||||
*/
|
||||
|
||||
static void make_slave_transaction_retry_errors_printable(void)
|
||||
{
|
||||
/*
|
||||
To be safe, we want 10 characters of room in the buffer for a number
|
||||
plus terminators. Also, we need some space for constant strings.
|
||||
10 characters must be sufficient for a number plus {',' | '...'}
|
||||
plus a NUL terminator. That is a max 6 digit number.
|
||||
*/
|
||||
const size_t MIN_ROOM= 10;
|
||||
char *buff= slave_transaction_retry_error_names;
|
||||
char *bend= buff + sizeof(slave_transaction_retry_error_names) - MIN_ROOM;
|
||||
uint i;
|
||||
DBUG_ENTER("make_slave_transaction_retry_errors_printable");
|
||||
DBUG_ASSERT(sizeof(slave_transaction_retry_error_names) > MIN_ROOM);
|
||||
|
||||
/* Make @@slave_transaction_retry_errors show a human-readable value */
|
||||
opt_slave_transaction_retry_errors= slave_transaction_retry_error_names;
|
||||
|
||||
for (i= 0; i < slave_transaction_retry_error_length && buff < bend; i++)
|
||||
{
|
||||
buff= int10_to_str(slave_transaction_retry_errors[i], buff, 10);
|
||||
*buff++= ',';
|
||||
}
|
||||
if (buff != slave_transaction_retry_error_names)
|
||||
buff--; // Remove last ','
|
||||
if (i < slave_transaction_retry_error_length)
|
||||
{
|
||||
/* Couldn't show all errors */
|
||||
buff= strmov(buff, "..."); /* purecov: tested */
|
||||
}
|
||||
*buff=0;
|
||||
DBUG_PRINT("exit", ("error_names: '%s'",
|
||||
slave_transaction_retry_error_names));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
bool init_slave_transaction_retry_errors(const char* arg)
|
||||
{
|
||||
const char *p;
|
||||
long err_code;
|
||||
uint i;
|
||||
DBUG_ENTER("init_slave_transaction_retry_errors");
|
||||
|
||||
/* Handle empty strings */
|
||||
if (!arg)
|
||||
arg= "";
|
||||
|
||||
slave_transaction_retry_error_length= 2;
|
||||
for (;my_isspace(system_charset_info,*arg);++arg)
|
||||
/* empty */;
|
||||
for (p= arg; *p; )
|
||||
{
|
||||
if (!(p= str2int(p, 10, 0, LONG_MAX, &err_code)))
|
||||
break;
|
||||
slave_transaction_retry_error_length++;
|
||||
while (!my_isdigit(system_charset_info,*p) && *p)
|
||||
p++;
|
||||
}
|
||||
|
||||
if (!(slave_transaction_retry_errors=
|
||||
(uint *) my_once_alloc(sizeof(int) *
|
||||
slave_transaction_retry_error_length,
|
||||
MYF(MY_WME))))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
/*
|
||||
Temporary error codes:
|
||||
currently, InnoDB deadlock detected by InnoDB or lock
|
||||
wait timeout (innodb_lock_wait_timeout exceeded
|
||||
*/
|
||||
slave_transaction_retry_errors[0]= ER_LOCK_DEADLOCK;
|
||||
slave_transaction_retry_errors[1]= ER_LOCK_WAIT_TIMEOUT;
|
||||
|
||||
/* Add user codes after this */
|
||||
for (p= arg, i= 2; *p; )
|
||||
{
|
||||
if (!(p= str2int(p, 10, 0, LONG_MAX, &err_code)))
|
||||
break;
|
||||
if (err_code > 0 && err_code < ER_ERROR_LAST)
|
||||
slave_transaction_retry_errors[i++]= (uint) err_code;
|
||||
while (!my_isdigit(system_charset_info,*p) && *p)
|
||||
p++;
|
||||
}
|
||||
slave_transaction_retry_error_length= i;
|
||||
|
||||
make_slave_transaction_retry_errors_printable();
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
|
||||
{
|
||||
DBUG_ENTER("terminate_slave_threads");
|
||||
@ -3598,14 +3690,20 @@ static ulong read_event(MYSQL* mysql, Master_info *mi, bool* suppress_warnings,
|
||||
DBUG_RETURN(len - 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
/**
|
||||
Check if the current error is of temporary nature of not.
|
||||
Some errors are temporary in nature, such as
|
||||
ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT.
|
||||
|
||||
@retval 0 if fatal error
|
||||
@retval 1 temporary error, do retry
|
||||
*/
|
||||
|
||||
int
|
||||
has_temporary_error(THD *thd)
|
||||
{
|
||||
uint current_errno;
|
||||
DBUG_ENTER("has_temporary_error");
|
||||
|
||||
DBUG_EXECUTE_IF("all_errors_are_temporary_errors",
|
||||
@ -3623,14 +3721,12 @@ has_temporary_error(THD *thd)
|
||||
if (!thd->is_error())
|
||||
DBUG_RETURN(0);
|
||||
|
||||
/*
|
||||
Temporary error codes:
|
||||
currently, InnoDB deadlock detected by InnoDB or lock
|
||||
wait timeout (innodb_lock_wait_timeout exceeded
|
||||
*/
|
||||
if (thd->get_stmt_da()->sql_errno() == ER_LOCK_DEADLOCK ||
|
||||
thd->get_stmt_da()->sql_errno() == ER_LOCK_WAIT_TIMEOUT)
|
||||
DBUG_RETURN(1);
|
||||
current_errno= thd->get_stmt_da()->sql_errno();
|
||||
for (uint i= 0; i < slave_transaction_retry_error_length; i++)
|
||||
{
|
||||
if (current_errno == slave_transaction_retry_errors[i])
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
@ -4281,8 +4377,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
|
||||
exec_res= 0;
|
||||
serial_rgi->cleanup_context(thd, 1);
|
||||
/* chance for concurrent connection to get more locks */
|
||||
slave_sleep(thd, MY_MIN(serial_rgi->trans_retries,
|
||||
slave_sleep(thd, MY_MAX(MY_MIN(serial_rgi->trans_retries,
|
||||
MAX_SLAVE_RETRY_PAUSE),
|
||||
slave_trans_retry_interval),
|
||||
sql_slave_killed, serial_rgi);
|
||||
serial_rgi->trans_retries++;
|
||||
mysql_mutex_lock(&rli->data_lock); // because of SHOW STATUS
|
||||
|
@ -132,6 +132,9 @@ extern ulong master_retry_count;
|
||||
extern MY_BITMAP slave_error_mask;
|
||||
extern char slave_skip_error_names[];
|
||||
extern bool use_slave_mask;
|
||||
extern char slave_transaction_retry_error_names[];
|
||||
extern uint *slave_transaction_retry_errors;
|
||||
extern uint slave_transaction_retry_error_length;
|
||||
extern char *slave_load_tmpdir;
|
||||
extern char *master_info_file;
|
||||
extern MYSQL_PLUGIN_IMPORT char *relay_log_info_file;
|
||||
@ -139,6 +142,7 @@ extern char *opt_relay_logname, *opt_relaylog_index_name;
|
||||
extern my_bool opt_skip_slave_start, opt_reckless_slave;
|
||||
extern my_bool opt_log_slave_updates;
|
||||
extern char *opt_slave_skip_errors;
|
||||
extern char *opt_slave_transaction_retry_errors;
|
||||
extern my_bool opt_replicate_annotate_row_events;
|
||||
extern ulonglong relay_log_space_limit;
|
||||
extern ulonglong opt_read_binlog_speed_limit;
|
||||
@ -184,7 +188,8 @@ extern const char *relay_log_basename;
|
||||
|
||||
int init_slave();
|
||||
int init_recovery(Master_info* mi, const char** errmsg);
|
||||
void init_slave_skip_errors(const char* arg);
|
||||
bool init_slave_skip_errors(const char* arg);
|
||||
bool init_slave_transaction_retry_errors(const char* arg);
|
||||
int register_slave_on_master(MYSQL* mysql);
|
||||
int terminate_slave_threads(Master_info* mi, int thread_mask,
|
||||
bool skip_lock = 0);
|
||||
|
@ -4872,6 +4872,14 @@ static Sys_var_ulonglong Sys_read_binlog_speed_limit(
|
||||
GLOBAL_VAR(opt_read_binlog_speed_limit), CMD_LINE(REQUIRED_ARG),
|
||||
VALID_RANGE(0, ULONG_MAX), DEFAULT(0), BLOCK_SIZE(1));
|
||||
|
||||
static Sys_var_charptr Sys_slave_transaction_retry_errors(
|
||||
"slave_transaction_retry_errors", "Tells the slave thread to retry "
|
||||
"transaction for replication when a query event returns an error from "
|
||||
"the provided list. Deadlock and elapsed lock wait timeout errors are "
|
||||
"automatically added to this list",
|
||||
READ_ONLY GLOBAL_VAR(opt_slave_transaction_retry_errors), CMD_LINE(REQUIRED_ARG),
|
||||
IN_SYSTEM_CHARSET, DEFAULT(0));
|
||||
|
||||
static Sys_var_ulonglong Sys_relay_log_space_limit(
|
||||
"relay_log_space_limit", "Maximum space to use for all relay logs",
|
||||
READ_ONLY GLOBAL_VAR(relay_log_space_limit), CMD_LINE(REQUIRED_ARG),
|
||||
@ -4906,10 +4914,19 @@ static Sys_var_uint Sys_sync_masterinfo_period(
|
||||
#ifdef HAVE_REPLICATION
|
||||
static Sys_var_ulong Sys_slave_trans_retries(
|
||||
"slave_transaction_retries", "Number of times the slave SQL "
|
||||
"thread will retry a transaction in case it failed with a deadlock "
|
||||
"or elapsed lock wait timeout, before giving up and stopping",
|
||||
"thread will retry a transaction in case it failed with a deadlock, "
|
||||
"elapsed lock wait timeout or listed in "
|
||||
"slave_transaction_retry_errors, before giving up and stopping",
|
||||
GLOBAL_VAR(slave_trans_retries), CMD_LINE(REQUIRED_ARG),
|
||||
VALID_RANGE(0, UINT_MAX), DEFAULT(10), BLOCK_SIZE(1));
|
||||
|
||||
static Sys_var_ulong Sys_slave_trans_retry_interval(
|
||||
"slave_transaction_retry_interval", "Interval of the slave SQL "
|
||||
"thread will retry a transaction in case it failed with a deadlock "
|
||||
"or elapsed lock wait timeout or listed in "
|
||||
"slave_transaction_retry_errors",
|
||||
GLOBAL_VAR(slave_trans_retry_interval), CMD_LINE(REQUIRED_ARG),
|
||||
VALID_RANGE(0, 3600), DEFAULT(0), BLOCK_SIZE(1));
|
||||
#endif
|
||||
|
||||
static bool check_locale(sys_var *self, THD *thd, set_var *var)
|
||||
|
Reference in New Issue
Block a user