mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +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
 |