mariadb/mysql-test/t/innodb_bug38231.test
Davi Arnaut f7e7718560 Bug#41889: Test main.innodb_bug38231 is failing w/embedded server (server crash)
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.
2009-01-08 10:31:34 -02:00

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;