mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
fc6ef378d4
KEY NO 0 FOR TABLE IN ERROR LOG With the changes made by the patches for Bug#11751388 and Bug#11784056, concurrent reads are allowed while secondary indexes are created in InnoDB. This means that the metadata lock on the affected table is not upgraded to exclusive until the .FRM is updated at the end of ALTER TABLE processing. The problem was that if this lock upgrade failed for some reason (e.g. timeout), the index information in the server and inside InnoDB would be out of sync. This would happen since the add index operation already was committed inside InnoDB but the table metadata inside the server had not been updated yet. This patch fixes the problem by (for now) reverting the effects of the patches for Bug#11751388 and Bug#11784056. Concurrent reads will now again be blocked during creation of secondary indexes in InnoDB. Test case added to innodb_mysql_lock.test.
286 lines
7 KiB
Text
286 lines
7 KiB
Text
#
|
|
# Test file for InnoDB tests that require the debug sync facility
|
|
#
|
|
--source include/have_innodb.inc
|
|
--source include/have_debug_sync.inc
|
|
# Save the initial number of concurrent sessions.
|
|
--source include/count_sessions.inc
|
|
|
|
|
|
--echo #
|
|
--echo # Bug 42074 concurrent optimize table and
|
|
--echo # alter table = Assertion failed: thd->is_error()
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
|
|
--echo # Create InnoDB table
|
|
CREATE TABLE t1 (id INT) engine=innodb;
|
|
connect (con2, localhost, root);
|
|
|
|
--echo # Connection 1
|
|
--echo # Start optimizing table
|
|
connection default;
|
|
SET DEBUG_SYNC='ha_admin_try_alter SIGNAL optimize_started WAIT_FOR table_altered';
|
|
--send OPTIMIZE TABLE t1
|
|
|
|
--echo # Connection 2
|
|
--echo # Change table to engine=memory
|
|
connection con2;
|
|
SET DEBUG_SYNC='now WAIT_FOR optimize_started';
|
|
ALTER TABLE t1 engine=memory;
|
|
SET DEBUG_SYNC='now SIGNAL table_altered';
|
|
|
|
--echo # Connection 1
|
|
--echo # Complete optimization
|
|
connection default;
|
|
--reap
|
|
|
|
disconnect con2;
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC='RESET';
|
|
|
|
|
|
--echo #
|
|
--echo # Bug#47459 Assertion in Diagnostics_area::set_eof_status on
|
|
--echo # OPTIMIZE TABLE
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
|
|
connect (con1, localhost, root);
|
|
connection default;
|
|
|
|
CREATE TABLE t1(a INT) ENGINE= InnoDB;
|
|
|
|
--echo # Connection con1
|
|
connection con1;
|
|
SET DEBUG_SYNC= "ha_admin_open_ltable SIGNAL opening WAIT_FOR dropped";
|
|
--echo # Sending:
|
|
--send OPTIMIZE TABLE t1
|
|
|
|
--echo # Connection default
|
|
connection default;
|
|
SET DEBUG_SYNC= "now WAIT_FOR opening";
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC= "now SIGNAL dropped";
|
|
|
|
--echo # Connection con1
|
|
connection con1;
|
|
--echo # Reaping: OPTIMIZE TABLE t1
|
|
--reap
|
|
|
|
--echo # Connection default
|
|
connection default;
|
|
disconnect con1;
|
|
SET DEBUG_SYNC= "RESET";
|
|
|
|
|
|
--echo #
|
|
--echo # Bug#53757 assert in mysql_truncate_by_delete
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1, t2;
|
|
--enable_warnings
|
|
|
|
CREATE TABLE t1(a INT) Engine=InnoDB;
|
|
CREATE TABLE t2(id INT);
|
|
INSERT INTO t1 VALUES (1), (2);
|
|
|
|
connect (con1, localhost, root);
|
|
INSERT INTO t2 VALUES(connection_id());
|
|
SET DEBUG_SYNC= "open_and_process_table SIGNAL opening WAIT_FOR killed";
|
|
--echo # Sending: (not reaped since connection is killed later)
|
|
--send TRUNCATE t1
|
|
|
|
connection default;
|
|
SET DEBUG_SYNC= "now WAIT_FOR opening";
|
|
SELECT ((@id := id) - id) FROM t2;
|
|
KILL @id;
|
|
SET DEBUG_SYNC= "now SIGNAL killed";
|
|
DROP TABLE t1, t2;
|
|
disconnect con1;
|
|
--source include/wait_until_count_sessions.inc
|
|
SET DEBUG_SYNC= "RESET";
|
|
|
|
|
|
--echo #
|
|
--echo # Bug#58933 Assertion `thd- >is_error()' fails on shutdown with ongoing
|
|
--echo # OPTIMIZE TABLE
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1), (2);
|
|
|
|
--echo # Connection con1
|
|
connect (con1,localhost,root);
|
|
let $ID= `SELECT connection_id()`;
|
|
SET DEBUG_SYNC= 'ha_admin_open_ltable SIGNAL waiting WAIT_FOR killed';
|
|
--echo # Sending:
|
|
--send OPTIMIZE TABLE t1
|
|
|
|
--echo # Connection default
|
|
connection default;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR waiting';
|
|
--replace_result $ID ID
|
|
eval KILL QUERY $ID;
|
|
SET DEBUG_SYNC= 'now SIGNAL killed';
|
|
|
|
--echo # Connection con1
|
|
connection con1;
|
|
--echo # Reaping: OPTIMIZE TABLE t1
|
|
--reap
|
|
|
|
--echo # Connection default
|
|
connection default;
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC= 'RESET';
|
|
disconnect con1;
|
|
|
|
|
|
--echo #
|
|
--echo # Bug#42230 during add index, cannot do queries on storage engines
|
|
--echo # that implement add_index
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # DISABLED due to Bug#11815600
|
|
--echo #
|
|
|
|
#--disable_warnings
|
|
#DROP DATABASE IF EXISTS db1;
|
|
#DROP TABLE IF EXISTS t1;
|
|
#--enable_warnings
|
|
#
|
|
#connect(con1,localhost,root);
|
|
#connect(con2,localhost,root);
|
|
#
|
|
#--echo # Test 1: Secondary index, should not block reads (original test case).
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#CREATE DATABASE db1;
|
|
#CREATE TABLE db1.t1(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value INT) engine=innodb;
|
|
#INSERT INTO db1.t1(value) VALUES (1), (2);
|
|
#SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query";
|
|
#--echo # Sending:
|
|
#--send ALTER TABLE db1.t1 ADD INDEX(value)
|
|
#
|
|
#--echo # Connection con1
|
|
#connection con1;
|
|
#SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
# # Neither of these two statements should be blocked
|
|
#USE db1;
|
|
#SELECT * FROM t1;
|
|
#SET DEBUG_SYNC= "now SIGNAL query";
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#--echo # Reaping: ALTER TABLE db1.t1 ADD INDEX(value)
|
|
#--reap
|
|
#DROP DATABASE db1;
|
|
#
|
|
#--echo # Test 2: Primary index (implicit), should block reads.
|
|
#
|
|
#CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb;
|
|
#SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query";
|
|
#--echo # Sending:
|
|
#--send ALTER TABLE t1 ADD UNIQUE INDEX(a)
|
|
#
|
|
#--echo # Connection con1
|
|
#connection con1;
|
|
#SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
#USE test;
|
|
#--echo # Sending:
|
|
#--send SELECT * FROM t1
|
|
#
|
|
#--echo # Connection con2
|
|
#connection con2;
|
|
#--echo # Waiting for SELECT to be blocked by the metadata lock on t1
|
|
#let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist
|
|
# WHERE state= 'Waiting for table metadata lock'
|
|
# AND info='SELECT * FROM t1';
|
|
#--source include/wait_condition.inc
|
|
#SET DEBUG_SYNC= "now SIGNAL query";
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#--echo # Reaping: ALTER TABLE t1 ADD UNIQUE INDEX(a)
|
|
#--reap
|
|
#
|
|
#--echo # Connection con1
|
|
#connection con1;
|
|
#--echo # Reaping: SELECT * FROM t1
|
|
#--reap
|
|
#
|
|
#--echo # Test 3: Primary index (explicit), should block reads.
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#ALTER TABLE t1 DROP INDEX a;
|
|
#SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query";
|
|
#--echo # Sending:
|
|
#--send ALTER TABLE t1 ADD PRIMARY KEY (a)
|
|
#
|
|
#--echo # Connection con1
|
|
#connection con1;
|
|
#SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
#--echo # Sending:
|
|
#--send SELECT * FROM t1
|
|
#
|
|
#--echo # Connection con2
|
|
#connection con2;
|
|
#--echo # Waiting for SELECT to be blocked by the metadata lock on t1
|
|
#let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist
|
|
# WHERE state= 'Waiting for table metadata lock'
|
|
# AND info='SELECT * FROM t1';
|
|
#--source include/wait_condition.inc
|
|
#SET DEBUG_SYNC= "now SIGNAL query";
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#--echo # Reaping: ALTER TABLE t1 ADD PRIMARY KEY (a)
|
|
#--reap
|
|
#
|
|
#--echo # Connection con1
|
|
#connection con1;
|
|
#--echo # Reaping: SELECT * FROM t1
|
|
#--reap
|
|
#
|
|
#--echo # Test 4: Secondary unique index, should not block reads.
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#SET DEBUG_SYNC= "alter_table_manage_keys SIGNAL manage WAIT_FOR query";
|
|
#--echo # Sending:
|
|
#--send ALTER TABLE t1 ADD UNIQUE (b)
|
|
#
|
|
#--echo # Connection con1
|
|
#connection con1;
|
|
#SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
#SELECT * FROM t1;
|
|
#SET DEBUG_SYNC= "now SIGNAL query";
|
|
#
|
|
#--echo # Connection default
|
|
#connection default;
|
|
#--echo # Reaping: ALTER TABLE t1 ADD UNIQUE (b)
|
|
#--reap
|
|
#
|
|
#disconnect con1;
|
|
#disconnect con2;
|
|
#SET DEBUG_SYNC= "RESET";
|
|
#DROP TABLE t1;
|
|
|
|
|
|
# Check that all connections opened by test cases in this file are really
|
|
# gone so execution of other tests won't be affected by their presence.
|
|
--source include/wait_until_count_sessions.inc
|