mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
f7e7718560
The problem is that a mysql connection instance is not thread-safe and reentrant, meaning that it can't be used concurrently and can't be re-entered while it's already running. This applies for any form of the server (embedded or not), but this rule can be violated in a test case if the test sends a new command without waiting for the result of previous command that was sent asynchronously and this can lead to hangs when over a network or to crashes under embedded server as the server query execution path will be re-entered concurrently with the same connection structure. The solution is to rework the test case so that the aforementioned rule is obeyed. mysql-test/t/innodb_bug38231.test: Remove con3 as it is not necessary to reproduce the test case and might cause problems as there is no guarantee on which LOCK TABLE request will succeed first. Also, wait for statement result before sending a new one on the same connection.
75 lines
1.4 KiB
Text
75 lines
1.4 KiB
Text
#
|
|
# Bug#38231 Innodb crash in lock_reset_all_on_table() on TRUNCATE + LOCK / UNLOCK
|
|
# http://bugs.mysql.com/38231
|
|
#
|
|
|
|
-- source include/have_innodb.inc
|
|
|
|
SET storage_engine=InnoDB;
|
|
|
|
# we care only that the following SQL commands do not crash the server
|
|
-- disable_query_log
|
|
-- disable_result_log
|
|
|
|
DROP TABLE IF EXISTS bug38231;
|
|
CREATE TABLE bug38231 (a INT);
|
|
|
|
-- connect (con1,localhost,root,,)
|
|
-- connect (con2,localhost,root,,)
|
|
|
|
-- connection con1
|
|
SET autocommit=0;
|
|
LOCK TABLE bug38231 WRITE;
|
|
|
|
-- connection con2
|
|
SET autocommit=0;
|
|
-- send
|
|
LOCK TABLE bug38231 WRITE;
|
|
|
|
-- connection default
|
|
-- send
|
|
TRUNCATE TABLE bug38231;
|
|
|
|
-- connection con1
|
|
# give time to TRUNCATE and others to be executed; without sleep, sometimes
|
|
# UNLOCK executes before TRUNCATE
|
|
# TODO: Replace with wait_condition once possible under embedded server.
|
|
-- sleep 0.2
|
|
# this crashes the server if the bug is present
|
|
UNLOCK TABLES;
|
|
|
|
# clean up
|
|
|
|
-- connection con2
|
|
-- reap
|
|
UNLOCK TABLES;
|
|
|
|
-- connection default
|
|
-- reap
|
|
-- disconnect con1
|
|
-- disconnect con2
|
|
|
|
# test that TRUNCATE works with with row-level locks
|
|
|
|
-- enable_query_log
|
|
-- enable_result_log
|
|
|
|
INSERT INTO bug38231 VALUES (1), (10), (300);
|
|
|
|
-- connect (con4,localhost,root,,)
|
|
|
|
-- connection con4
|
|
SET autocommit=0;
|
|
SELECT * FROM bug38231 FOR UPDATE;
|
|
|
|
-- connection default
|
|
TRUNCATE TABLE bug38231;
|
|
|
|
-- connection con4
|
|
COMMIT;
|
|
|
|
-- connection default
|
|
|
|
-- disconnect con4
|
|
|
|
DROP TABLE bug38231;
|