Commit bbd70fcc authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-23379 Deprecate&ignore InnoDB concurrency throttling parameters

The parameters innodb_thread_concurrency and innodb_commit_concurrency
were useful years ago when both computing resources and the implementation
of some shared data structures were limited. MySQL 5.0 or 5.1 had trouble
scaling beyond 8 concurrent connections. Most of the scalability bottlenecks
have been removed since then, and the transactions per second delivered
by MariaDB Server 10.5 should not dramatically drop upon exceeding the
'optimal' number of connections.

Hence, enabling any concurrency throttling for InnoDB actually makes
things worse. We have seen many customers mistakenly setting this to a
small value like 16 or 64 and then complaining the server was slow.

Ignoring the parameters allows us to remove some normally unused code
and data structures, which could slightly improve performance.

innodb_thread_concurrency, innodb_commit_concurrency,
innodb_replication_delay, innodb_concurrency_tickets,
innodb_thread_sleep_delay, innodb_adaptive_max_sleep_delay:
Deprecate and ignore; hard-wire to 0.

The column INFORMATION_SCHEMA.INNODB_TRX.trx_concurrency_tickets
will always report 0.
parent 7438fc4f
......@@ -5376,7 +5376,6 @@ static bool xtrabackup_prepare_func(char** argv)
xb_filters_init();
srv_log_group_home_dir = NULL;
srv_thread_concurrency = 1;
if (xtrabackup_incremental) {
srv_operation = SRV_OPERATION_RESTORE_DELTA;
......
......@@ -1183,10 +1183,6 @@ set @my_innodb_autoextend_increment=@@global.innodb_autoextend_increment;
set global innodb_autoextend_increment=8;
set global innodb_autoextend_increment=@my_innodb_autoextend_increment;
set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency;
set global innodb_commit_concurrency=0;
set global innodb_commit_concurrency=@my_innodb_commit_concurrency;
#
# Bug #37830: ORDER BY ASC/DESC - no difference
#
......
set global innodb_file_per_table=ON;
set global innodb_thread_concurrency=20;
connect con1,localhost,root,,;
connect con2,localhost,root,,;
connect con3,localhost,root,,;
......
set global innodb_commit_concurrency=0;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '0'
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
1
set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
1
set global innodb_commit_concurrency=42;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
42
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
1
set global innodb_commit_concurrency=0;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '0'
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
1
set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
1
set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
set global innodb_commit_concurrency=1;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '1'
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
set global innodb_commit_concurrency=42;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '42'
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
......@@ -1797,9 +1797,6 @@ DROP TABLE t1;
set @my_innodb_autoextend_increment=@@global.innodb_autoextend_increment;
set global innodb_autoextend_increment=8;
set global innodb_autoextend_increment=@my_innodb_autoextend_increment;
set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency;
set global innodb_commit_concurrency=0;
set global innodb_commit_concurrency=@my_innodb_commit_concurrency;
CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a), KEY t1_b (b))
ENGINE=InnoDB;
INSERT INTO t1 (a,b,c) VALUES (1,1,1), (2,1,1), (3,1,1), (4,1,1);
......
......@@ -24,10 +24,6 @@ call mtr.add_suppression("Cannot add field .* in table .* because after adding i
call mtr.add_suppression("\\[ERROR\\] InnoDB: in ALTER TABLE `test`.`t1`");
call mtr.add_suppression("\\[ERROR\\] InnoDB: in RENAME TABLE table `test`.`t1`");
SET @innodb_thread_sleep_delay_orig = @@innodb_thread_sleep_delay;
SET @innodb_thread_concurrency_orig = @@innodb_thread_concurrency;
--disable_warnings
SET @innodb_rows_deleted_orig = (SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_deleted');
SET @innodb_rows_inserted_orig = (SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_inserted');
......@@ -2503,9 +2499,6 @@ DROP TABLE bug35537;
DISCONNECT c1;
CONNECTION default;
SET GLOBAL innodb_thread_sleep_delay = @innodb_thread_sleep_delay_orig;
SET GLOBAL innodb_thread_concurrency = @innodb_thread_concurrency_orig;
-- enable_query_log
# Clean up after the Bug#55284/Bug#58912 test case.
......
......@@ -9,8 +9,6 @@
--disable_query_log
set @old_innodb_buffer_pool_size = @@innodb_buffer_pool_size;
set @old_innodb_file_per_table = @@innodb_file_per_table;
set @old_innodb_thread_concurrency = @@innodb_thread_concurrency;
set @old_innodb_thread_sleep_delay = @@innodb_thread_sleep_delay;
set @old_innodb_disable_resize = @@innodb_disable_resize_buffer_pool_debug;
set global innodb_disable_resize_buffer_pool_debug = OFF;
call mtr.add_suppression("\\[ERROR\\] InnoDB: failed to allocate memory for buffer pool chunk");
......@@ -22,7 +20,6 @@ call mtr.add_suppression("\\[ERROR\\] InnoDB: failed to allocate memory for buff
let $wait_timeout = 180;
set global innodb_file_per_table=ON;
set global innodb_thread_concurrency=20;
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
......@@ -178,8 +175,6 @@ drop table t6;
--disable_query_log
set global innodb_buffer_pool_size = @old_innodb_buffer_pool_size;
set global innodb_file_per_table = @old_innodb_file_per_table;
set global innodb_thread_concurrency = @old_innodb_thread_concurrency;
set global innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay;
set global innodb_disable_resize_buffer_pool_debug = @old_innodb_disable_resize;
--enable_query_log
......
--source include/have_innodb.inc
#
# Bug#42101 Race condition in innodb_commit_concurrency
# http://bugs.mysql.com/42101
#
--error ER_WRONG_VALUE_FOR_VAR
set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=42;
select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
--error ER_WRONG_VALUE_FOR_VAR
set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency;
--source include/have_innodb.inc
#
# Bug#42101 Race condition in innodb_commit_concurrency
# http://bugs.mysql.com/42101
#
set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency;
--error ER_WRONG_VALUE_FOR_VAR
set global innodb_commit_concurrency=1;
select @@innodb_commit_concurrency;
--error ER_WRONG_VALUE_FOR_VAR
set global innodb_commit_concurrency=42;
select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=0;
select @@innodb_commit_concurrency;
set global innodb_commit_concurrency=DEFAULT;
select @@innodb_commit_concurrency;
include/master-slave.inc
[connection master]
connection slave;
SET @old_innodb_thread_concurrency := @@innodb_thread_concurrency;
SET @old_innodb_thread_sleep_delay := @@innodb_thread_sleep_delay;
SET GLOBAL innodb_thread_concurrency = 100;
connection master;
CREATE TABLE t(f INT) ENGINE=INNODB;
INSERT INTO t VALUES (10);
connection slave;
include/diff_tables.inc [master:t, slave:t]
"===== Clean up======="
connection master;
DROP TABLE t;
connection slave;
SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency;
SET GLOBAL innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay;
include/rpl_end.inc
# ==== Purpose ====
#
# Test verifies that replication shouldn't hang when number of active threads
# on the slave server are less than the allowed innodb_thread_concurrency value.
#
# ==== Implementation ====
#
# Steps:
# 0 - Have master slave replication setup with engine being Innodb.
# 1 - Configure innodb_thread_concurrency = 100.
# 2 - Do some DML on master and sync the slave with master.
# 3 - Ensure replication doesn't hang.
#
# ==== References ====
#
# MDEV-20247: Replication hangs with "preparing" and never starts
#
--source include/master-slave.inc
--source include/have_innodb.inc
--connection slave
SET @old_innodb_thread_concurrency := @@innodb_thread_concurrency;
SET @old_innodb_thread_sleep_delay := @@innodb_thread_sleep_delay;
SET GLOBAL innodb_thread_concurrency = 100;
--connection master
CREATE TABLE t(f INT) ENGINE=INNODB;
INSERT INTO t VALUES (10);
--sync_slave_with_master
--let $diff_tables=master:t, slave:t
--source include/diff_tables.inc
--echo "===== Clean up======="
--connection master
DROP TABLE t;
--sync_slave_with_master
SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency;
SET GLOBAL innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay;
--source include/rpl_end.inc
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
150000
0
150000 Expected
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=100;
Warnings:
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=0;
Warnings:
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
0
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=100000;
Warnings:
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
100000
0
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=1000000;
Warnings:
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
1000000
0
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=1000001;
Warnings:
Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '1000001'
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
1000000
0
1000000 Expected
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=4294967295;
Warnings:
Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '4294967295'
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
1000000
0
1000000 Expected
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=-1;
Warnings:
Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '-1'
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
0
......@@ -39,6 +50,7 @@ SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=-1024;
Warnings:
Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '-1024'
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay;
@@GLOBAL.innodb_adaptive_max_sleep_delay
0
......@@ -70,3 +82,5 @@ Expected error 'Variable is a GLOBAL variable'
SELECT innodb_adaptive_max_sleep_delay = @@SESSION.innodb_adaptive_max_sleep_delay;
ERROR 42S22: Unknown column 'innodb_adaptive_max_sleep_delay' in 'field list'
SET @@GLOBAL.innodb_adaptive_max_sleep_delay=150000;
Warnings:
Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect.
......@@ -4,35 +4,49 @@ SELECT @global_start_value;
0
'#--------------------FN_DYNVARS_046_01------------------------#'
SET @@global.innodb_commit_concurrency = 0;
Warnings:
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SET @@global.innodb_commit_concurrency = DEFAULT;
Warnings:
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
'#---------------------FN_DYNVARS_046_02-------------------------#'
SET innodb_commit_concurrency = 1;
ERROR HY000: Variable 'innodb_commit_concurrency' is a GLOBAL variable and should be set with SET GLOBAL
SET GLOBAL innodb_commit_concurrency = 1;
Warnings:
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@innodb_commit_concurrency;
@@innodb_commit_concurrency
0
SELECT local.innodb_commit_concurrency;
ERROR 42S02: Unknown table 'local' in field list
SET global innodb_commit_concurrency = 0;
Warnings:
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
'#--------------------FN_DYNVARS_046_03------------------------#'
SET @@global.innodb_commit_concurrency = 0;
Warnings:
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
'#--------------------FN_DYNVARS_046_04-------------------------#'
SET @@global.innodb_commit_concurrency = 1;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '1'
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
SET @@global.innodb_commit_concurrency = -1;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '-1'
Warnings:
Warning 1292 Truncated incorrect innodb_commit_concurrency value: '-1'
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
......@@ -52,7 +66,9 @@ SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
SET @@global.innodb_commit_concurrency = 1001;
ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '1001'
Warnings:
Warning 1292 Truncated incorrect innodb_commit_concurrency value: '1001'
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
......@@ -82,6 +98,8 @@ SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
SET @@global.innodb_commit_concurrency = @global_start_value;
Warnings:
Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect.
SELECT @@global.innodb_commit_concurrency;
@@global.innodb_commit_concurrency
0
SET @global_start_value = @@global.innodb_concurrency_tickets;
SELECT @global_start_value;
@global_start_value
5000
0
'#--------------------FN_DYNVARS_046_01------------------------#'
SET @@global.innodb_concurrency_tickets = 0;
Warnings:
Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '0'
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SET @@global.innodb_concurrency_tickets = DEFAULT;
Warnings:
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
5000
0
'#---------------------FN_DYNVARS_046_02-------------------------#'
SET innodb_concurrency_tickets = 1;
ERROR HY000: Variable 'innodb_concurrency_tickets' is a GLOBAL variable and should be set with SET GLOBAL
SELECT @@innodb_concurrency_tickets;
@@innodb_concurrency_tickets
5000
0
SELECT local.innodb_concurrency_tickets;
ERROR 42S02: Unknown table 'local' in field list
SET global innodb_concurrency_tickets = 0;
Warnings:
Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '0'
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
'#--------------------FN_DYNVARS_046_03------------------------#'
SET @@global.innodb_concurrency_tickets = 1;
Warnings:
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = 1000;
Warnings:
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1000
0
SET @@global.innodb_concurrency_tickets = 4294967295;
Warnings:
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
4294967295
0
'#--------------------FN_DYNVARS_046_04-------------------------#'
SET @@global.innodb_concurrency_tickets = 4294967296;
SELECT @@global.innodb_concurrency_tickets IN (4294967296,4294967295);
@@global.innodb_concurrency_tickets IN (4294967296,4294967295)
1
0
SET @@global.innodb_concurrency_tickets = 12345678901;
SELECT @@global.innodb_concurrency_tickets IN (12345678901,4294967295);
@@global.innodb_concurrency_tickets IN (12345678901,4294967295)
1
0
SET @@global.innodb_concurrency_tickets = 18446744073709551615;
SELECT @@global.innodb_concurrency_tickets IN (18446744073709551615,4294967295);
@@global.innodb_concurrency_tickets IN (18446744073709551615,4294967295)
1
0
'#--------------------FN_DYNVARS_046_05-------------------------#'
SET @@global.innodb_concurrency_tickets = -1;
Warnings:
Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '-1'
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = -1024;
Warnings:
Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '-1024'
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = "T";
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = "Y";
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = 1.1;
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = " ";
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = ' ';
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
'#----------------------FN_DYNVARS_046_06------------------------#'
SELECT @@global.innodb_concurrency_tickets =
VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
......@@ -97,34 +107,38 @@ VARIABLE_VALUE
1
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='innodb_concurrency_tickets';
VARIABLE_VALUE
1
0
'#---------------------FN_DYNVARS_046_07-------------------------#'
SET @@global.innodb_concurrency_tickets = OFF;
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = ON;
ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets'
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
'#---------------------FN_DYNVARS_046_08----------------------#'
SET @@global.innodb_concurrency_tickets = TRUE;
Warnings:
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = FALSE;
Warnings:
Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '0'
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
1
0
SET @@global.innodb_concurrency_tickets = @global_start_value;
Warnings:
Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect.
SELECT @@global.innodb_concurrency_tickets;
@@global.innodb_concurrency_tickets
5000
0
......@@ -24,33 +24,43 @@ select * from information_schema.session_variables where variable_name='innodb_r
VARIABLE_NAME VARIABLE_VALUE
INNODB_REPLICATION_DELAY 0
set global innodb_replication_delay=10;
Warnings:
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
10
0
select * from information_schema.global_variables where variable_name='innodb_replication_delay';
VARIABLE_NAME VARIABLE_VALUE
INNODB_REPLICATION_DELAY 10
INNODB_REPLICATION_DELAY 0
select * from information_schema.session_variables where variable_name='innodb_replication_delay';
VARIABLE_NAME VARIABLE_VALUE
INNODB_REPLICATION_DELAY 10
INNODB_REPLICATION_DELAY 0
set session innodb_replication_delay=1;
ERROR HY000: Variable 'innodb_replication_delay' is a GLOBAL variable and should be set with SET GLOBAL
set global innodb_replication_delay=DEFAULT;
Warnings:
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
0
set global innodb_replication_delay=0;
Warnings:
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
0
set global innodb_replication_delay=65535;
Warnings:
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
65535
0
set global innodb_replication_delay=4294967295;
Warnings:
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
4294967295
0
set global innodb_replication_delay=1.1;
ERROR 42000: Incorrect argument type to variable 'innodb_replication_delay'
set global innodb_replication_delay=1e1;
......@@ -61,21 +71,23 @@ set global innodb_replication_delay=' ';
ERROR 42000: Incorrect argument type to variable 'innodb_replication_delay'
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
4294967295
0
set global innodb_replication_delay=" ";
ERROR 42000: Incorrect argument type to variable 'innodb_replication_delay'
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
4294967295
0
set global innodb_replication_delay=-7;
Warnings:
Warning 1292 Truncated incorrect innodb_replication_delay value: '-7'
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
0
set global innodb_replication_delay=-1024;
Warnings:
Warning 1292 Truncated incorrect innodb_replication_delay value: '-1024'
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
select @@global.innodb_replication_delay;
@@global.innodb_replication_delay
0
......@@ -85,16 +97,18 @@ INNODB_REPLICATION_DELAY 0
SET @@global.innodb_replication_delay = 4294967296;
SELECT @@global.innodb_replication_delay IN (4294967296,4294967295);
@@global.innodb_replication_delay IN (4294967296,4294967295)
1
0
SET @@global.innodb_replication_delay = 12345678901;
SELECT @@global.innodb_replication_delay IN (12345678901,4294967295);
@@global.innodb_replication_delay IN (12345678901,4294967295)
1
0
SET @@global.innodb_replication_delay = 18446744073709551615;
SELECT @@global.innodb_replication_delay IN (18446744073709551615,4294967295);
@@global.innodb_replication_delay IN (18446744073709551615,4294967295)
1
0
SET @@global.innodb_replication_delay = @start_global_value;
Warnings:
Warning 138 The parameter innodb_replication_delay is deprecated and has no effect.
SELECT @@global.innodb_replication_delay;
@@global.innodb_replication_delay
0
......@@ -4,7 +4,11 @@ SELECT @global_start_value;
0
'#--------------------FN_DYNVARS_046_01------------------------#'
SET @@global.innodb_thread_concurrency = 0;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SET @@global.innodb_thread_concurrency = DEFAULT;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
0
......@@ -17,26 +21,35 @@ SELECT @@innodb_thread_concurrency;
SELECT local.innodb_thread_concurrency;
ERROR 42S02: Unknown table 'local' in field list
SET global innodb_thread_concurrency = 0;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
0
'#--------------------FN_DYNVARS_046_03------------------------#'
SET @@global.innodb_thread_concurrency = 0;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
0
SET @@global.innodb_thread_concurrency = 1;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1
0
SET @@global.innodb_thread_concurrency = 1000;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1000
0
'#--------------------FN_DYNVARS_046_04-------------------------#'
SET @@global.innodb_thread_concurrency = -1;
Warnings:
Warning 1292 Truncated incorrect innodb_thread_concurrency value: '-1'
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
0
......@@ -63,14 +76,15 @@ SELECT @@global.innodb_thread_concurrency;
SET @@global.innodb_thread_concurrency = 1001;
Warnings:
Warning 1292 Truncated incorrect innodb_thread_concurrency value: '1001'
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1000
0
SET @@global.innodb_thread_concurrency = 255.01;
ERROR 42000: Incorrect argument type to variable 'innodb_thread_concurrency'
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1000
0
'#----------------------FN_DYNVARS_046_05------------------------#'
SELECT @@global.innodb_thread_concurrency =
VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
......@@ -80,32 +94,38 @@ VARIABLE_VALUE
1
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1000
0
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME='innodb_thread_concurrency';
VARIABLE_VALUE
1000
0
'#---------------------FN_DYNVARS_046_06-------------------------#'
SET @@global.innodb_thread_concurrency = OFF;
ERROR 42000: Incorrect argument type to variable 'innodb_thread_concurrency'
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1000
0
SET @@global.innodb_thread_concurrency = ON;
ERROR 42000: Incorrect argument type to variable 'innodb_thread_concurrency'
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1000
0
'#---------------------FN_DYNVARS_046_07----------------------#'
SET @@global.innodb_thread_concurrency = TRUE;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
1
0
SET @@global.innodb_thread_concurrency = FALSE;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
0
SET @@global.innodb_thread_concurrency = @global_start_value;
Warnings:
Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect.
SELECT @@global.innodb_thread_concurrency;
@@global.innodb_thread_concurrency
0
SET @start_global_value = @@global.innodb_thread_sleep_delay;
SELECT @start_global_value;
@start_global_value
10000
0
Valid values are zero or above
select @@global.innodb_thread_sleep_delay >=0;
@@global.innodb_thread_sleep_delay >=0
1
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
10000
0
select @@session.innodb_thread_sleep_delay;
ERROR HY000: Variable 'innodb_thread_sleep_delay' is a GLOBAL variable
show global variables like 'innodb_thread_sleep_delay';
Variable_name Value
innodb_thread_sleep_delay 10000
innodb_thread_sleep_delay 0
show session variables like 'innodb_thread_sleep_delay';
Variable_name Value
innodb_thread_sleep_delay 10000
innodb_thread_sleep_delay 0
select * from information_schema.global_variables where variable_name='innodb_thread_sleep_delay';
VARIABLE_NAME VARIABLE_VALUE
INNODB_THREAD_SLEEP_DELAY 10000
INNODB_THREAD_SLEEP_DELAY 0
select * from information_schema.session_variables where variable_name='innodb_thread_sleep_delay';
VARIABLE_NAME VARIABLE_VALUE
INNODB_THREAD_SLEEP_DELAY 10000
INNODB_THREAD_SLEEP_DELAY 0
set global innodb_thread_sleep_delay=10;
Warnings:
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
10
0
select * from information_schema.global_variables where variable_name='innodb_thread_sleep_delay';
VARIABLE_NAME VARIABLE_VALUE
INNODB_THREAD_SLEEP_DELAY 10
INNODB_THREAD_SLEEP_DELAY 0
select * from information_schema.session_variables where variable_name='innodb_thread_sleep_delay';
VARIABLE_NAME VARIABLE_VALUE
INNODB_THREAD_SLEEP_DELAY 10
INNODB_THREAD_SLEEP_DELAY 0
set session innodb_thread_sleep_delay=1;
ERROR HY000: Variable 'innodb_thread_sleep_delay' is a GLOBAL variable and should be set with SET GLOBAL
set global innodb_thread_sleep_delay=1.1;
......@@ -45,9 +47,11 @@ set global innodb_thread_sleep_delay=18446744073709551616;
Warnings:
Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated
Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '9223372036854775807'
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
set global innodb_thread_sleep_delay=-7;
Warnings:
Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '-7'
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
0
......@@ -55,34 +59,46 @@ select * from information_schema.global_variables where variable_name='innodb_th
VARIABLE_NAME VARIABLE_VALUE
INNODB_THREAD_SLEEP_DELAY 0
set global innodb_thread_sleep_delay=0;
Warnings:
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
0
set global innodb_thread_sleep_delay=1000;
Warnings:
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
1000
0
set global innodb_thread_sleep_delay=1000000;
Warnings:
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
1000000
0
set global innodb_thread_sleep_delay=1000001;
Warnings:
Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '1000001'
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
1000000
0
set global innodb_thread_sleep_delay=4294967295;
Warnings:
Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '4294967295'
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
1000000
0
set global innodb_thread_sleep_delay=555;
Warnings:
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
select @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
555
0
SET @@global.innodb_thread_sleep_delay = @start_global_value;
Warnings:
Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect.
SELECT @@global.innodb_thread_sleep_delay;
@@global.innodb_thread_sleep_delay
10000
0
......@@ -59,10 +59,10 @@ READ_ONLY YES
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_ADAPTIVE_MAX_SLEEP_DELAY
SESSION_VALUE NULL
DEFAULT_VALUE 150000
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT The upper limit of the sleep delay in usec. Value of 0 disables it.
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 1000000
NUMERIC_BLOCK_SIZE 0
......@@ -385,8 +385,8 @@ VARIABLE_NAME INNODB_COMMIT_CONCURRENCY
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments.
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 1000
NUMERIC_BLOCK_SIZE 0
......@@ -455,12 +455,12 @@ READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_CONCURRENCY_TICKETS
SESSION_VALUE NULL
DEFAULT_VALUE 5000
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Number of times a thread is allowed to enter InnoDB within the same SQL query after it has once got the ticket
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 18446744073709551615
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
......@@ -1633,10 +1633,10 @@ VARIABLE_NAME INNODB_REPLICATION_DELAY
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Replication thread delay (ms) on the slave server if innodb_thread_concurrency is reached (0 by default)
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
......@@ -1933,8 +1933,8 @@ VARIABLE_NAME INNODB_THREAD_CONCURRENCY
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling.
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 1000
NUMERIC_BLOCK_SIZE 0
......@@ -1943,10 +1943,10 @@ READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_THREAD_SLEEP_DELAY
SESSION_VALUE NULL
DEFAULT_VALUE 10000
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 1000000
NUMERIC_BLOCK_SIZE 0
......
......@@ -52,8 +52,9 @@ SELECT @@global.innodb_commit_concurrency;
# Check if innodb_commit_concurrency can be accessed with and without @@ sign#
################################################################################
--Error ER_GLOBAL_VARIABLE
--error ER_GLOBAL_VARIABLE
SET innodb_commit_concurrency = 1;
SET GLOBAL innodb_commit_concurrency = 1;
SELECT @@innodb_commit_concurrency;
......@@ -79,14 +80,8 @@ SELECT @@global.innodb_commit_concurrency;
# Change the value of innodb_commit_concurrency to invalid value #
###########################################################################
#
# InnoDB doesn't allow innodb_commit_concurrency to change from
# zero to non-zero or vice versa
#
--Error ER_WRONG_VALUE_FOR_VAR
SET @@global.innodb_commit_concurrency = 1;
SELECT @@global.innodb_commit_concurrency;
--Error ER_WRONG_VALUE_FOR_VAR
SELECT @@global.innodb_commit_concurrency;
SET @@global.innodb_commit_concurrency = -1;
SELECT @@global.innodb_commit_concurrency;
--Error ER_WRONG_TYPE_FOR_VAR
......@@ -98,7 +93,6 @@ SELECT @@global.innodb_commit_concurrency;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.innodb_commit_concurrency = 1.1;
SELECT @@global.innodb_commit_concurrency;
--Error ER_WRONG_VALUE_FOR_VAR
SET @@global.innodb_commit_concurrency = 1001;
SELECT @@global.innodb_commit_concurrency;
......
......@@ -235,7 +235,6 @@ SET(INNOBASE_SOURCES
include/row0upd.h
include/row0upd.ic
include/row0vers.h
include/srv0conc.h
include/srv0mon.h
include/srv0mon.ic
include/srv0srv.h
......@@ -328,7 +327,6 @@ SET(INNOBASE_SOURCES
row/row0upd.cc
row/row0quiesce.cc
row/row0vers.cc
srv/srv0conc.cc
srv/srv0mon.cc
srv/srv0srv.cc
srv/srv0start.cc
......
This diff is collapsed.
......@@ -470,8 +470,7 @@ fill_innodb_trx_from_cache(
row->trx_rows_modified, true));
/* trx_concurrency_tickets */
OK(fields[IDX_TRX_CONNCURRENCY_TICKETS]->store(
row->trx_concurrency_tickets, true));
OK(fields[IDX_TRX_CONNCURRENCY_TICKETS]->store(0, true));
/* trx_isolation_level */
OK(fields[IDX_TRX_ISOLATION_LEVEL]->store(
......
......@@ -110,10 +110,7 @@ innobase_convert_name(
/******************************************************************//**
Returns true if the thread is the replication thread on the slave
server. Used in srv_conc_enter_innodb() to determine if the thread
should be allowed to enter InnoDB - the replication thread is treated
differently than other threads. Also used in
srv_conc_force_exit_innodb().
server.
@return true if thd is the replication thread */
ibool
thd_is_replication_slave_thread(
......
......@@ -35,6 +35,7 @@ typedef void que_node_t;
/* Query graph root is a fork node */
typedef struct que_fork_t que_t;
struct row_prebuilt_t;
struct que_thr_t;
/* Query graph node types */
......
/*****************************************************************************
Copyright (c) 2011, 2014, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
briefly in the InnoDB documentation. The contributions by Google are
incorporated with their permission, and subject to the conditions contained in
the file COPYING.Google.
Portions of this file contain modifications contributed and copyrighted
by Percona Inc.. Those modifications are
gratefully acknowledged and are described briefly in the InnoDB
documentation. The contributions by Percona Inc. are incorporated with
their permission, and subject to the conditions contained in the file
COPYING.Percona.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
*****************************************************************************/
/**************************************************//**
@file srv/srv0conc.h
InnoDB concurrency manager header file
Created 2011/04/18 Sunny Bains
*******************************************************/
#ifndef srv_conc_h
#define srv_conc_h
/** We are prepared for a situation that we have this many threads waiting for
a semaphore inside InnoDB. srv_start() sets the value. */
extern ulint srv_max_n_threads;
/** The following controls how many threads we let inside InnoDB concurrently:
threads waiting for locks are not counted into the number because otherwise
we could get a deadlock. Value of 0 will disable the concurrency check. */
extern ulong srv_thread_concurrency;
struct row_prebuilt_t;
/*********************************************************************//**
Puts an OS thread to wait if there are too many concurrent threads
(>= srv_thread_concurrency) inside InnoDB. The threads wait in a FIFO queue.
@param[in,out] prebuilt row prebuilt handler */
void
srv_conc_enter_innodb(
row_prebuilt_t* prebuilt);
/*********************************************************************//**
This lets a thread enter InnoDB regardless of the number of threads inside
InnoDB. This must be called when a thread ends a lock wait. */
void
srv_conc_force_enter_innodb(
/*========================*/
trx_t* trx); /*!< in: transaction object associated with
the thread */
/*********************************************************************//**
This must be called when a thread exits InnoDB in a lock wait or at the
end of an SQL statement. */
void
srv_conc_force_exit_innodb(
/*=======================*/
trx_t* trx); /*!< in: transaction object associated with
the thread */
/*********************************************************************//**
Get the count of threads waiting inside InnoDB. */
ulint
srv_conc_get_waiting_threads(void);
/*==============================*/
/*********************************************************************//**
Get the count of threads active inside InnoDB. */
ulint
srv_conc_get_active_threads(void);
/*==============================*/
#endif /* srv_conc_h */
......@@ -39,14 +39,12 @@ The server main program
Created 10/10/1995 Heikki Tuuri
*******************************************************/
#ifndef srv0srv_h
#define srv0srv_h
#pragma once
#include "log0log.h"
#include "os0event.h"
#include "que0types.h"
#include "trx0types.h"
#include "srv0conc.h"
#include "fil0fil.h"
#include "mysql/psi/mysql_stage.h"
......@@ -198,6 +196,10 @@ struct srv_stats_t
ulint_ctr_1_t lock_deadlock_count;
};
/** We are prepared for a situation that we have this many threads waiting for
a semaphore inside InnoDB. srv_start() sets the value. */
extern ulint srv_max_n_threads;
extern const char* srv_main_thread_op_info;
/** Prefix used by MySQL to indicate pre-5.1 table name encoding */
......@@ -246,10 +248,6 @@ extern my_bool high_level_read_only;
/** store to its own file each table created by an user; data
dictionary tables are in the system tablespace 0 */
extern my_bool srv_file_per_table;
/** Sleep delay for threads waiting to enter InnoDB. In micro-seconds. */
extern ulong srv_thread_sleep_delay;
/** Maximum sleep delay (in micro-seconds), value of 0 disables it.*/
extern ulong srv_adaptive_max_sleep_delay;
/** Sort buffer size in index creation */
extern ulong srv_sort_buf_size;
......@@ -423,8 +421,6 @@ extern double srv_max_buf_pool_modified_pct;
extern ulong srv_max_purge_lag;
extern ulong srv_max_purge_lag_delay;
extern ulong srv_replication_delay;
extern my_bool innodb_encrypt_temporary_tables;
extern my_bool srv_immediate_scrub_data_uncompressed;
......@@ -455,8 +451,6 @@ extern bool srv_monitor_active;
extern ulong srv_n_spin_wait_rounds;
extern ulong srv_n_free_tickets_to_enter;
extern ulong srv_thread_sleep_delay;
extern uint srv_spin_wait_delay;
extern ulint srv_truncated_status_writes;
......@@ -942,14 +936,3 @@ static inline void srv_start_periodic_timer(std::unique_ptr<tpool::timer>& t,
void srv_thread_pool_init();
void srv_thread_pool_end();
#ifdef WITH_WSREP
UNIV_INTERN
void
wsrep_srv_conc_cancel_wait(
/*==================*/
trx_t* trx); /*!< in: transaction object associated with the
thread */
#endif /* WITH_WSREP */
#endif
......@@ -24,8 +24,7 @@ Starts the Innobase database server
Created 10/10/1995 Heikki Tuuri
*******************************************************/
#ifndef srv0start_h
#define srv0start_h
#pragma once
#include "log0log.h"
#include "ut0byte.h"
......@@ -133,4 +132,3 @@ extern enum srv_shutdown_t srv_shutdown_state;
/** Files comprising the system tablespace */
extern pfs_os_file_t files[1000];
#endif
/*****************************************************************************
Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2019, MariaDB Corporation.
Copyright (c) 2017, 2020, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
......@@ -141,9 +141,6 @@ struct i_s_trx_row_t {
trx->lock_heap) */
ulint trx_rows_locked;/*!< lock_number_of_rows_locked() */
uintmax_t trx_rows_modified;/*!< trx_t::undo_no */
ulint trx_concurrency_tickets;
/*!< n_tickets_to_enter_innodb in
trx_t */
uint trx_isolation_level;
/*!< trx_t::isolation_level */
bool trx_unique_checks;
......
......@@ -864,17 +864,6 @@ struct trx_t : ilist_node<> {
ulint duplicates; /*!< TRX_DUP_IGNORE | TRX_DUP_REPLACE */
trx_dict_op_t dict_operation; /**< @see enum trx_dict_op_t */
/* Fields protected by the srv_conc_mutex. */
bool declared_to_be_inside_innodb;
/*!< this is TRUE if we have declared
this transaction in
srv_conc_enter_innodb to be inside the
InnoDB engine */
ib_uint32_t n_tickets_to_enter_innodb;
/*!< this can be > 0 only when
declared_to_... is TRUE; when we come
to srv_conc_innodb_enter, if the value
here is > 0, we decrement this by 1 */
ib_uint32_t dict_operation_lock_mode;
/*!< 0, RW_S_LATCH, or RW_X_LATCH:
the latch mode trx currently holds
......@@ -1018,10 +1007,6 @@ struct trx_t : ilist_node<> {
/*!< Total table lock wait time
up to this moment. */
#ifdef WITH_WSREP
os_event_t wsrep_event; /* event waited for in srv_conc_slot */
#endif /* WITH_WSREP */
rw_trx_hash_element_t *rw_trx_hash_element;
LF_PINS *rw_trx_hash_pins;
ulint magic_n;
......
......@@ -234,7 +234,6 @@ lock_wait_suspend_thread(
{
srv_slot_t* slot;
trx_t* trx;
ibool was_declared_inside_innodb;
ulong lock_wait_timeout;
ut_a(lock_sys.timeout_timer.get());
......@@ -329,16 +328,6 @@ lock_wait_suspend_thread(
/* Suspend this thread and wait for the event. */
was_declared_inside_innodb = trx->declared_to_be_inside_innodb;
if (was_declared_inside_innodb) {
/* We must declare this OS thread to exit InnoDB, since a
possible other thread holding a lock which this thread waits
for must be allowed to enter, sooner or later */
srv_conc_force_exit_innodb(trx);
}
/* Unknown is also treated like a record lock */
if (lock_type == ULINT_UNDEFINED || lock_type == LOCK_REC) {
thd_wait_begin(trx->mysql_thd, THD_WAIT_ROW_LOCK);
......@@ -354,13 +343,6 @@ lock_wait_suspend_thread(
/* After resuming, reacquire the data dictionary latch if
necessary. */
if (was_declared_inside_innodb) {
/* Return back inside InnoDB */
srv_conc_force_enter_innodb(trx);
}
if (had_dict_lock) {
row_mysql_freeze_data_dictionary(trx);
......
......@@ -448,7 +448,7 @@ log_set_capacity(ulonglong file_size)
by single query steps: running out of free log space is a serious
system error which requires rebooting the database. */
free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency)
free = LOG_CHECKPOINT_FREE_PER_THREAD * 10
+ LOG_CHECKPOINT_EXTRA_FREE;
if (free >= smallest_capacity / 2) {
ib::error() << "Cannot continue operation because log file is "
......
/*****************************************************************************
Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2020, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
briefly in the InnoDB documentation. The contributions by Google are
incorporated with their permission, and subject to the conditions contained in
the file COPYING.Google.
Portions of this file contain modifications contributed and copyrighted
by Percona Inc.. Those modifications are
gratefully acknowledged and are described briefly in the InnoDB
documentation. The contributions by Percona Inc. are incorporated with
their permission, and subject to the conditions contained in the file
COPYING.Percona.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
*****************************************************************************/
/**************************************************//**
@file srv/srv0conc.cc
InnoDB concurrency manager
Created 2011/04/18 Sunny Bains
*******************************************************/
#include "srv0srv.h"
#include "trx0trx.h"
#include "row0mysql.h"
#include "dict0dict.h"
#include <mysql/service_thd_wait.h>
#include <mysql/service_wsrep.h>
/** Number of times a thread is allowed to enter InnoDB within the same
SQL query after it has once got the ticket. */
ulong srv_n_free_tickets_to_enter = 500;
/** Maximum sleep delay (in micro-seconds), value of 0 disables it. */
ulong srv_adaptive_max_sleep_delay = 150000;
ulong srv_thread_sleep_delay = 10000;
/** We are prepared for a situation that we have this many threads waiting for
a semaphore inside InnoDB. srv_start() sets the value. */
ulint srv_max_n_threads;
/** The following controls how many threads we let inside InnoDB concurrently:
threads waiting for locks are not counted into the number because otherwise
we could get a deadlock. Value of 0 will disable the concurrency check. */
ulong srv_thread_concurrency = 0;
/** Variables tracking the active and waiting threads. */
struct srv_conc_t {
/** Number of transactions that have declared_to_be_inside_innodb */
MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) Atomic_counter<ulint> n_active;
/** Number of OS threads waiting in the FIFO for permission to
enter InnoDB */
MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) Atomic_counter<ulint> n_waiting;
};
/* Control variables for tracking concurrency. */
static srv_conc_t srv_conc;
/*********************************************************************//**
Note that a user thread is entering InnoDB. */
static
void
srv_enter_innodb_with_tickets(
/*==========================*/
trx_t* trx) /*!< in/out: transaction that wants
to enter InnoDB */
{
trx->declared_to_be_inside_innodb = TRUE;
trx->n_tickets_to_enter_innodb = static_cast<uint32_t>(
srv_n_free_tickets_to_enter);
}
/*********************************************************************//**
Handle the scheduling of a user thread that wants to enter InnoDB. Setting
srv_adaptive_max_sleep_delay > 0 switches the adaptive sleep calibration to
ON. When set, we want to wait in the queue for as little time as possible.
However, very short waits will result in a lot of context switches and that
is also not desirable. When threads need to sleep multiple times we increment
os_thread_sleep_delay by one. When we see threads getting a slot without
waiting and there are no other threads waiting in the queue, we try and reduce
the wait as much as we can. Currently we reduce it by half each time. If the
thread only had to wait for one turn before it was able to enter InnoDB we
decrement it by one. This is to try and keep the sleep time stable around the
"optimum" sleep time. */
static
void
srv_conc_enter_innodb_with_atomics(
/*===============================*/
trx_t* trx) /*!< in/out: transaction that wants
to enter InnoDB */
{
ulint n_sleeps = 0;
ibool notified_mysql = FALSE;
ut_a(!trx->declared_to_be_inside_innodb);
for (;;) {
ulint sleep_in_us;
#ifdef WITH_WSREP
if (trx->is_wsrep() && wsrep_thd_is_aborting(trx->mysql_thd)) {
if (UNIV_UNLIKELY(wsrep_debug)) {
ib::info() <<
"srv_conc_enter due to MUST_ABORT";
}
srv_conc_force_enter_innodb(trx);
return;
}
#endif /* WITH_WSREP */
if (srv_thread_concurrency == 0) {
if (notified_mysql) {
srv_conc.n_waiting--;
thd_wait_end(trx->mysql_thd);
}
return;
}
if (srv_conc.n_active < srv_thread_concurrency) {
/* Check if there are any free tickets. */
if (srv_conc.n_active++ < srv_thread_concurrency) {
srv_enter_innodb_with_tickets(trx);
if (notified_mysql) {
srv_conc.n_waiting--;
thd_wait_end(trx->mysql_thd);
}
if (srv_adaptive_max_sleep_delay > 0) {
if (srv_thread_sleep_delay > 20
&& n_sleeps == 1) {
--srv_thread_sleep_delay;
}
if (srv_conc.n_waiting == 0) {
srv_thread_sleep_delay >>= 1;
}
}
return;
}
/* Since there were no free seats, we relinquish
the overbooked ticket. */
srv_conc.n_active--;
}
if (!notified_mysql) {
srv_conc.n_waiting++;
thd_wait_begin(trx->mysql_thd, THD_WAIT_USER_LOCK);
notified_mysql = TRUE;
}
DEBUG_SYNC_C("user_thread_waiting");
trx->op_info = "sleeping before entering InnoDB";
sleep_in_us = srv_thread_sleep_delay;
/* Guard against overflow when adaptive sleep delay is on. */
if (srv_adaptive_max_sleep_delay > 0
&& sleep_in_us > srv_adaptive_max_sleep_delay) {
sleep_in_us = srv_adaptive_max_sleep_delay;
srv_thread_sleep_delay = static_cast<ulong>(sleep_in_us);
}
os_thread_sleep(sleep_in_us);
trx->op_info = "";
++n_sleeps;
if (srv_adaptive_max_sleep_delay > 0 && n_sleeps > 1) {
++srv_thread_sleep_delay;
}
}
}
/*********************************************************************//**
Note that a user thread is leaving InnoDB code. */
static
void
srv_conc_exit_innodb_with_atomics(
/*==============================*/
trx_t* trx) /*!< in/out: transaction */
{
trx->n_tickets_to_enter_innodb = 0;
trx->declared_to_be_inside_innodb = FALSE;
srv_conc.n_active--;
}
/*********************************************************************//**
Puts an OS thread to wait if there are too many concurrent threads
(>= srv_thread_concurrency) inside InnoDB. The threads wait in a FIFO queue.
@param[in,out] prebuilt row prebuilt handler */
void
srv_conc_enter_innodb(
row_prebuilt_t* prebuilt)
{
trx_t* trx = prebuilt->trx;
ut_ad(!sync_check_iterate(sync_check()));
srv_conc_enter_innodb_with_atomics(trx);
}
/*********************************************************************//**
This lets a thread enter InnoDB regardless of the number of threads inside
InnoDB. This must be called when a thread ends a lock wait. */
void
srv_conc_force_enter_innodb(
/*========================*/
trx_t* trx) /*!< in: transaction object associated with the
thread */
{
ut_ad(!sync_check_iterate(sync_check()));
if (!srv_thread_concurrency) {
return;
}
srv_conc.n_active++;
trx->n_tickets_to_enter_innodb = 1;
trx->declared_to_be_inside_innodb = TRUE;
}
/*********************************************************************//**
This must be called when a thread exits InnoDB in a lock wait or at the
end of an SQL statement. */
void
srv_conc_force_exit_innodb(
/*=======================*/
trx_t* trx) /*!< in: transaction object associated with the
thread */
{
if ((trx->mysql_thd != NULL
&& thd_is_replication_slave_thread(trx->mysql_thd))
|| trx->declared_to_be_inside_innodb == FALSE) {
return;
}
srv_conc_exit_innodb_with_atomics(trx);
ut_ad(!sync_check_iterate(sync_check()));
}
/*********************************************************************//**
Get the count of threads waiting inside InnoDB. */
ulint
srv_conc_get_waiting_threads(void)
/*==============================*/
{
return(srv_conc.n_waiting);
}
/*********************************************************************//**
Get the count of threads active inside InnoDB. */
ulint
srv_conc_get_active_threads(void)
/*==============================*/
{
return(srv_conc.n_active);
}
#ifdef WITH_WSREP
UNIV_INTERN
void
wsrep_srv_conc_cancel_wait(
/*=======================*/
trx_t* trx) /*!< in: transaction object associated with the
thread */
{
#ifdef HAVE_ATOMIC_BUILTINS
/* aborting transactions will enter innodb by force in
srv_conc_enter_innodb_with_atomics(). No need to cancel here,
thr will wake up after os_sleep and let to enter innodb
*/
if (UNIV_UNLIKELY(wsrep_debug)) {
ib::info() << "WSREP: conc slot cancel, no atomics";
}
#else
// JAN: TODO: MySQL 5.7
//os_fast_mutex_lock(&srv_conc_mutex);
if (trx->wsrep_event) {
if (UNIV_UNLIKELY(wsrep_debug)) {
ib::info() << "WSREP: conc slot cancel";
}
os_event_set(trx->wsrep_event);
}
//os_fast_mutex_unlock(&srv_conc_mutex);
#endif
}
#endif /* WITH_WSREP */
......@@ -348,9 +348,6 @@ number of pages to use in LRU and flush_list batch flushing.
The rest of the doublewrite buffer is used for single-page flushing. */
ulong srv_doublewrite_batch_size = 120;
/** innodb_replication_delay */
ulong srv_replication_delay;
/** innodb_sync_spin_loops */
ulong srv_n_spin_wait_rounds;
/** innodb_spin_wait_delay */
......@@ -1006,12 +1003,6 @@ srv_printf_innodb_monitor(
fputs("--------------\n"
"ROW OPERATIONS\n"
"--------------\n", file);
fprintf(file,
ULINTPF " queries inside InnoDB, "
ULINTPF " queries in queue\n",
srv_conc_get_active_threads(),
srv_conc_get_waiting_threads());
fprintf(file, ULINTPF " read views open inside InnoDB\n",
trx_sys.view_count());
......
......@@ -101,6 +101,10 @@ Created 2/16/1996 Heikki Tuuri
#include "zlib.h"
#include "ut0crc32.h"
/** We are prepared for a situation that we have this many threads waiting for
a semaphore inside InnoDB. srv_start() sets the value. */
ulint srv_max_n_threads;
/** Log sequence number at shutdown */
lsn_t srv_shutdown_lsn;
......@@ -1196,9 +1200,7 @@ dberr_t srv_start(bool create_new_db)
static_cast<int>(UT_ARR_SIZE(srv_stages)));
/* Set the maximum number of threads which can wait for a semaphore
inside InnoDB: this is the 'sync wait array' size, as well as the
maximum number of threads that can wait in the 'srv_conc array' for
their time to enter InnoDB. */
inside InnoDB: this is the 'sync wait array' size */
srv_max_n_threads = 1 /* io_ibuf_thread */
+ 1 /* io_log_thread */
......@@ -2096,12 +2098,6 @@ void innodb_shutdown()
case SRV_OPERATION_NORMAL:
/* Shut down the persistent files. */
logs_empty_and_mark_files_at_shutdown();
if (ulint n_threads = srv_conc_get_active_threads()) {
ib::warn() << "Query counter shows "
<< n_threads << " queries still"
" inside InnoDB at shutdown";
}
}
os_aio_free();
......
......@@ -499,8 +499,6 @@ fill_trx_row(
row->trx_rows_modified = trx->undo_no;
row->trx_concurrency_tickets = trx->n_tickets_to_enter_innodb;
row->trx_isolation_level = trx->isolation_level;
row->trx_unique_checks = (ibool) trx->check_unique_secondary;
......
......@@ -377,10 +377,6 @@ trx_t *trx_create()
ut_ad(trx->lock.rec_cached == 0);
ut_ad(UT_LIST_GET_LEN(trx->lock.evicted_tables) == 0);
#ifdef WITH_WSREP
trx->wsrep_event= NULL;
#endif /* WITH_WSREP */
trx_sys.register_trx(trx);
return(trx);
......@@ -392,25 +388,11 @@ trx_t *trx_create()
*/
void trx_free(trx_t*& trx)
{
ut_ad(!trx->declared_to_be_inside_innodb);
ut_ad(!trx->n_mysql_tables_in_use);
ut_ad(!trx->mysql_n_tables_locked);
ut_ad(!trx->internal);
ut_ad(!trx->mysql_log_file_name);
if (UNIV_UNLIKELY(trx->declared_to_be_inside_innodb)) {
ib::error() << "Freeing a trx ("
<< trx_get_id_for_print(trx) << ") which is declared"
" to be processing inside InnoDB";
trx_print(stderr, trx, 600);
putc('\n', stderr);
/* This is an error but not a fatal error. We must keep
the counters like srv_conc.n_active accurate. */
srv_conc_force_exit_innodb(trx);
}
if (trx->n_mysql_tables_in_use != 0
|| trx->mysql_n_tables_locked != 0) {
......@@ -1824,11 +1806,6 @@ trx_print_low(
fputs(" recovered trx", f);
}
if (trx->declared_to_be_inside_innodb) {
fprintf(f, ", thread declared inside InnoDB %lu",
(ulong) trx->n_tickets_to_enter_innodb);
}
putc('\n', f);
if (trx->n_mysql_tables_in_use > 0 || trx->mysql_n_tables_locked > 0) {
......
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