summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-05-23 17:34:08 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2019-05-23 17:34:47 +0300
commit893472d005b6c62209b15b0955af01a55069d8ef (patch)
tree72f257ae8d3d5c380711ac745feaff5e31c74d62
parentc83018751cc8eed11279eb6df555bd66c153fa9a (diff)
downloadmariadb-git-893472d005b6c62209b15b0955af01a55069d8ef.tar.gz
MDEV-19570 Deprecate and ignore innodb_undo_logs, remove innodb_rollback_segments
The option innodb_rollback_segments was deprecated already in MariaDB Server 10.0. Its misleadingly named replacement innodb_undo_logs is of very limited use. It makes sense to always create and use the maximum number of rollback segments. Let us remove the deprecated parameter innodb_rollback_segments and deprecate&ignore the parameter innodb_undo_logs (to be removed in a later major release). This work involves some cleanup of InnoDB startup. Similar to other write operations, DROP TABLE will no longer be allowed if innodb_force_recovery is set to a value larger than 3.
-rw-r--r--extra/mariabackup/xtrabackup.cc1
-rw-r--r--mysql-test/suite/innodb/r/innodb_bug12400341.result3
-rw-r--r--mysql-test/suite/innodb/r/innodb_force_recovery.result21
-rw-r--r--mysql-test/suite/innodb/r/undo_truncate.result3
-rw-r--r--mysql-test/suite/innodb/r/undo_truncate_recover.result1
-rw-r--r--mysql-test/suite/innodb/t/innodb_bug12400341-master.opt2
-rw-r--r--mysql-test/suite/innodb/t/innodb_bug12400341.test5
-rw-r--r--mysql-test/suite/innodb/t/innodb_force_recovery.test12
-rw-r--r--mysql-test/suite/innodb/t/undo_truncate.test3
-rw-r--r--mysql-test/suite/innodb/t/undo_truncate_recover.test1
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_rollback_segments_basic.result64
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_undo_logs_basic.result100
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff11
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb.result18
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_rollback_segments_basic.test64
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.opt1
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.test125
-rw-r--r--storage/innobase/handler/ha_innodb.cc58
-rw-r--r--storage/innobase/include/srv0srv.h5
-rw-r--r--storage/innobase/include/univ.i2
-rw-r--r--storage/innobase/log/log0recv.cc40
-rw-r--r--storage/innobase/srv/srv0srv.cc4
-rw-r--r--storage/innobase/srv/srv0start.cc101
-rw-r--r--storage/innobase/trx/trx0purge.cc2
-rw-r--r--storage/innobase/trx/trx0roll.cc5
-rw-r--r--storage/innobase/trx/trx0sys.cc65
-rw-r--r--storage/innobase/trx/trx0trx.cc12
27 files changed, 227 insertions, 502 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 14cfc67871c..12e793781cb 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -5441,7 +5441,6 @@ static bool xtrabackup_prepare_func(char** argv)
}
srv_max_n_threads = 1000;
- srv_undo_logs = 1;
srv_n_purge_threads = 1;
xb_filters_init();
diff --git a/mysql-test/suite/innodb/r/innodb_bug12400341.result b/mysql-test/suite/innodb/r/innodb_bug12400341.result
index b402af84231..7b7f1c1a981 100644
--- a/mysql-test/suite/innodb/r/innodb_bug12400341.result
+++ b/mysql-test/suite/innodb/r/innodb_bug12400341.result
@@ -1,7 +1,5 @@
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too*");
call mtr.add_suppression("\\[Warning\\] InnoDB: Cannot find a free slot for an undo log. Do you have too");
-set @old_innodb_undo_logs = @@innodb_undo_logs;
-set global innodb_undo_logs=1;
show variables like "max_connections";
Variable_name Value
max_connections 64
@@ -28,4 +26,3 @@ select count(*) from information_schema.processlist where command != 'Daemon';
count(*)
33
drop database mysqltest;
-set global innodb_undo_logs = @old_innodb_undo_logs;
diff --git a/mysql-test/suite/innodb/r/innodb_force_recovery.result b/mysql-test/suite/innodb/r/innodb_force_recovery.result
index 90b48bac187..8ca220aab8d 100644
--- a/mysql-test/suite/innodb/r/innodb_force_recovery.result
+++ b/mysql-test/suite/innodb/r/innodb_force_recovery.result
@@ -29,8 +29,10 @@ ERROR HY000: Error on rename of './test/t1' to './test/t3' (errno: 165 "Table is
truncate table t1;
ERROR HY000: Table 't1' is read only
drop table t1;
+ERROR HY000: Table 't1' is read only
show tables;
Tables_in_test
+t1
t2
# Restart the server with innodb_force_recovery as 5.
# restart: --innodb-force-recovery=5
@@ -47,10 +49,10 @@ drop index idx on t2;
ERROR HY000: Can't create table `test`.`t2` (errno: 165 "Table is read only")
update t2 set f1=3 where f2=2;
ERROR HY000: Running in read-only mode
-create table t1(f1 int not null)engine=innodb;
-ERROR HY000: Can't create table `test`.`t1` (errno: 165 "Table is read only")
-drop table t1;
-ERROR 42S02: Unknown table 'test.t1'
+create table t3(f1 int not null)engine=innodb;
+ERROR HY000: Can't create table `test`.`t3` (errno: 165 "Table is read only")
+drop table t3;
+ERROR 42S02: Unknown table 'test.t3'
rename table t2 to t3;
ERROR HY000: Error on rename of './test/t2' to './test/t3' (errno: 165 "Table is read only")
truncate table t2;
@@ -59,6 +61,7 @@ drop table t2;
ERROR HY000: Table 't2' is read only
show tables;
Tables_in_test
+t1
t2
# Restart the server with innodb_force_recovery as 6.
# restart: --innodb-force-recovery=6
@@ -75,10 +78,10 @@ drop index idx on t2;
ERROR HY000: Table 't2' is read only
update t2 set f1=3 where f2=2;
ERROR HY000: Table 't2' is read only
-create table t1(f1 int not null)engine=innodb;
-ERROR HY000: Can't create table `test`.`t1` (errno: 165 "Table is read only")
+create table t3(f1 int not null)engine=innodb;
+ERROR HY000: Can't create table `test`.`t3` (errno: 165 "Table is read only")
drop table t1;
-ERROR 42S02: Unknown table 'test.t1'
+ERROR HY000: Table 't1' is read only
rename table t2 to t3;
ERROR HY000: Error on rename of './test/t2' to './test/t3' (errno: 165 "Table is read only")
truncate table t2;
@@ -87,6 +90,7 @@ drop table t2;
ERROR HY000: Table 't2' is read only
show tables;
Tables_in_test
+t1
t2
# Restart the server with innodb_force_recovery=2
# restart: --innodb-force-recovery=2
@@ -96,10 +100,9 @@ f1 f2
begin;
update t2 set f2=3;
connect con1,localhost,root,,;
-create table t3(a int)engine=innodb;
# Force a redo log flush of the above uncommitted UPDATE
SET GLOBAL innodb_flush_log_at_trx_commit=1;
-drop table t3;
+drop table t1;
disconnect con1;
connection default;
# Kill the server
diff --git a/mysql-test/suite/innodb/r/undo_truncate.result b/mysql-test/suite/innodb/r/undo_truncate.result
index dce91a7461e..ad236bdecd4 100644
--- a/mysql-test/suite/innodb/r/undo_truncate.result
+++ b/mysql-test/suite/innodb/r/undo_truncate.result
@@ -1,8 +1,6 @@
-SET @save_undo_logs = @@GLOBAL.innodb_undo_logs;
SET @save_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
SET @save_truncate = @@GLOBAL.innodb_undo_log_truncate;
SET GLOBAL innodb_undo_log_truncate = 0;
-SET GLOBAL innodb_undo_logs = 4;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
SET @trunc_start=
(SELECT variable_value FROM information_schema.global_status
@@ -55,6 +53,5 @@ drop table t1, t2;
drop PROCEDURE populate_t1;
drop PROCEDURE populate_t2;
InnoDB 0 transactions not purged
-SET GLOBAL innodb_undo_logs = @save_undo_logs;
SET GLOBAL innodb_purge_rseg_truncate_frequency = @save_frequency;
SET GLOBAL innodb_undo_log_truncate = @save_truncate;
diff --git a/mysql-test/suite/innodb/r/undo_truncate_recover.result b/mysql-test/suite/innodb/r/undo_truncate_recover.result
index 212a1658e18..d7e6b3cf4be 100644
--- a/mysql-test/suite/innodb/r/undo_truncate_recover.result
+++ b/mysql-test/suite/innodb/r/undo_truncate_recover.result
@@ -1,4 +1,3 @@
-SET GLOBAL innodb_undo_logs = 4;
SET GLOBAL innodb_undo_log_truncate = 1;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
create table t1(keyc int primary key, c char(100)) engine = innodb;
diff --git a/mysql-test/suite/innodb/t/innodb_bug12400341-master.opt b/mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
index 13f480704f5..9f65e8b12e4 100644
--- a/mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
+++ b/mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
@@ -1 +1 @@
---max_connections=64 --innodb_thread_concurrency=0 --innodb_file_per_table --innodb_rollback_segments=2
+--max_connections=64 --innodb_thread_concurrency=0
diff --git a/mysql-test/suite/innodb/t/innodb_bug12400341.test b/mysql-test/suite/innodb/t/innodb_bug12400341.test
index 5fb0d63ebe7..3b5fd18a456 100644
--- a/mysql-test/suite/innodb/t/innodb_bug12400341.test
+++ b/mysql-test/suite/innodb/t/innodb_bug12400341.test
@@ -18,9 +18,6 @@ set @old_innodb_trx_rseg_n_slots_debug = @@innodb_trx_rseg_n_slots_debug;
set global innodb_trx_rseg_n_slots_debug = 32;
--enable_query_log
-set @old_innodb_undo_logs = @@innodb_undo_logs;
-set global innodb_undo_logs=1;
-
show variables like "max_connections";
show variables like "innodb_thread_concurrency";
show variables like "innodb_file_per_table";
@@ -105,8 +102,6 @@ while ($c)
#
drop database mysqltest;
-set global innodb_undo_logs = @old_innodb_undo_logs;
-
--disable_query_log
set global innodb_trx_rseg_n_slots_debug = @old_innodb_trx_rseg_n_slots_debug;
--enable_query_log
diff --git a/mysql-test/suite/innodb/t/innodb_force_recovery.test b/mysql-test/suite/innodb/t/innodb_force_recovery.test
index 926719e193c..4745156e400 100644
--- a/mysql-test/suite/innodb/t/innodb_force_recovery.test
+++ b/mysql-test/suite/innodb/t/innodb_force_recovery.test
@@ -52,6 +52,7 @@ rename table t1 to t3;
--error ER_OPEN_AS_READONLY
truncate table t1;
+--error ER_OPEN_AS_READONLY
drop table t1;
show tables;
@@ -77,10 +78,10 @@ drop index idx on t2;
update t2 set f1=3 where f2=2;
--error ER_CANT_CREATE_TABLE
-create table t1(f1 int not null)engine=innodb;
+create table t3(f1 int not null)engine=innodb;
--error ER_BAD_TABLE_ERROR
-drop table t1;
+drop table t3;
--error ER_ERROR_ON_RENAME
rename table t2 to t3;
@@ -114,9 +115,9 @@ drop index idx on t2;
update t2 set f1=3 where f2=2;
--error ER_CANT_CREATE_TABLE
-create table t1(f1 int not null)engine=innodb;
+create table t3(f1 int not null)engine=innodb;
---error ER_BAD_TABLE_ERROR
+--error ER_OPEN_AS_READONLY
drop table t1;
--error ER_ERROR_ON_RENAME
@@ -138,10 +139,9 @@ begin;
update t2 set f2=3;
connect (con1,localhost,root,,);
-create table t3(a int)engine=innodb;
--echo # Force a redo log flush of the above uncommitted UPDATE
SET GLOBAL innodb_flush_log_at_trx_commit=1;
-drop table t3;
+drop table t1;
disconnect con1;
connection default;
diff --git a/mysql-test/suite/innodb/t/undo_truncate.test b/mysql-test/suite/innodb/t/undo_truncate.test
index af6ed2b4372..b4c8e46150b 100644
--- a/mysql-test/suite/innodb/t/undo_truncate.test
+++ b/mysql-test/suite/innodb/t/undo_truncate.test
@@ -2,11 +2,9 @@
--source include/innodb_page_size.inc
--source include/have_undo_tablespaces.inc
-SET @save_undo_logs = @@GLOBAL.innodb_undo_logs;
SET @save_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
SET @save_truncate = @@GLOBAL.innodb_undo_log_truncate;
SET GLOBAL innodb_undo_log_truncate = 0;
-SET GLOBAL innodb_undo_logs = 4;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
SET @trunc_start=
@@ -117,6 +115,5 @@ if ($size1 == $size2)
}
}
-SET GLOBAL innodb_undo_logs = @save_undo_logs;
SET GLOBAL innodb_purge_rseg_truncate_frequency = @save_frequency;
SET GLOBAL innodb_undo_log_truncate = @save_truncate;
diff --git a/mysql-test/suite/innodb/t/undo_truncate_recover.test b/mysql-test/suite/innodb/t/undo_truncate_recover.test
index a143c25eaf0..2bcf031f02f 100644
--- a/mysql-test/suite/innodb/t/undo_truncate_recover.test
+++ b/mysql-test/suite/innodb/t/undo_truncate_recover.test
@@ -11,7 +11,6 @@
# Tests with embedded server do not support restarting
--source include/not_embedded.inc
-SET GLOBAL innodb_undo_logs = 4;
SET GLOBAL innodb_undo_log_truncate = 1;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
diff --git a/mysql-test/suite/sys_vars/r/innodb_rollback_segments_basic.result b/mysql-test/suite/sys_vars/r/innodb_rollback_segments_basic.result
deleted file mode 100644
index a8d392eee38..00000000000
--- a/mysql-test/suite/sys_vars/r/innodb_rollback_segments_basic.result
+++ /dev/null
@@ -1,64 +0,0 @@
-SET @start_global_value = @@global.innodb_rollback_segments;
-SELECT @start_global_value;
-@start_global_value
-128
-Valid values are zero or above
-SELECT @@global.innodb_rollback_segments >=0;
-@@global.innodb_rollback_segments >=0
-1
-SELECT @@global.innodb_rollback_segments <=128;
-@@global.innodb_rollback_segments <=128
-1
-SELECT @@global.innodb_rollback_segments;
-@@global.innodb_rollback_segments
-128
-SELECT @@session.innodb_rollback_segments;
-ERROR HY000: Variable 'innodb_rollback_segments' is a GLOBAL variable
-SHOW global variables LIKE 'innodb_rollback_segments';
-Variable_name Value
-innodb_rollback_segments 128
-SHOW session variables LIKE 'innodb_rollback_segments';
-Variable_name Value
-innodb_rollback_segments 128
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_rollback_segments';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_ROLLBACK_SEGMENTS 128
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_rollback_segments';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_ROLLBACK_SEGMENTS 128
-SET global innodb_rollback_segments=100;
-SELECT @@global.innodb_rollback_segments;
-@@global.innodb_rollback_segments
-100
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_rollback_segments';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_ROLLBACK_SEGMENTS 100
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_rollback_segments';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_ROLLBACK_SEGMENTS 100
-SET session innodb_rollback_segments=1;
-ERROR HY000: Variable 'innodb_rollback_segments' is a GLOBAL variable and should be set with SET GLOBAL
-SET global innodb_rollback_segments=1.1;
-ERROR 42000: Incorrect argument type to variable 'innodb_rollback_segments'
-SET global innodb_rollback_segments=1e1;
-ERROR 42000: Incorrect argument type to variable 'innodb_rollback_segments'
-SET global innodb_rollback_segments="foo";
-ERROR 42000: Incorrect argument type to variable 'innodb_rollback_segments'
-SET global innodb_rollback_segments=-7;
-Warnings:
-Warning 1292 Truncated incorrect innodb_rollback_segments value: '-7'
-SELECT @@global.innodb_rollback_segments;
-@@global.innodb_rollback_segments
-1
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_rollback_segments';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_ROLLBACK_SEGMENTS 1
-SET @@global.innodb_rollback_segments = @start_global_value;
-SELECT @@global.innodb_rollback_segments;
-@@global.innodb_rollback_segments
-128
diff --git a/mysql-test/suite/sys_vars/r/innodb_undo_logs_basic.result b/mysql-test/suite/sys_vars/r/innodb_undo_logs_basic.result
index 1310d7151fd..d6ff67ccc7d 100644
--- a/mysql-test/suite/sys_vars/r/innodb_undo_logs_basic.result
+++ b/mysql-test/suite/sys_vars/r/innodb_undo_logs_basic.result
@@ -1,68 +1,44 @@
-SELECT @@GLOBAL.innodb_undo_logs;
-@@GLOBAL.innodb_undo_logs
+SELECT @@global.innodb_undo_logs;
+@@global.innodb_undo_logs
128
-128 Expected
-SET @@GLOBAL.innodb_undo_logs=128;
-SELECT COUNT(@@GLOBAL.innodb_undo_logs);
-COUNT(@@GLOBAL.innodb_undo_logs)
-1
-1 Expected
-SELECT VARIABLE_VALUE
-FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
-WHERE VARIABLE_NAME='innodb_undo_logs';
-VARIABLE_VALUE
-128
-128 Expected
-SELECT @@innodb_undo_logs = @@GLOBAL.innodb_undo_logs;
-@@innodb_undo_logs = @@GLOBAL.innodb_undo_logs
-1
-1 Expected
-SELECT COUNT(@@innodb_undo_logs);
-COUNT(@@innodb_undo_logs)
-1
-1 Expected
-SELECT COUNT(@@local.innodb_undo_logs);
-ERROR HY000: Variable 'innodb_undo_logs' is a GLOBAL variable
-Expected error 'Variable is a GLOBAL variable'
-SELECT COUNT(@@SESSION.innodb_undo_logs);
+SELECT @@session.innodb_undo_logs;
ERROR HY000: Variable 'innodb_undo_logs' is a GLOBAL variable
-Expected error 'Variable is a GLOBAL variable'
-SELECT innodb_undo_logs = @@SESSION.innodb_undo_logs;
-ERROR 42S22: Unknown column 'innodb_undo_logs' in 'field list'
-Begin bug 13604034
-select @@innodb_undo_logs;
-@@innodb_undo_logs
-128
-128 Expected
-set global innodb_undo_logs = 129;
+SHOW global variables LIKE 'innodb_undo_logs';
+Variable_name Value
+innodb_undo_logs 128
+SHOW session variables LIKE 'innodb_undo_logs';
+Variable_name Value
+innodb_undo_logs 128
+SELECT * FROM information_schema.global_variables
+WHERE variable_name='innodb_undo_logs';
+VARIABLE_NAME VARIABLE_VALUE
+INNODB_UNDO_LOGS 128
+SELECT * FROM information_schema.session_variables
+WHERE variable_name='innodb_undo_logs';
+VARIABLE_NAME VARIABLE_VALUE
+INNODB_UNDO_LOGS 128
+SET global innodb_undo_logs=100;
Warnings:
-Warning 1292 Truncated incorrect innodb_undo_logs value: '129'
-select @@innodb_undo_logs;
-@@innodb_undo_logs
+Warning 138 The parameter innodb_undo_logs is deprecated and has no effect.
+SELECT @@global.innodb_undo_logs;
+@@global.innodb_undo_logs
128
-128 Expected
-set global innodb_undo_logs = 0;
-Warnings:
-Warning 1292 Truncated incorrect innodb_undo_logs value: '0'
-select @@innodb_undo_logs;
-@@innodb_undo_logs
-1
-1 Expected
-set global innodb_undo_logs = -1;
+SET session innodb_undo_logs=1;
+ERROR HY000: Variable 'innodb_undo_logs' is a GLOBAL variable and should be set with SET GLOBAL
+SET global innodb_undo_logs=1.1;
+ERROR 42000: Incorrect argument type to variable 'innodb_undo_logs'
+SET global innodb_undo_logs=1e1;
+ERROR 42000: Incorrect argument type to variable 'innodb_undo_logs'
+SET global innodb_undo_logs="foo";
+ERROR 42000: Incorrect argument type to variable 'innodb_undo_logs'
+SET global innodb_undo_logs=-7;
Warnings:
-Warning 1292 Truncated incorrect innodb_undo_logs value: '-1'
-select @@innodb_undo_logs;
-@@innodb_undo_logs
-1
-1 Expected
-set global innodb_undo_logs = 50;
-select @@innodb_undo_logs;
-@@innodb_undo_logs
-50
-50 Expected
-set global innodb_undo_logs = default;
-select @@innodb_undo_logs;
-@@innodb_undo_logs
+Warning 1292 Truncated incorrect innodb_undo_logs value: '-7'
+Warning 138 The parameter innodb_undo_logs is deprecated and has no effect.
+SELECT @@global.innodb_undo_logs;
+@@global.innodb_undo_logs
128
-128 Expected
-End bug 13604034
+SELECT * FROM information_schema.global_variables
+WHERE variable_name='innodb_undo_logs';
+VARIABLE_NAME VARIABLE_VALUE
+INNODB_UNDO_LOGS 128
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
index 2f5fb044f1b..2d299817d53 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
@@ -457,15 +457,6 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -1932,7 +1932,7 @@
- GLOBAL_VALUE_ORIGIN COMPILE-TIME
- DEFAULT_VALUE 128
- VARIABLE_SCOPE GLOBAL
--VARIABLE_TYPE BIGINT UNSIGNED
-+VARIABLE_TYPE INT UNSIGNED
- VARIABLE_COMMENT Number of undo logs to use (deprecated).
- NUMERIC_MIN_VALUE 1
- NUMERIC_MAX_VALUE 128
@@ -1946,7 +1946,7 @@
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
@@ -530,7 +521,7 @@
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT UNSIGNED
- VARIABLE_COMMENT Number of undo logs to use.
+ VARIABLE_COMMENT Deprecated parameter with no effect.
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 128
@@ -2394,7 +2394,7 @@
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
index 1e3f3faafe7..440e27edaf0 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
@@ -1926,20 +1926,6 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY YES
COMMAND_LINE_ARGUMENT OPTIONAL
-VARIABLE_NAME INNODB_ROLLBACK_SEGMENTS
-SESSION_VALUE NULL
-GLOBAL_VALUE 128
-GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE 128
-VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
-VARIABLE_COMMENT Number of undo logs to use (deprecated).
-NUMERIC_MIN_VALUE 1
-NUMERIC_MAX_VALUE 128
-NUMERIC_BLOCK_SIZE 0
-ENUM_VALUE_LIST NULL
-READ_ONLY NO
-COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_SAVED_PAGE_NUMBER_DEBUG
SESSION_VALUE NULL
GLOBAL_VALUE 0
@@ -2353,8 +2339,8 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 128
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
-VARIABLE_COMMENT Number of undo logs to use.
-NUMERIC_MIN_VALUE 1
+VARIABLE_COMMENT Deprecated parameter with no effect.
+NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 128
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
diff --git a/mysql-test/suite/sys_vars/t/innodb_rollback_segments_basic.test b/mysql-test/suite/sys_vars/t/innodb_rollback_segments_basic.test
deleted file mode 100644
index 33223d4c064..00000000000
--- a/mysql-test/suite/sys_vars/t/innodb_rollback_segments_basic.test
+++ /dev/null
@@ -1,64 +0,0 @@
-#
-# 2011-08-01 Added
-#
-
---source include/have_innodb.inc
-
-SET @start_global_value = @@global.innodb_rollback_segments;
-SELECT @start_global_value;
-
-#
-# exists as global only
-#
---echo Valid values are zero or above
-SELECT @@global.innodb_rollback_segments >=0;
-SELECT @@global.innodb_rollback_segments <=128;
-SELECT @@global.innodb_rollback_segments;
-
---error ER_INCORRECT_GLOBAL_LOCAL_VAR
-SELECT @@session.innodb_rollback_segments;
-SHOW global variables LIKE 'innodb_rollback_segments';
-SHOW session variables LIKE 'innodb_rollback_segments';
---disable_warnings
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_rollback_segments';
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_rollback_segments';
---enable_warnings
-
-#
-# show that it's writable
-#
-SET global innodb_rollback_segments=100;
-SELECT @@global.innodb_rollback_segments;
---disable_warnings
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_rollback_segments';
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_rollback_segments';
---enable_warnings
---error ER_GLOBAL_VARIABLE
-SET session innodb_rollback_segments=1;
-
-#
-# incorrect types
-#
---error ER_WRONG_TYPE_FOR_VAR
-SET global innodb_rollback_segments=1.1;
---error ER_WRONG_TYPE_FOR_VAR
-SET global innodb_rollback_segments=1e1;
---error ER_WRONG_TYPE_FOR_VAR
-SET global innodb_rollback_segments="foo";
-SET global innodb_rollback_segments=-7;
-SELECT @@global.innodb_rollback_segments;
---disable_warnings
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_rollback_segments';
---enable_warnings
-
-#
-# cleanup
-#
-
-SET @@global.innodb_rollback_segments = @start_global_value;
-SELECT @@global.innodb_rollback_segments;
diff --git a/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.opt b/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.opt
new file mode 100644
index 00000000000..71866672bd9
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.opt
@@ -0,0 +1 @@
+--innodb-undo-logs=42
diff --git a/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.test b/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.test
index f83b5ede247..54ee06d94cb 100644
--- a/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.test
+++ b/mysql-test/suite/sys_vars/t/innodb_undo_logs_basic.test
@@ -1,97 +1,42 @@
-################## mysql-test/t/innodb_undo_logs_basic.test ############
-# #
-# Variable Name: innodb_undo_logs #
-# Scope: Global #
-# Access Type: Static #
-# Data Type: numeric #
-# #
-# #
-# Creation Date: 2011-07-05 #
-# Author : Sunny Bains #
-# #
-# #
-# Description: Read-only config global variable innodb_undo_logs #
-# * Value check #
-# * Scope check #
-# #
-###############################################################################
+#
+# 2011-08-01 Added
+#
--source include/have_innodb.inc
-####################################################################
-# Display default value #
-####################################################################
-SELECT @@GLOBAL.innodb_undo_logs;
---echo 128 Expected
-
-
-####################################################################
-# Check if value can be set #
-####################################################################
-
-SET @@GLOBAL.innodb_undo_logs=128;
-
-SELECT COUNT(@@GLOBAL.innodb_undo_logs);
---echo 1 Expected
-
-
-################################################################################
-# Check if the value in GLOBAL table matches value in variable #
-################################################################################
+#
+# exists as global only
+#
+SELECT @@global.innodb_undo_logs;
+--error ER_INCORRECT_GLOBAL_LOCAL_VAR
+SELECT @@session.innodb_undo_logs;
+SHOW global variables LIKE 'innodb_undo_logs';
+SHOW session variables LIKE 'innodb_undo_logs';
--disable_warnings
-SELECT VARIABLE_VALUE
-FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
-WHERE VARIABLE_NAME='innodb_undo_logs';
+SELECT * FROM information_schema.global_variables
+WHERE variable_name='innodb_undo_logs';
+SELECT * FROM information_schema.session_variables
+WHERE variable_name='innodb_undo_logs';
--enable_warnings
---echo 128 Expected
-
-
-################################################################################
-# Check if accessing variable with and without GLOBAL point to same variable #
-################################################################################
-SELECT @@innodb_undo_logs = @@GLOBAL.innodb_undo_logs;
---echo 1 Expected
-
-################################################################################
-# Check if innodb_undo_logs can be accessed with and without @@ sign #
-################################################################################
-
-SELECT COUNT(@@innodb_undo_logs);
---echo 1 Expected
-
---Error ER_INCORRECT_GLOBAL_LOCAL_VAR
-SELECT COUNT(@@local.innodb_undo_logs);
---echo Expected error 'Variable is a GLOBAL variable'
-
---Error ER_INCORRECT_GLOBAL_LOCAL_VAR
-SELECT COUNT(@@SESSION.innodb_undo_logs);
---echo Expected error 'Variable is a GLOBAL variable'
-
---Error ER_BAD_FIELD_ERROR
-SELECT innodb_undo_logs = @@SESSION.innodb_undo_logs;
-
-# Begin Bug 13604034
-# SET GLOBAL INNODB_UNDO_LOGS=0 SUCCEEDS BUT LEADS TO AN ASSERT
-# MAX_UNDO_LOGS > 0
---echo Begin bug 13604034
-select @@innodb_undo_logs;
---echo 128 Expected
-set global innodb_undo_logs = 129;
-select @@innodb_undo_logs;
---echo 128 Expected
-set global innodb_undo_logs = 0;
-select @@innodb_undo_logs;
---echo 1 Expected
-set global innodb_undo_logs = -1;
-select @@innodb_undo_logs;
---echo 1 Expected
-set global innodb_undo_logs = 50;
-select @@innodb_undo_logs;
---echo 50 Expected
-set global innodb_undo_logs = default;
-select @@innodb_undo_logs;
---echo 128 Expected
---echo End bug 13604034
-# End Bug 13604034
+SET global innodb_undo_logs=100;
+SELECT @@global.innodb_undo_logs;
+--error ER_GLOBAL_VARIABLE
+SET session innodb_undo_logs=1;
+
+#
+# incorrect types
+#
+--error ER_WRONG_TYPE_FOR_VAR
+SET global innodb_undo_logs=1.1;
+--error ER_WRONG_TYPE_FOR_VAR
+SET global innodb_undo_logs=1e1;
+--error ER_WRONG_TYPE_FOR_VAR
+SET global innodb_undo_logs="foo";
+SET global innodb_undo_logs=-7;
+SELECT @@global.innodb_undo_logs;
+--disable_warnings
+SELECT * FROM information_schema.global_variables
+WHERE variable_name='innodb_undo_logs';
+--enable_warnings
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 5a79782f5b3..0ccd4384ab0 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -1054,8 +1054,7 @@ static SHOW_VAR innodb_status_variables[]= {
(char*) &export_vars.innodb_num_open_files, SHOW_LONG},
{"truncated_status_writes",
(char*) &export_vars.innodb_truncated_status_writes, SHOW_LONG},
- {"available_undo_logs",
- (char*) &export_vars.innodb_available_undo_logs, SHOW_LONG},
+ {"available_undo_logs", &srv_available_undo_logs, SHOW_ULONG},
{"undo_truncations",
(char*) &export_vars.innodb_undo_truncations, SHOW_LONG},
@@ -3656,6 +3655,11 @@ static my_bool innodb_log_checksums;
/** Deprecation message for innodb_log_checksums */
static const char* innodb_log_checksums_deprecated
= "The parameter innodb_log_checksums is deprecated and has no effect.";
+/** Deprecated parameter with no effect */
+static ulong innodb_undo_logs;
+/** Deprecation message for innodb_undo_logs */
+static const char* innodb_undo_logs_deprecated
+= "The parameter innodb_undo_logs is deprecated and has no effect.";
/** Initialize, validate and normalize the InnoDB startup parameters.
@return failure code
@@ -3971,11 +3975,16 @@ static int innodb_init_params()
srv_buf_pool_size = ulint(innobase_buffer_pool_size);
- if (!innodb_log_checksums) {
+ if (UNIV_UNLIKELY(!innodb_log_checksums)) {
sql_print_warning(innodb_log_checksums_deprecated);
innodb_log_checksums = TRUE;
}
+ if (UNIV_UNLIKELY(innodb_undo_logs != TRX_SYS_N_RSEGS)) {
+ sql_print_warning(innodb_undo_logs_deprecated);
+ innodb_undo_logs = TRX_SYS_N_RSEGS;
+ }
+
row_rollback_on_timeout = (ibool) innobase_rollback_on_timeout;
if (innobase_open_files < 10) {
@@ -12849,8 +12858,7 @@ inline int ha_innobase::delete_table(const char* name, enum_sql_command sqlcom)
extension, in contrast to ::create */
normalize_table_name(norm_name, name);
- if (srv_read_only_mode
- || srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) {
+ if (high_level_read_only) {
DBUG_RETURN(HA_ERR_TABLE_READONLY);
}
@@ -18464,6 +18472,16 @@ innodb_log_checksums_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
innodb_log_checksums_deprecated);
}
+/** Issue a deprecation warning for SET GLOBAL innodb_undo_logs.
+@param[in,out] thd client connection */
+static void
+innodb_undo_logs_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
+{
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ HA_ERR_UNSUPPORTED,
+ innodb_undo_logs_deprecated);
+}
+
static SHOW_VAR innodb_status_variables_export[]= {
{"Innodb", (char*) &show_innodb_vars, SHOW_FUNC},
{NullS, NullS, SHOW_LONG}
@@ -18658,10 +18676,13 @@ static MYSQL_SYSVAR_ENUM(checksum_algorithm, srv_checksum_algorithm,
NULL, NULL, SRV_CHECKSUM_ALGORITHM_FULL_CRC32,
&innodb_checksum_algorithm_typelib);
+/** Description of deprecated and ignored parameters */
+static const char* innodb_deprecated_ignored
+= "Deprecated parameter with no effect.";
+
static MYSQL_SYSVAR_BOOL(log_checksums, innodb_log_checksums,
PLUGIN_VAR_RQCMDARG,
- "Deprecated parameter with no effect.",
- NULL, innodb_log_checksums_warn, TRUE);
+ innodb_deprecated_ignored, NULL, innodb_log_checksums_warn, TRUE);
static MYSQL_SYSVAR_STR(data_home_dir, innobase_data_home_dir,
PLUGIN_VAR_READONLY,
@@ -18804,10 +18825,10 @@ static MYSQL_SYSVAR_ENUM(flush_method, innodb_flush_method,
static MYSQL_SYSVAR_STR(file_format, innodb_file_format,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
- "Deprecated parameter with no effect.", NULL, NULL, NULL);
+ innodb_deprecated_ignored, NULL, NULL, NULL);
static MYSQL_SYSVAR_STR(large_prefix, innodb_large_prefix,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
- "Deprecated parameter with no effect.", NULL, NULL, NULL);
+ innodb_deprecated_ignored, NULL, NULL, NULL);
static MYSQL_SYSVAR_BOOL(force_load_corrupted, srv_load_corrupted,
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
@@ -19377,13 +19398,10 @@ static MYSQL_SYSVAR_ULONG(undo_tablespaces, srv_undo_tablespaces,
0L, /* Minimum value */
TRX_SYS_MAX_UNDO_SPACES, 0); /* Maximum value */
-static MYSQL_SYSVAR_ULONG(undo_logs, srv_undo_logs,
+static MYSQL_SYSVAR_ULONG(undo_logs, innodb_undo_logs,
PLUGIN_VAR_OPCMDARG,
- "Number of undo logs to use.",
- NULL, NULL,
- TRX_SYS_N_RSEGS, /* Default setting */
- 1, /* Minimum value */
- TRX_SYS_N_RSEGS, 0); /* Maximum value */
+ innodb_deprecated_ignored, NULL, innodb_undo_logs_warn,
+ TRX_SYS_N_RSEGS, 0, TRX_SYS_N_RSEGS, 0);
static MYSQL_SYSVAR_ULONGLONG(max_undo_log_size, srv_max_undo_log_size,
PLUGIN_VAR_OPCMDARG,
@@ -19404,15 +19422,6 @@ static MYSQL_SYSVAR_BOOL(undo_log_truncate, srv_undo_log_truncate,
"Enable or Disable Truncate of UNDO tablespace.",
NULL, NULL, FALSE);
-/* Alias for innodb_undo_logs, this config variable is deprecated. */
-static MYSQL_SYSVAR_ULONG(rollback_segments, srv_undo_logs,
- PLUGIN_VAR_OPCMDARG,
- "Number of undo logs to use (deprecated).",
- NULL, NULL,
- TRX_SYS_N_RSEGS, /* Default setting */
- 1, /* Minimum value */
- TRX_SYS_N_RSEGS, 0); /* Maximum value */
-
static MYSQL_SYSVAR_LONG(autoinc_lock_mode, innobase_autoinc_lock_mode,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"The AUTOINC lock modes supported by InnoDB:"
@@ -19955,7 +19964,6 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(max_undo_log_size),
MYSQL_SYSVAR(purge_rseg_truncate_frequency),
MYSQL_SYSVAR(undo_log_truncate),
- MYSQL_SYSVAR(rollback_segments),
MYSQL_SYSVAR(undo_directory),
MYSQL_SYSVAR(undo_tablespaces),
MYSQL_SYSVAR(sync_array_size),
diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
index 60b284a46a0..a5bd790b741 100644
--- a/storage/innobase/include/srv0srv.h
+++ b/storage/innobase/include/srv0srv.h
@@ -305,9 +305,6 @@ srv_is_undo_tablespace(ulint space_id)
+ srv_undo_tablespaces_open);
}
-/** The number of undo segments to use */
-extern ulong srv_undo_logs;
-
/** Maximum size of undo tablespace. */
extern unsigned long long srv_max_undo_log_size;
@@ -966,8 +963,6 @@ struct export_var_t{
ulint innodb_system_rows_deleted; /*!< srv_n_system_rows_deleted*/
ulint innodb_num_open_files; /*!< fil_system_t::n_open */
ulint innodb_truncated_status_writes; /*!< srv_truncated_status_writes */
- ulint innodb_available_undo_logs; /*!< srv_available_undo_logs
- */
/** Number of undo tablespace truncation operations */
ulong innodb_undo_truncations;
ulint innodb_defragment_compression_failures; /*!< Number of
diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i
index 31380f09d0f..206dbf56257 100644
--- a/storage/innobase/include/univ.i
+++ b/storage/innobase/include/univ.i
@@ -446,8 +446,6 @@ typedef ib_uint64_t lsn_t;
/** The 'undefined' value for a ulint */
#define ULINT_UNDEFINED ((ulint)(-1))
-#define ULONG_UNDEFINED ((ulong)(-1))
-
/** The 'undefined' value for a ib_uint64_t */
#define UINT64_UNDEFINED ((ib_uint64_t)(-1))
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index 939a2997c4f..087c29ea86c 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -55,8 +55,6 @@ Created 9/20/1997 Heikki Tuuri
#include "buf0rea.h"
#include "srv0srv.h"
#include "srv0start.h"
-#include "trx0roll.h"
-#include "row0merge.h"
/** Log records are stored in the hash table in chunks at most of this size;
this must be less than srv_page_size as it is stored in the buffer pool */
@@ -117,7 +115,6 @@ the recovery failed and the database may be corrupt. */
static lsn_t recv_max_page_lsn;
#ifdef UNIV_PFS_THREAD
-mysql_pfs_key_t trx_rollback_clean_thread_key;
mysql_pfs_key_t recv_writer_thread_key;
#endif /* UNIV_PFS_THREAD */
@@ -3826,43 +3823,8 @@ recv_recovery_from_checkpoint_finish(void)
/* Free up the flush_rbt. */
buf_flush_free_flush_rbt();
-}
-
-/********************************************************//**
-Initiates the rollback of active transactions. */
-void
-recv_recovery_rollback_active(void)
-/*===============================*/
-{
- ut_ad(!recv_writer_thread_active);
-
- /* Switch latching order checks on in sync0debug.cc, if
- --innodb-sync-debug=true (default) */
+ /* Enable innodb_sync_debug checks */
ut_d(sync_check_enable());
-
- /* We can't start any (DDL) transactions if UNDO logging
- has been disabled, additionally disable ROLLBACK of recovered
- user transactions. */
- if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO
- && !srv_read_only_mode) {
-
- /* Drop partially created indexes. */
- row_merge_drop_temp_indexes();
- /* Drop garbage tables. */
- row_mysql_drop_garbage_tables();
-
- /* Drop any auxiliary tables that were not dropped when the
- parent table was dropped. This can happen if the parent table
- was dropped but the server crashed before the auxiliary tables
- were dropped. */
- fts_drop_orphaned_tables();
-
- /* Rollback the uncommitted transactions which have no user
- session */
-
- trx_rollback_is_active = true;
- os_thread_create(trx_rollback_all_recovered, 0, 0);
- }
}
/** Find a doublewrite copy of a page.
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index 9a855932402..8d8098dc902 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -117,9 +117,6 @@ segment). It is quite possible that some of the tablespaces doesn't host
any of the rollback-segment based on configuration used. */
ulint srv_undo_tablespaces_active;
-/* The number of rollback segments to use */
-ulong srv_undo_logs;
-
/** Rate at which UNDO records should be purged. */
ulong srv_purge_rseg_truncate_frequency;
@@ -1568,7 +1565,6 @@ srv_export_innodb_status(void)
export_vars.innodb_truncated_status_writes =
srv_truncated_status_writes;
- export_vars.innodb_available_undo_logs = srv_available_undo_logs;
export_vars.innodb_page_compression_saved = srv_stats.page_compression_saved;
export_vars.innodb_index_pages_written = srv_stats.index_pages_written;
export_vars.innodb_non_index_pages_written = srv_stats.non_index_pages_written;
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index bde0623c228..dde743f58c1 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -1307,7 +1307,6 @@ dberr_t srv_start(bool create_new_db)
|| srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT);
-
if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) {
srv_read_only_mode = true;
}
@@ -2099,10 +2098,39 @@ files_checked:
return(srv_init_abort(err));
}
}
+ }
+
+ ut_ad(err == DB_SUCCESS);
+ ut_a(sum_of_new_sizes != ULINT_UNDEFINED);
+
+ /* Create the doublewrite buffer to a new tablespace */
+ if (!srv_read_only_mode && srv_force_recovery < SRV_FORCE_NO_TRX_UNDO
+ && !buf_dblwr_create()) {
+ return(srv_init_abort(DB_ERROR));
+ }
+
+ /* Here the double write buffer has already been created and so
+ any new rollback segments will be allocated after the double
+ write buffer. The default segment should already exist.
+ We create the new segments only if it's a new database or
+ the database was shutdown cleanly. */
+ /* Note: When creating the extra rollback segments during an upgrade
+ we violate the latching order, even if the change buffer is empty.
+ We make an exception in sync0sync.cc and check srv_is_being_started
+ for that violation. It cannot create a deadlock because we are still
+ running in single threaded mode essentially. Only the IO threads
+ should be running at this stage. */
+
+ if (!trx_sys_create_rsegs()) {
+ return(srv_init_abort(DB_ERROR));
+ }
+
+ if (!create_new_db) {
/* Validate a few system page types that were left
- uninitialized by older versions of MySQL. */
+ uninitialized before MySQL or MariaDB 5.5. */
if (!high_level_read_only) {
+ ut_ad(srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE);
buf_block_t* block;
mtr.start();
/* Bitmap page types will be reset in
@@ -2130,16 +2158,20 @@ files_checked:
0, RW_X_LATCH, &mtr);
fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr);
mtr.commit();
- }
- /* Roll back any recovered data dictionary transactions, so
- that the data dictionary tables will be free of any locks.
- The data dictionary latch should guarantee that there is at
- most one data dictionary transaction active at a time. */
- if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) {
- trx_rollback_recovered(false);
+ /* Roll back any recovered data dictionary
+ transactions, so that the data dictionary
+ tables will be free of any locks. The data
+ dictionary latch should guarantee that there
+ is at most one data dictionary transaction
+ active at a time. */
+ if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) {
+ trx_rollback_recovered(false);
+ }
}
+ /* FIXME: Skip the following if srv_read_only_mode,
+ while avoiding "Allocated tablespace ID" warnings. */
if (srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE) {
/* Open or Create SYS_TABLESPACES and SYS_DATAFILES
so that tablespace names and other metadata can be
@@ -2166,41 +2198,24 @@ files_checked:
dict_check_tablespaces_and_store_max_id();
}
- if (err != DB_SUCCESS) {
- return(srv_init_abort(err));
+ if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO
+ && !srv_read_only_mode) {
+ /* Drop partially created indexes. */
+ row_merge_drop_temp_indexes();
+ /* Drop garbage tables. */
+ row_mysql_drop_garbage_tables();
+
+ /* Drop any auxiliary tables that were not
+ dropped when the parent table was
+ dropped. This can happen if the parent table
+ was dropped but the server crashed before the
+ auxiliary tables were dropped. */
+ fts_drop_orphaned_tables();
+
+ /* Rollback incomplete non-DDL transactions */
+ trx_rollback_is_active = true;
+ os_thread_create(trx_rollback_all_recovered, 0, 0);
}
-
- recv_recovery_rollback_active();
- srv_startup_is_before_trx_rollback_phase = FALSE;
- }
-
- ut_ad(err == DB_SUCCESS);
- ut_a(sum_of_new_sizes != ULINT_UNDEFINED);
-
- /* Create the doublewrite buffer to a new tablespace */
- if (!srv_read_only_mode && srv_force_recovery < SRV_FORCE_NO_TRX_UNDO
- && !buf_dblwr_create()) {
- return(srv_init_abort(DB_ERROR));
- }
-
- /* Here the double write buffer has already been created and so
- any new rollback segments will be allocated after the double
- write buffer. The default segment should already exist.
- We create the new segments only if it's a new database or
- the database was shutdown cleanly. */
-
- /* Note: When creating the extra rollback segments during an upgrade
- we violate the latching order, even if the change buffer is empty.
- We make an exception in sync0sync.cc and check srv_is_being_started
- for that violation. It cannot create a deadlock because we are still
- running in single threaded mode essentially. Only the IO threads
- should be running at this stage. */
-
- ut_a(srv_undo_logs > 0);
- ut_a(srv_undo_logs <= TRX_SYS_N_RSEGS);
-
- if (!trx_sys_create_rsegs()) {
- return(srv_init_abort(DB_ERROR));
}
srv_startup_is_before_trx_rollback_phase = false;
diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc
index eeca6ef9286..7fb1d481126 100644
--- a/storage/innobase/trx/trx0purge.cc
+++ b/storage/innobase/trx/trx0purge.cc
@@ -568,7 +568,7 @@ static void trx_purge_truncate_history()
return;
}
- while (srv_undo_log_truncate && srv_undo_logs >= 3) {
+ while (srv_undo_log_truncate) {
if (!purge_sys.truncate.current) {
const ulint threshold = ulint(srv_max_undo_log_size
>> srv_page_size_shift);
diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc
index da0169e8a2b..ed890007122 100644
--- a/storage/innobase/trx/trx0roll.cc
+++ b/storage/innobase/trx/trx0roll.cc
@@ -44,6 +44,10 @@ Created 3/26/1996 Heikki Tuuri
#include "trx0trx.h"
#include "trx0undo.h"
+#ifdef UNIV_PFS_THREAD
+mysql_pfs_key_t trx_rollback_clean_thread_key;
+#endif
+
/** true if trx_rollback_all_recovered() thread is active */
bool trx_rollback_is_active;
@@ -833,7 +837,6 @@ discard:
}
}
-
/*******************************************************************//**
Rollback or clean up any incomplete transactions which were
encountered in crash recovery. If the transaction already was
diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc
index bb645186b75..f41bf942b2b 100644
--- a/storage/innobase/trx/trx0sys.cc
+++ b/storage/innobase/trx/trx0sys.cc
@@ -238,16 +238,11 @@ trx_sys_create_rsegs()
{
/* srv_available_undo_logs reflects the number of persistent
rollback segments that have been initialized in the
- transaction system header page.
-
- srv_undo_logs determines how many of the
- srv_available_undo_logs rollback segments may be used for
- logging new transactions. */
+ transaction system header page. */
ut_ad(srv_undo_tablespaces <= TRX_SYS_MAX_UNDO_SPACES);
- ut_ad(srv_undo_logs <= TRX_SYS_N_RSEGS);
- if (srv_read_only_mode) {
- srv_undo_logs = srv_available_undo_logs = ULONG_UNDEFINED;
+ if (high_level_read_only) {
+ srv_available_undo_logs = 0;
return(true);
}
@@ -262,43 +257,35 @@ trx_sys_create_rsegs()
in the system tablespace. */
ut_a(srv_available_undo_logs > 0);
- if (srv_force_recovery) {
- /* Do not create additional rollback segments if
- innodb_force_recovery has been set. */
- if (srv_undo_logs > srv_available_undo_logs) {
- srv_undo_logs = srv_available_undo_logs;
+ for (ulint i = 0; srv_available_undo_logs < TRX_SYS_N_RSEGS;
+ i++, srv_available_undo_logs++) {
+ /* Tablespace 0 is the system tablespace.
+ Dedicated undo log tablespaces start from 1. */
+ ulint space = srv_undo_tablespaces > 0
+ ? (i % srv_undo_tablespaces)
+ + srv_undo_space_id_start
+ : TRX_SYS_SPACE;
+
+ if (!trx_rseg_create(space)) {
+ ib::error() << "Unable to allocate the"
+ " requested innodb_undo_logs";
+ return(false);
}
- } else {
- for (ulint i = 0; srv_available_undo_logs < srv_undo_logs;
- i++, srv_available_undo_logs++) {
- /* Tablespace 0 is the system tablespace.
- Dedicated undo log tablespaces start from 1. */
- ulint space = srv_undo_tablespaces > 0
- ? (i % srv_undo_tablespaces)
- + srv_undo_space_id_start
- : TRX_SYS_SPACE;
-
- if (!trx_rseg_create(space)) {
- ib::error() << "Unable to allocate the"
- " requested innodb_undo_logs";
- return(false);
- }
-
- /* Increase the number of active undo
- tablespace in case new rollback segment
- assigned to new undo tablespace. */
- if (space > srv_undo_tablespaces_active) {
- srv_undo_tablespaces_active++;
-
- ut_ad(srv_undo_tablespaces_active == space);
- }
+
+ /* Increase the number of active undo
+ tablespace in case new rollback segment
+ assigned to new undo tablespace. */
+ if (space > srv_undo_tablespaces_active) {
+ srv_undo_tablespaces_active++;
+
+ ut_ad(srv_undo_tablespaces_active == space);
}
}
- ut_ad(srv_undo_logs <= srv_available_undo_logs);
+ ut_ad(srv_available_undo_logs == TRX_SYS_N_RSEGS);
ib::info info;
- info << srv_undo_logs << " out of " << srv_available_undo_logs;
+ info << srv_available_undo_logs;
if (srv_undo_tablespaces_active) {
info << " rollback segments in " << srv_undo_tablespaces_active
<< " undo tablespaces are active.";
diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc
index c75d766a48b..de5af9764fa 100644
--- a/storage/innobase/trx/trx0trx.cc
+++ b/storage/innobase/trx/trx0trx.cc
@@ -776,11 +776,13 @@ evenly distributed between 0 and innodb_undo_logs-1
@retval NULL if innodb_read_only */
static trx_rseg_t* trx_assign_rseg_low()
{
- if (srv_read_only_mode) {
- ut_ad(srv_undo_logs == ULONG_UNDEFINED);
+ if (high_level_read_only) {
+ ut_ad(!srv_available_undo_logs);
return(NULL);
}
+ ut_ad(srv_available_undo_logs == TRX_SYS_N_RSEGS);
+
/* The first slot is always assigned to the system tablespace. */
ut_ad(trx_sys.rseg_array[0]->space == fil_system.sys_space);
@@ -793,7 +795,8 @@ static trx_rseg_t* trx_assign_rseg_low()
that start modifications concurrently will write their undo
log to the same rollback segment. */
static ulong rseg_slot;
- ulint slot = rseg_slot++ % srv_undo_logs;
+ ulint slot = rseg_slot++ % TRX_SYS_N_RSEGS;
+ ut_d(if (trx_rseg_n_slots_debug) slot = 0);
trx_rseg_t* rseg;
#ifdef UNIV_DEBUG
@@ -816,7 +819,8 @@ static trx_rseg_t* trx_assign_rseg_low()
look_for_rollover = true;
#endif /* UNIV_DEBUG */
- slot = (slot + 1) % srv_undo_logs;
+ ut_d(if (!trx_rseg_n_slots_debug))
+ slot = (slot + 1) % TRX_SYS_N_RSEGS;
if (rseg == NULL) {
continue;