mirror of
https://github.com/MariaDB/server.git
synced 2025-05-31 08:42:45 +03:00
116 lines
3.5 KiB
Plaintext
116 lines
3.5 KiB
Plaintext
--source include/have_innodb.inc
|
|
--source include/not_windows.inc
|
|
--source include/not_valgrind.inc
|
|
--source include/not_embedded.inc
|
|
# DEBUG_SYNC must be compiled in.
|
|
--source include/have_debug_sync.inc
|
|
|
|
connect (con1,localhost,root,,);
|
|
connect (con2,localhost,root,,);
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
connection con1;
|
|
eval create table t1 (id integer, x integer) engine = InnoDB;
|
|
insert into t1 values(0, 0);
|
|
|
|
# Enable the debug injection.
|
|
SET @saved_dbug = @@SESSION.debug_dbug;
|
|
set DEBUG_DBUG='+d,fatal-semaphore-timeout';
|
|
set autocommit=0;
|
|
|
|
# The following query will hang for an hour since the debug injection
|
|
# code will sleep an hour after holding the lock table mutex
|
|
--echo # Sending query on con1,
|
|
--echo # the session will hold lock table mutex and sleep
|
|
--send
|
|
SELECT * from t1 where id = 0 FOR UPDATE;
|
|
|
|
# To make sure con1 holding the lock table mutex and sleeping
|
|
--sleep 2
|
|
|
|
connection con2;
|
|
set autocommit=0;
|
|
|
|
# The following query will be blocked on the lock table mutex held by
|
|
# con1 so it will be put into sync array.
|
|
--echo # Sending query on con2,
|
|
--echo # the session will be blocked on the lock table mutex and
|
|
--echo # thus be put into sync arry
|
|
--send
|
|
SELECT * from t1 where id = 0 FOR UPDATE;
|
|
|
|
# Waitting for mysqld to abort due to fatal semaphore timeout.
|
|
# Please note that, in the master.opt file, the fatal timeout
|
|
# was set to 1 second, but in mysqld debug mode, this timeout
|
|
# value will be timed 10 because UNIV_DEBUG_VALGRIND is set
|
|
# (see sync_array_print_long_waits_low() in storage/innobase/sync/sync0arr.cc)
|
|
# so the actual timeout will be 1 * 10 = 10 seconds. Besides,
|
|
# mysqld will abort after detecting this fatal timeout 10 times in
|
|
# a loop with interval of 1 second (see srv_error_monitor_thread
|
|
# thread in torage/innobase/srv/srv0srv.cc), so mysqld will abort
|
|
# in 1 * 10 + 1 * 10 = 20 seconds after con2 being blocked on
|
|
# the lock table mutex.
|
|
#
|
|
# P.S. the default fatal sempahore timeout is 600 seconds,
|
|
# so mysqld will abort after 600 * 10 + 1 * 10 = 6010 seconds
|
|
# in debug mode and 600 + 1 * 10 = 610 seconds in release mode.
|
|
|
|
connection default;
|
|
|
|
--disable_result_log
|
|
--disable_query_log
|
|
|
|
# Since this test generates lot of errors in log, suppress checking errors
|
|
call mtr.add_suppression(".*");
|
|
|
|
# The crash is expected
|
|
exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
|
|
|
|
--echo # Waitting for mysqld to crash
|
|
|
|
# It will take 20 seconds to detect the long semaphore and mysqld to abort.
|
|
# This test will be treated as pass as long as mysqld crash/restart is dectected
|
|
# in 80 seconds.
|
|
let $counter= 80;
|
|
let $mysql_errno= 0;
|
|
while (!$mysql_errno)
|
|
{
|
|
--error 0,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,2002,2006,2013
|
|
show status;
|
|
|
|
--error 0,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,2002,2006,2013
|
|
select * from information_schema.innodb_sys_semaphore_waits;
|
|
|
|
dec $counter;
|
|
if (!$counter)
|
|
{
|
|
# This will fail this test.
|
|
--die Server failed to dissapear
|
|
}
|
|
--sleep 1
|
|
}
|
|
|
|
--echo # Mysqld crash was detected
|
|
--echo # Waitting for reconnect after mysqld restarts
|
|
|
|
enable_reconnect;
|
|
connection default;
|
|
|
|
--exec echo "restart:--log-error=$error_log" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
|
|
# Call script that will poll the server waiting for it to be back online again
|
|
source include/wait_until_connected_again.inc;
|
|
|
|
--echo # Reconnected after mysqld was successfully restarted
|
|
|
|
--echo # Cleaning up before exit
|
|
--disable_warnings
|
|
SET debug_dbug = @saved_dbug;
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
--echo # Clean exit
|