###################### t/debug_sync.test ############################### # # # Testing of the Debug Sync Facility. # # # # There is important documentation within sql/debug_sync.cc # # # # Used objects in this test case: # # p0 - synchronization point 0. Non-existent dummy sync point. # # s1 - signal 1. # # s2 - signal 2. # # # # Creation: # # 2008-02-18 istruewing # # # ######################################################################## # # We need the Debug Sync Facility. # --source include/have_debug_sync.inc # # We are checking privileges, which the embedded server cannot do. # --source include/not_embedded.inc # # Preparative cleanup. # --disable_warnings SET DEBUG_SYNC= 'RESET'; DROP TABLE IF EXISTS t1; --enable_warnings # # Show the special system variable. # It shows ON or OFF depending on the command line option --debug-sync. # The test case assumes it is ON (command line option present). # SHOW VARIABLES LIKE 'DEBUG_SYNC'; # # Syntax. Valid forms. # SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 EXECUTE 2'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2'; SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE 2'; SET DEBUG_SYNC='p0 SIGNAL s1 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1'; SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2'; SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6'; SET DEBUG_SYNC='p0 WAIT_FOR s2 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 WAIT_FOR s2 EXECUTE 2'; SET DEBUG_SYNC='p0 WAIT_FOR s2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 WAIT_FOR s2'; SET DEBUG_SYNC='p0 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 CLEAR'; SET DEBUG_SYNC='p0 TEST'; SET DEBUG_SYNC='RESET'; # # Syntax. Valid forms. Lower case. # set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2 hit_limit 3'; set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2'; set debug_sync='p0 signal s1 wait_for s2 timeout 6 hit_limit 3'; set debug_sync='p0 signal s1 wait_for s2 timeout 6'; set debug_sync='p0 signal s1 wait_for s2 execute 2 hit_limit 3'; set debug_sync='p0 signal s1 wait_for s2 execute 2'; set debug_sync='p0 signal s1 wait_for s2 hit_limit 3'; set debug_sync='p0 signal s1 wait_for s2'; set debug_sync='p0 signal s1 execute 2 hit_limit 3'; set debug_sync='p0 signal s1 execute 2'; set debug_sync='p0 signal s1 hit_limit 3'; set debug_sync='p0 signal s1'; set debug_sync='p0 wait_for s2 timeout 6 execute 2 hit_limit 3'; set debug_sync='p0 wait_for s2 timeout 6 execute 2'; set debug_sync='p0 wait_for s2 timeout 6 hit_limit 3'; set debug_sync='p0 wait_for s2 timeout 6'; set debug_sync='p0 wait_for s2 execute 2 hit_limit 3'; set debug_sync='p0 wait_for s2 execute 2'; set debug_sync='p0 wait_for s2 hit_limit 3'; set debug_sync='p0 wait_for s2'; set debug_sync='p0 hit_limit 3'; set debug_sync='p0 clear'; set debug_sync='p0 test'; set debug_sync='reset'; # # Syntax. Valid forms. Line wrap, leading, mid, trailing space. # SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 '; SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2 '; SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2 '; # # Syntax. Invalid forms. # --error ER_PARSE_ERROR SET DEBUG_SYNC=''; --error ER_PARSE_ERROR SET DEBUG_SYNC=' '; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TIMEOUT 6 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TIMEOUT 6'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 TIMEOUT 6 EXECUTE 2'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 TIMEOUT 6'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 EXECUTE 2 SIGNAL s1 TIMEOUT 6'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TIMEOUT 6 SIGNAL s1'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 EXECUTE 2 TIMEOUT 6 SIGNAL s1'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 CLEAR HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='CLEAR'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 CLEAR p0'; --error ER_PARSE_ERROR SET DEBUG_SYNC='TEST'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TEST p0'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 RESET'; --error ER_PARSE_ERROR SET DEBUG_SYNC='RESET p0'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 RESET p0'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL '; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR '; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE '; # # Syntax. Invalid keywords used. # --error ER_UNKNOWN_SYSTEM_VARIABLE SET DEBUG_SYNCx='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAx s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOx s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUx 0 EXECUTE 2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTx 2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIx 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 CLEARx'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 TESTx'; --error ER_PARSE_ERROR SET DEBUG_SYNC='RESETx'; # # Syntax. Invalid numbers. Decimal only. # --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 0x6 EXECUTE 2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 0x2 HIT_LIMIT 3'; --error ER_PARSE_ERROR SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 7 EXECUTE 2 HIT_LIMIT 0x3'; # # Syntax. Invalid value type. # --error ER_WRONG_TYPE_FOR_VAR SET DEBUG_SYNC= 7; # # Syntax. DEBUG_SYNC is a SESSION-only variable. # --error ER_LOCAL_VARIABLE SET GLOBAL DEBUG_SYNC= 'p0 CLEAR'; # # Syntax. The variable value does not need to be a string literal. # SET @myvar= 'now SIGNAL from_myvar'; SET DEBUG_SYNC= @myvar; SHOW VARIABLES LIKE 'DEBUG_SYNC'; # SET DEBUG_SYNC= LEFT('now SIGNAL from_function_cut_here', 24); SHOW VARIABLES LIKE 'DEBUG_SYNC'; # # Functional tests. # # NOTE: There is the special synchronization point 'now'. It is placed # immediately after setting of the DEBUG_SYNC variable. # So it is executed before the SET statement ends. # # NOTE: There is only one global signal (say "signal post" or "flag mast"). # A SIGNAL action writes its signal into it ("sets a flag"). # The signal persists until explicitly overwritten. # To avoid confusion for later tests, it is recommended to clear # the signal by signalling "empty" ("setting the 'empty' flag"): # SET DEBUG_SYNC= 'now SIGNAL empty'; # Preferably you can reset the whole facility with: # SET DEBUG_SYNC= 'RESET'; # The signal is then '' (really empty) which connot be done otherwise. # # # Time out immediately. This gives just a warning. # SET DEBUG_SYNC= 'now SIGNAL something'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; # Suppress warning number --replace_column 2 #### SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0'; # # If signal is present already, TIMEOUT 0 does not give a warning. # SET DEBUG_SYNC= 'now SIGNAL nothing'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0'; # # EXECUTE 0 is effectively a no-op. # SET DEBUG_SYNC= 'now SIGNAL something EXECUTE 0'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'now WAIT_FOR anotherthing TIMEOUT 0 EXECUTE 0'; # # Run into HIT_LIMIT. This gives an error. # --error ER_DEBUG_SYNC_HIT_LIMIT SET DEBUG_SYNC= 'now HIT_LIMIT 1'; # # Many actions. Watch the array growing and shrinking in the debug trace: # egrep 'query:|debug_sync_action:' mysql-test/var/log/master.trace # SET DEBUG_SYNC= 'RESET'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p1abcd SIGNAL s1 EXECUTE 2'; SET DEBUG_SYNC= 'p2abc SIGNAL s2 EXECUTE 2'; SET DEBUG_SYNC= 'p9abcdef SIGNAL s9 EXECUTE 2'; SET DEBUG_SYNC= 'p4a SIGNAL s4 EXECUTE 2'; SET DEBUG_SYNC= 'p5abcde SIGNAL s5 EXECUTE 2'; SET DEBUG_SYNC= 'p6ab SIGNAL s6 EXECUTE 2'; SET DEBUG_SYNC= 'p7 SIGNAL s7 EXECUTE 2'; SET DEBUG_SYNC= 'p8abcdef SIGNAL s8 EXECUTE 2'; SET DEBUG_SYNC= 'p3abcdef SIGNAL s3 EXECUTE 2'; # # Execute some actions to show they exist. Each sets a distinct signal. # SET DEBUG_SYNC= 'p4a TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p1abcd TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p7 TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p9abcdef TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p3abcdef TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; # # Clear the actions. # SET DEBUG_SYNC= 'p1abcd CLEAR'; SET DEBUG_SYNC= 'p2abc CLEAR'; SET DEBUG_SYNC= 'p5abcde CLEAR'; SET DEBUG_SYNC= 'p6ab CLEAR'; SET DEBUG_SYNC= 'p8abcdef CLEAR'; SET DEBUG_SYNC= 'p9abcdef CLEAR'; SET DEBUG_SYNC= 'p3abcdef CLEAR'; SET DEBUG_SYNC= 'p4a CLEAR'; SET DEBUG_SYNC= 'p7 CLEAR'; # # Execute some actions to show they have gone. # SET DEBUG_SYNC= 'p1abcd TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p7 TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; SET DEBUG_SYNC= 'p9abcdef TEST'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; # # Now cleanup. Actions are clear already, but signal needs to be cleared. # SET DEBUG_SYNC= 'RESET'; SHOW VARIABLES LIKE 'DEBUG_SYNC'; # # Facility requires SUPER privilege. # CREATE USER mysqltest_1@localhost; GRANT SUPER ON *.* TO mysqltest_1@localhost; connect (con1,localhost,mysqltest_1,,); SET DEBUG_SYNC= 'RESET'; disconnect con1; connection default; DROP USER mysqltest_1@localhost; # CREATE USER mysqltest_2@localhost; GRANT ALL ON *.* TO mysqltest_2@localhost; REVOKE SUPER ON *.* FROM mysqltest_2@localhost; connect (con1,localhost,mysqltest_2,,); --error ER_SPECIFIC_ACCESS_DENIED_ERROR SET DEBUG_SYNC= 'RESET'; disconnect con1; connection default; DROP USER mysqltest_2@localhost; # # Example 1. # # Preparative cleanup. --disable_warnings SET DEBUG_SYNC= 'RESET'; DROP TABLE IF EXISTS t1; --enable_warnings # # Test. CREATE TABLE t1 (c1 INT); connect (con1,localhost,root,,); SET DEBUG_SYNC= 'before_lock_tables_takes_lock SIGNAL opened WAIT_FOR flushed'; send INSERT INTO t1 VALUES(1); connection default; SET DEBUG_SYNC= 'now WAIT_FOR opened'; SET DEBUG_SYNC= 'after_flush_unlock SIGNAL flushed'; FLUSH TABLE t1; connection con1; reap; disconnect con1; connection default; DROP TABLE t1; # # Example 2. # # Preparative cleanup. --disable_warnings SET DEBUG_SYNC= 'RESET'; DROP TABLE IF EXISTS t1; --enable_warnings # # Test. CREATE TABLE t1 (c1 INT) ENGINE=MyISAM; INSERT INTO t1 VALUES (1); SELECT GET_LOCK('mysqltest_lock', 100); connect (con1,localhost,root,,); --echo # Sending: --send UPDATE t1 SET c1=GET_LOCK('mysqltest_lock', 100); connect (con2,localhost,root,,); let $wait_condition= select count(*) = 1 from information_schema.processlist where state = "User lock" and info = "UPDATE t1 SET c1=GET_LOCK('mysqltest_lock', 100)"; --source include/wait_condition.inc # Retain action after use. First used by general_log. SET DEBUG_SYNC= 'wait_for_lock SIGNAL locked EXECUTE 2'; send INSERT INTO t1 VALUES (1); connection default; # Wait until INSERT waits for lock. SET DEBUG_SYNC= 'now WAIT_FOR locked'; # let UPDATE continue. SELECT RELEASE_LOCK('mysqltest_lock'); connection con1; --echo # Reaping UPDATE reap; SELECT RELEASE_LOCK('mysqltest_lock'); connection con2; --echo retrieve INSERT result. reap; disconnect con1; disconnect con2; connection default; DROP TABLE t1; # # Cleanup after test case. # Otherwise signal would contain 'flushed' here, # which could confuse the next test. # SET DEBUG_SYNC= 'RESET';