Commit b016e1ba authored by Monty's avatar Monty

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()
parent 3907ff2d
...@@ -1118,8 +1118,19 @@ The following options may be given as the first argument: ...@@ -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.) (Defaults to on; use --skip-slave-sql-verify-checksum to disable.)
--slave-transaction-retries=# --slave-transaction-retries=#
Number of times the slave SQL thread will retry a Number of times the slave SQL thread will retry a
transaction in case it failed with a deadlock or elapsed transaction in case it failed with a deadlock, elapsed
lock wait timeout, before giving up and stopping 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 --slave-type-conversions=name
Set of slave type conversions that are enabled. If the Set of slave type conversions that are enabled. If the
variable is empty, no conversions are allowed and it is variable is empty, no conversions are allowed and it is
...@@ -1585,9 +1596,11 @@ slave-parallel-mode conservative ...@@ -1585,9 +1596,11 @@ slave-parallel-mode conservative
slave-parallel-threads 0 slave-parallel-threads 0
slave-parallel-workers 0 slave-parallel-workers 0
slave-run-triggers-for-rbr NO slave-run-triggers-for-rbr NO
slave-skip-errors (No default value) slave-skip-errors OFF
slave-sql-verify-checksum TRUE slave-sql-verify-checksum TRUE
slave-transaction-retries 10 slave-transaction-retries 10
slave-transaction-retry-errors 1213,1205
slave-transaction-retry-interval 0
slave-type-conversions slave-type-conversions
slow-launch-time 2 slow-launch-time 2
slow-query-log FALSE slow-query-log FALSE
......
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
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 @@ ...@@ -1176,10 +1176,19 @@
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT 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_MIN_VALUE 0
NUMERIC_MAX_VALUE 4294967295 NUMERIC_MAX_VALUE 4294967295
@@ -4426,7 +4426,7 @@ @@ -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 GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 2 DEFAULT_VALUE 2
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1188,7 +1197,7 @@ ...@@ -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 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_MIN_VALUE 0
NUMERIC_MAX_VALUE 31536000 NUMERIC_MAX_VALUE 31536000
@@ -4485,7 +4485,7 @@ @@ -4316,7 +4316,7 @@
VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size
NUMERIC_MIN_VALUE 1024 NUMERIC_MIN_VALUE 1024
...@@ -1197,7 +1206,7 @@ ...@@ -1197,7 +1206,7 @@
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
@@ -4790,7 +4790,7 @@ @@ -4621,7 +4621,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 256 DEFAULT_VALUE 256
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1206,7 +1215,7 @@ ...@@ -1206,7 +1215,7 @@
VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection.
NUMERIC_MIN_VALUE 0 NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 524288 NUMERIC_MAX_VALUE 524288
@@ -4888,7 +4888,7 @@ @@ -4719,7 +4719,7 @@
GLOBAL_VALUE_ORIGIN AUTO GLOBAL_VALUE_ORIGIN AUTO
DEFAULT_VALUE 400 DEFAULT_VALUE 400
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1215,7 +1224,7 @@ ...@@ -1215,7 +1224,7 @@
VARIABLE_COMMENT The number of cached table definitions VARIABLE_COMMENT The number of cached table definitions
NUMERIC_MIN_VALUE 400 NUMERIC_MIN_VALUE 400
NUMERIC_MAX_VALUE 524288 NUMERIC_MAX_VALUE 524288
@@ -4902,7 +4902,7 @@ @@ -4733,7 +4733,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 2000 DEFAULT_VALUE 2000
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1224,7 +1233,7 @@ ...@@ -1224,7 +1233,7 @@
VARIABLE_COMMENT The number of cached open tables VARIABLE_COMMENT The number of cached open tables
NUMERIC_MIN_VALUE 1 NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 1048576 NUMERIC_MAX_VALUE 1048576
@@ -4972,7 +4972,7 @@ @@ -4761,7 +4761,7 @@
GLOBAL_VALUE_ORIGIN AUTO GLOBAL_VALUE_ORIGIN AUTO
DEFAULT_VALUE 256 DEFAULT_VALUE 256
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1233,7 +1242,7 @@ ...@@ -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 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_MIN_VALUE 0
NUMERIC_MAX_VALUE 16384 NUMERIC_MAX_VALUE 16384
@@ -4986,7 +4986,7 @@ @@ -4775,7 +4775,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 10 DEFAULT_VALUE 10
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1242,7 +1251,7 @@ ...@@ -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. 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_MIN_VALUE 1
NUMERIC_MAX_VALUE 512 NUMERIC_MAX_VALUE 512
@@ -5191,15 +5191,15 @@ @@ -4980,15 +4980,15 @@
READ_ONLY YES READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TMP_DISK_TABLE_SIZE VARIABLE_NAME TMP_DISK_TABLE_SIZE
...@@ -1262,7 +1271,7 @@ ...@@ -1262,7 +1271,7 @@
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
@@ -5213,7 +5213,7 @@ @@ -5002,7 +5002,7 @@
VARIABLE_TYPE BIGINT UNSIGNED 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. 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 NUMERIC_MIN_VALUE 1024
...@@ -1271,7 +1280,7 @@ ...@@ -1271,7 +1280,7 @@
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
@@ -5227,7 +5227,7 @@ @@ -5016,7 +5016,7 @@
VARIABLE_TYPE BIGINT UNSIGNED 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. 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 NUMERIC_MIN_VALUE 1024
...@@ -1280,7 +1289,7 @@ ...@@ -1280,7 +1289,7 @@
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
@@ -5238,7 +5238,7 @@ @@ -5027,7 +5027,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 8192 DEFAULT_VALUE 8192
VARIABLE_SCOPE SESSION VARIABLE_SCOPE SESSION
...@@ -1289,7 +1298,7 @@ ...@@ -1289,7 +1298,7 @@
VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log
NUMERIC_MIN_VALUE 1024 NUMERIC_MIN_VALUE 1024
NUMERIC_MAX_VALUE 134217728 NUMERIC_MAX_VALUE 134217728
@@ -5252,7 +5252,7 @@ @@ -5041,7 +5041,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 4096 DEFAULT_VALUE 4096
VARIABLE_SCOPE SESSION VARIABLE_SCOPE SESSION
...@@ -1298,7 +1307,7 @@ ...@@ -1298,7 +1307,7 @@
VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log
NUMERIC_MIN_VALUE 1024 NUMERIC_MIN_VALUE 1024
NUMERIC_MAX_VALUE 134217728 NUMERIC_MAX_VALUE 134217728
@@ -5350,7 +5350,7 @@ @@ -5139,7 +5139,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 28800 DEFAULT_VALUE 28800
VARIABLE_SCOPE SESSION VARIABLE_SCOPE SESSION
...@@ -1307,7 +1316,7 @@ ...@@ -1307,7 +1316,7 @@
VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it
NUMERIC_MIN_VALUE 1 NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 31536000 NUMERIC_MAX_VALUE 31536000
@@ -5455,7 +5455,7 @@ @@ -5243,7 +5243,7 @@
COMMAND_LINE_ARGUMENT OPTIONAL COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_NAME OPEN_FILES_LIMIT
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
...@@ -1316,7 +1325,7 @@ ...@@ -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 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_MIN_VALUE 0
NUMERIC_MAX_VALUE 4294967295 NUMERIC_MAX_VALUE 4294967295
@@ -5468,7 +5468,7 @@ @@ -5256,7 +5256,7 @@
VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0 NUMERIC_MIN_VALUE 0
...@@ -1325,7 +1334,7 @@ ...@@ -1325,7 +1334,7 @@
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
@@ -5478,7 +5478,7 @@ @@ -5266,7 +5266,7 @@
VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes
NUMERIC_MIN_VALUE 0 NUMERIC_MIN_VALUE 0
...@@ -1334,7 +1343,7 @@ ...@@ -1334,7 +1343,7 @@
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
@@ -5573,7 +5573,7 @@ @@ -5351,7 +5351,7 @@
VARIABLE_NAME LOG_TC_SIZE VARIABLE_NAME LOG_TC_SIZE
GLOBAL_VALUE_ORIGIN AUTO GLOBAL_VALUE_ORIGIN AUTO
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
......
...@@ -4399,13 +4399,41 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME ...@@ -4399,13 +4399,41 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 10 DEFAULT_VALUE 10
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED 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_MIN_VALUE 0
NUMERIC_MAX_VALUE 4294967295 NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 1 NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED 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 VARIABLE_NAME SLAVE_TYPE_CONVERSIONS
SESSION_VALUE NULL SESSION_VALUE NULL
GLOBAL_VALUE GLOBAL_VALUE
......
--slave_transaction_retry_errors="10,20, 5000, 400"
--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;
--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; ...@@ -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_mysql56_temporal_format=0, strict_password_validation= 1;
my_bool opt_explicit_defaults_for_timestamp= 0; my_bool opt_explicit_defaults_for_timestamp= 0;
char *opt_slave_skip_errors; char *opt_slave_skip_errors;
char *opt_slave_transaction_retry_errors;
/* /*
Legacy global handlerton. These will be removed (please do not add more). Legacy global handlerton. These will be removed (please do not add more).
...@@ -499,6 +500,7 @@ ulong what_to_log; ...@@ -499,6 +500,7 @@ ulong what_to_log;
ulong slow_launch_time; ulong slow_launch_time;
ulong open_files_limit, max_binlog_size; ulong open_files_limit, max_binlog_size;
ulong slave_trans_retries; ulong slave_trans_retries;
ulong slave_trans_retry_interval;
uint slave_net_timeout; uint slave_net_timeout;
ulong slave_exec_mode_options; ulong slave_exec_mode_options;
ulong slave_run_triggers_for_rbr= 0; ulong slave_run_triggers_for_rbr= 0;
...@@ -9638,8 +9640,10 @@ static int get_options(int *argc_ptr, char ***argv_ptr) ...@@ -9638,8 +9640,10 @@ static int get_options(int *argc_ptr, char ***argv_ptr)
flush_time= 0; flush_time= 0;
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
if (opt_slave_skip_errors) if (init_slave_skip_errors(opt_slave_skip_errors))
init_slave_skip_errors(opt_slave_skip_errors); return 1;
if (init_slave_transaction_retry_errors(opt_slave_transaction_retry_errors))
return 1;
#endif #endif
if (global_system_variables.max_join_size == HA_POS_ERROR) if (global_system_variables.max_join_size == HA_POS_ERROR)
......
...@@ -208,6 +208,7 @@ extern my_bool slave_allow_batching; ...@@ -208,6 +208,7 @@ extern my_bool slave_allow_batching;
extern my_bool allow_slave_start; extern my_bool allow_slave_start;
extern LEX_CSTRING reason_slave_blocked; extern LEX_CSTRING reason_slave_blocked;
extern ulong slave_trans_retries; extern ulong slave_trans_retries;
extern ulong slave_trans_retry_interval;
extern uint slave_net_timeout; extern uint slave_net_timeout;
extern int max_user_connections; extern int max_user_connections;
extern volatile ulong cached_thread_count; extern volatile ulong cached_thread_count;
......
...@@ -72,6 +72,9 @@ ...@@ -72,6 +72,9 @@
bool use_slave_mask = 0; bool use_slave_mask = 0;
MY_BITMAP slave_error_mask; MY_BITMAP slave_error_mask;
char slave_skip_error_names[SHOW_VAR_FUNC_BUFF_SIZE]; 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; char* slave_load_tmpdir = 0;
Master_info *active_mi= 0; Master_info *active_mi= 0;
...@@ -156,7 +159,8 @@ static bool wait_for_relay_log_space(Relay_log_info* rli); ...@@ -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 io_slave_killed(Master_info* mi);
static bool sql_slave_killed(rpl_group_info *rgi); static bool sql_slave_killed(rpl_group_info *rgi);
static int init_slave_thread(THD*, Master_info *, SLAVE_THD_TYPE); 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_connect(THD* thd, MYSQL* mysql, Master_info* mi);
static int safe_reconnect(THD*, MYSQL*, Master_info*, bool); static int safe_reconnect(THD*, MYSQL*, Master_info*, bool);
static int connect_to_master(THD*, MYSQL*, Master_info*, bool, bool); static int connect_to_master(THD*, MYSQL*, Master_info*, bool, bool);
...@@ -635,7 +639,6 @@ start_slave_background_thread() ...@@ -635,7 +639,6 @@ start_slave_background_thread()
sql_print_error("Failed to create thread while initialising slave"); sql_print_error("Failed to create thread while initialising slave");
return 1; return 1;
} }
mysql_mutex_lock(&LOCK_slave_background); mysql_mutex_lock(&LOCK_slave_background);
while (!slave_background_thread_gtid_loaded) while (!slave_background_thread_gtid_loaded)
mysql_cond_wait(&COND_slave_background, &LOCK_slave_background); mysql_cond_wait(&COND_slave_background, &LOCK_slave_background);
...@@ -706,15 +709,6 @@ int init_slave() ...@@ -706,15 +709,6 @@ int init_slave()
goto err; 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 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 If master_host is specified, create the master_info file if it doesn't
...@@ -812,12 +806,12 @@ int init_recovery(Master_info* mi, const char** errmsg) ...@@ -812,12 +806,12 @@ int init_recovery(Master_info* mi, const char** errmsg)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/** /**
Convert slave skip errors bitmap into a printable string. 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 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) ...@@ -826,7 +820,7 @@ static void print_slave_skip_errors(void)
plus a NUL terminator. That is a max 6 digit number. plus a NUL terminator. That is a max 6 digit number.
*/ */
const size_t MIN_ROOM= 10; 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(sizeof(slave_skip_error_names) > MIN_ROOM);
DBUG_ASSERT(MAX_SLAVE_ERROR <= 999999); // 6 digits DBUG_ASSERT(MAX_SLAVE_ERROR <= 999999); // 6 digits
...@@ -848,14 +842,14 @@ static void print_slave_skip_errors(void) ...@@ -848,14 +842,14 @@ static void print_slave_skip_errors(void)
else else
{ {
char *buff= slave_skip_error_names; 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; int errnum;
for (errnum= 0; errnum < MAX_SLAVE_ERROR; errnum++) for (errnum= 0; errnum < MAX_SLAVE_ERROR; errnum++)
{ {
if (bitmap_is_set(&slave_error_mask, errnum)) if (bitmap_is_set(&slave_error_mask, errnum))
{ {
if (buff + MIN_ROOM >= bend) if (buff >= bend)
break; /* purecov: tested */ break; /* purecov: tested */
buff= int10_to_str(errnum, buff, 10); buff= int10_to_str(errnum, buff, 10);
*buff++= ','; *buff++= ',';
...@@ -885,24 +879,24 @@ static void print_slave_skip_errors(void) ...@@ -885,24 +879,24 @@ static void print_slave_skip_errors(void)
Called from get_options() in mysqld.cc on start-up 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; const char *p;
DBUG_ENTER("init_slave_skip_errors"); 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)) if (my_bitmap_init(&slave_error_mask,0,MAX_SLAVE_ERROR,0))
{ DBUG_RETURN(1);
fprintf(stderr, "Badly out of memory, please check your system status\n");
exit(1); use_slave_mask= 1;
}
use_slave_mask = 1;
for (;my_isspace(system_charset_info,*arg);++arg) for (;my_isspace(system_charset_info,*arg);++arg)
/* empty */; /* empty */;
if (!my_strnncoll(system_charset_info,(uchar*)arg,4,(const uchar*)"all",4)) if (!my_strnncoll(system_charset_info,(uchar*)arg,4,(const uchar*)"all",4))
{ {
bitmap_set_all(&slave_error_mask); bitmap_set_all(&slave_error_mask);
print_slave_skip_errors(); goto end;
DBUG_VOID_RETURN;
} }
for (p= arg ; *p; ) for (p= arg ; *p; )
{ {
...@@ -914,11 +908,109 @@ void init_slave_skip_errors(const char* arg) ...@@ -914,11 +908,109 @@ void init_slave_skip_errors(const char* arg)
while (!my_isdigit(system_charset_info,*p) && *p) while (!my_isdigit(system_charset_info,*p) && *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; 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) int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
{ {
DBUG_ENTER("terminate_slave_threads"); DBUG_ENTER("terminate_slave_threads");
...@@ -987,7 +1079,7 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock) ...@@ -987,7 +1079,7 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
mysql_mutex_unlock(log_lock); mysql_mutex_unlock(log_lock);
} }
DBUG_RETURN(retval); DBUG_RETURN(retval);
} }
...@@ -3598,14 +3690,20 @@ static ulong read_event(MYSQL* mysql, Master_info *mi, bool* suppress_warnings, ...@@ -3598,14 +3690,20 @@ static ulong read_event(MYSQL* mysql, Master_info *mi, bool* suppress_warnings,
DBUG_RETURN(len - 1); DBUG_RETURN(len - 1);
} }
/*
/**
Check if the current error is of temporary nature of not. Check if the current error is of temporary nature of not.
Some errors are temporary in nature, such as Some errors are temporary in nature, such as
ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT. ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT.
@retval 0 if fatal error
@retval 1 temporary error, do retry
*/ */
int int
has_temporary_error(THD *thd) has_temporary_error(THD *thd)
{ {
uint current_errno;
DBUG_ENTER("has_temporary_error"); DBUG_ENTER("has_temporary_error");
DBUG_EXECUTE_IF("all_errors_are_temporary_errors", DBUG_EXECUTE_IF("all_errors_are_temporary_errors",
...@@ -3623,14 +3721,12 @@ has_temporary_error(THD *thd) ...@@ -3623,14 +3721,12 @@ has_temporary_error(THD *thd)
if (!thd->is_error()) if (!thd->is_error())
DBUG_RETURN(0); DBUG_RETURN(0);
/* current_errno= thd->get_stmt_da()->sql_errno();
Temporary error codes: for (uint i= 0; i < slave_transaction_retry_error_length; i++)
currently, InnoDB deadlock detected by InnoDB or lock {
wait timeout (innodb_lock_wait_timeout exceeded if (current_errno == slave_transaction_retry_errors[i])
*/ DBUG_RETURN(1);
if (thd->get_stmt_da()->sql_errno() == ER_LOCK_DEADLOCK || }
thd->get_stmt_da()->sql_errno() == ER_LOCK_WAIT_TIMEOUT)
DBUG_RETURN(1);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -4281,8 +4377,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, ...@@ -4281,8 +4377,9 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli,
exec_res= 0; exec_res= 0;
serial_rgi->cleanup_context(thd, 1); serial_rgi->cleanup_context(thd, 1);
/* chance for concurrent connection to get more locks */ /* 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), MAX_SLAVE_RETRY_PAUSE),
slave_trans_retry_interval),
sql_slave_killed, serial_rgi); sql_slave_killed, serial_rgi);
serial_rgi->trans_retries++; serial_rgi->trans_retries++;
mysql_mutex_lock(&rli->data_lock); // because of SHOW STATUS mysql_mutex_lock(&rli->data_lock); // because of SHOW STATUS
...@@ -4367,7 +4464,7 @@ static bool check_io_slave_killed(Master_info *mi, const char *info) ...@@ -4367,7 +4464,7 @@ static bool check_io_slave_killed(Master_info *mi, const char *info)
@param[in] mysql MySQL connection. @param[in] mysql MySQL connection.
@param[in] mi Master connection information. @param[in] mi Master connection information.
@param[in,out] retry_count Number of attempts to reconnect. @param[in,out] retry_count Number of attempts to reconnect.
@param[in] suppress_warnings TRUE when a normal net read timeout @param[in] suppress_warnings TRUE when a normal net read timeout
has caused to reconnecting. has caused to reconnecting.
@param[in] messages Messages to print/log, see @param[in] messages Messages to print/log, see
reconnect_messages[] array. reconnect_messages[] array.
......
...@@ -132,6 +132,9 @@ extern ulong master_retry_count; ...@@ -132,6 +132,9 @@ extern ulong master_retry_count;
extern MY_BITMAP slave_error_mask; extern MY_BITMAP slave_error_mask;
extern char slave_skip_error_names[]; extern char slave_skip_error_names[];
extern bool use_slave_mask; 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 *slave_load_tmpdir;
extern char *master_info_file; extern char *master_info_file;
extern MYSQL_PLUGIN_IMPORT char *relay_log_info_file; extern MYSQL_PLUGIN_IMPORT char *relay_log_info_file;
...@@ -139,6 +142,7 @@ extern char *opt_relay_logname, *opt_relaylog_index_name; ...@@ -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_skip_slave_start, opt_reckless_slave;
extern my_bool opt_log_slave_updates; extern my_bool opt_log_slave_updates;
extern char *opt_slave_skip_errors; extern char *opt_slave_skip_errors;
extern char *opt_slave_transaction_retry_errors;
extern my_bool opt_replicate_annotate_row_events; extern my_bool opt_replicate_annotate_row_events;
extern ulonglong relay_log_space_limit; extern ulonglong relay_log_space_limit;
extern ulonglong opt_read_binlog_speed_limit; extern ulonglong opt_read_binlog_speed_limit;
...@@ -184,7 +188,8 @@ extern const char *relay_log_basename; ...@@ -184,7 +188,8 @@ extern const char *relay_log_basename;
int init_slave(); int init_slave();
int init_recovery(Master_info* mi, const char** errmsg); 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 register_slave_on_master(MYSQL* mysql);
int terminate_slave_threads(Master_info* mi, int thread_mask, int terminate_slave_threads(Master_info* mi, int thread_mask,
bool skip_lock = 0); bool skip_lock = 0);
......
...@@ -4872,6 +4872,14 @@ static Sys_var_ulonglong Sys_read_binlog_speed_limit( ...@@ -4872,6 +4872,14 @@ static Sys_var_ulonglong Sys_read_binlog_speed_limit(
GLOBAL_VAR(opt_read_binlog_speed_limit), CMD_LINE(REQUIRED_ARG), GLOBAL_VAR(opt_read_binlog_speed_limit), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, ULONG_MAX), DEFAULT(0), BLOCK_SIZE(1)); 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( static Sys_var_ulonglong Sys_relay_log_space_limit(
"relay_log_space_limit", "Maximum space to use for all relay logs", "relay_log_space_limit", "Maximum space to use for all relay logs",
READ_ONLY GLOBAL_VAR(relay_log_space_limit), CMD_LINE(REQUIRED_ARG), READ_ONLY GLOBAL_VAR(relay_log_space_limit), CMD_LINE(REQUIRED_ARG),
...@@ -4906,10 +4914,19 @@ static Sys_var_uint Sys_sync_masterinfo_period( ...@@ -4906,10 +4914,19 @@ static Sys_var_uint Sys_sync_masterinfo_period(
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
static Sys_var_ulong Sys_slave_trans_retries( static Sys_var_ulong Sys_slave_trans_retries(
"slave_transaction_retries", "Number of times the slave SQL " "slave_transaction_retries", "Number of times the slave SQL "
"thread will retry a transaction in case it failed with a deadlock " "thread will retry a transaction in case it failed with a deadlock, "
"or elapsed lock wait timeout, before giving up and stopping", "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), GLOBAL_VAR(slave_trans_retries), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, UINT_MAX), DEFAULT(10), BLOCK_SIZE(1)); 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 #endif
static bool check_locale(sys_var *self, THD *thd, set_var *var) static bool check_locale(sys_var *self, THD *thd, set_var *var)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment