1###################### t/debug_sync.test ############################### 2# # 3# Testing of the Debug Sync Facility. # 4# # 5# There is important documentation within sql/debug_sync.cc # 6# # 7# Used objects in this test case: # 8# p0 - synchronization point 0. Non-existent dummy sync point. # 9# s1 - signal 1. # 10# s2 - signal 2. # 11# # 12# Creation: # 13# 2008-02-18 istruewing # 14# # 15######################################################################## 16 17# 18# We need the Debug Sync Facility. 19# 20--source include/have_debug_sync.inc 21 22# 23# We are checking privileges, which the embedded server cannot do. 24# 25--source include/not_embedded.inc 26 27# 28# Preparative cleanup. 29# 30--disable_warnings 31SET DEBUG_SYNC= 'RESET'; 32DROP TABLE IF EXISTS t1; 33--enable_warnings 34 35# 36# Show the special system variable. 37# It shows ON or OFF depending on the command line option --debug-sync. 38# The test case assumes it is ON (command line option present). 39# 40SHOW VARIABLES LIKE 'DEBUG_SYNC'; 41 42# 43# Syntax. Valid forms. 44# 45SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; 46SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2'; 47SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3'; 48SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6'; 49SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 EXECUTE 2 HIT_LIMIT 3'; 50SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 EXECUTE 2'; 51SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 HIT_LIMIT 3'; 52SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2'; 53SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE 2 HIT_LIMIT 3'; 54SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE 2'; 55SET DEBUG_SYNC='p0 SIGNAL s1 HIT_LIMIT 3'; 56SET DEBUG_SYNC='p0 SIGNAL s1'; 57SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; 58SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2'; 59SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3'; 60SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6'; 61SET DEBUG_SYNC='p0 WAIT_FOR s2 EXECUTE 2 HIT_LIMIT 3'; 62SET DEBUG_SYNC='p0 WAIT_FOR s2 EXECUTE 2'; 63SET DEBUG_SYNC='p0 WAIT_FOR s2 HIT_LIMIT 3'; 64SET DEBUG_SYNC='p0 WAIT_FOR s2'; 65SET DEBUG_SYNC='p0 HIT_LIMIT 3'; 66SET DEBUG_SYNC='p0 CLEAR'; 67SET DEBUG_SYNC='p0 TEST'; 68SET DEBUG_SYNC='RESET'; 69 70# 71# Syntax. Valid forms. Lower case. 72# 73set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2 hit_limit 3'; 74set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2'; 75set debug_sync='p0 signal s1 wait_for s2 timeout 6 hit_limit 3'; 76set debug_sync='p0 signal s1 wait_for s2 timeout 6'; 77set debug_sync='p0 signal s1 wait_for s2 execute 2 hit_limit 3'; 78set debug_sync='p0 signal s1 wait_for s2 execute 2'; 79set debug_sync='p0 signal s1 wait_for s2 hit_limit 3'; 80set debug_sync='p0 signal s1 wait_for s2'; 81set debug_sync='p0 signal s1 execute 2 hit_limit 3'; 82set debug_sync='p0 signal s1 execute 2'; 83set debug_sync='p0 signal s1 hit_limit 3'; 84set debug_sync='p0 signal s1'; 85set debug_sync='p0 wait_for s2 timeout 6 execute 2 hit_limit 3'; 86set debug_sync='p0 wait_for s2 timeout 6 execute 2'; 87set debug_sync='p0 wait_for s2 timeout 6 hit_limit 3'; 88set debug_sync='p0 wait_for s2 timeout 6'; 89set debug_sync='p0 wait_for s2 execute 2 hit_limit 3'; 90set debug_sync='p0 wait_for s2 execute 2'; 91set debug_sync='p0 wait_for s2 hit_limit 3'; 92set debug_sync='p0 wait_for s2'; 93set debug_sync='p0 hit_limit 3'; 94set debug_sync='p0 clear'; 95set debug_sync='p0 test'; 96set debug_sync='reset'; 97 98# 99# Syntax. Valid forms. Line wrap, leading, mid, trailing space. 100# 101SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 102 EXECUTE 2 HIT_LIMIT 3'; 103SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2'; 104SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2'; 105SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 '; 106SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2 '; 107SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2 '; 108 109# 110# Syntax. Invalid forms. 111# 112--error ER_PARSE_ERROR 113SET DEBUG_SYNC=''; 114--error ER_PARSE_ERROR 115SET DEBUG_SYNC=' '; 116--error ER_PARSE_ERROR 117SET DEBUG_SYNC='p0'; 118--error ER_PARSE_ERROR 119SET DEBUG_SYNC='p0 EXECUTE 2'; 120--error ER_PARSE_ERROR 121SET DEBUG_SYNC='p0 TIMEOUT 6 EXECUTE 2'; 122--error ER_PARSE_ERROR 123SET DEBUG_SYNC='p0 TIMEOUT 6'; 124--error ER_PARSE_ERROR 125SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1'; 126--error ER_PARSE_ERROR 127SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 EXECUTE 2'; 128--error ER_PARSE_ERROR 129SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6 EXECUTE 2'; 130--error ER_PARSE_ERROR 131SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6'; 132--error ER_PARSE_ERROR 133SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1 EXECUTE 2'; 134--error ER_PARSE_ERROR 135SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1'; 136--error ER_PARSE_ERROR 137SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2 EXECUTE 2'; 138--error ER_PARSE_ERROR 139SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2'; 140--error ER_PARSE_ERROR 141SET DEBUG_SYNC='p0 SIGNAL s1 TIMEOUT 6 EXECUTE 2'; 142--error ER_PARSE_ERROR 143SET DEBUG_SYNC='p0 SIGNAL s1 TIMEOUT 6'; 144--error ER_PARSE_ERROR 145SET DEBUG_SYNC='p0 EXECUTE 2 SIGNAL s1 TIMEOUT 6'; 146--error ER_PARSE_ERROR 147SET DEBUG_SYNC='p0 TIMEOUT 6 SIGNAL s1'; 148--error ER_PARSE_ERROR 149SET DEBUG_SYNC='p0 EXECUTE 2 TIMEOUT 6 SIGNAL s1'; 150--error ER_PARSE_ERROR 151SET DEBUG_SYNC='p0 CLEAR HIT_LIMIT 3'; 152--error ER_PARSE_ERROR 153SET DEBUG_SYNC='CLEAR'; 154--error ER_PARSE_ERROR 155SET DEBUG_SYNC='p0 CLEAR p0'; 156--error ER_PARSE_ERROR 157SET DEBUG_SYNC='TEST'; 158--error ER_PARSE_ERROR 159SET DEBUG_SYNC='p0 TEST p0'; 160--error ER_PARSE_ERROR 161SET DEBUG_SYNC='p0 RESET'; 162--error ER_PARSE_ERROR 163SET DEBUG_SYNC='RESET p0'; 164--error ER_PARSE_ERROR 165SET DEBUG_SYNC='p0 RESET p0'; 166--error ER_PARSE_ERROR 167SET DEBUG_SYNC='p0 SIGNAL '; 168--error ER_PARSE_ERROR 169SET DEBUG_SYNC='p0 WAIT_FOR '; 170--error ER_PARSE_ERROR 171SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE '; 172 173# 174# Syntax. Invalid keywords used. 175# 176--error ER_UNKNOWN_SYSTEM_VARIABLE 177SET DEBUG_SYNCx='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; 178--error ER_PARSE_ERROR 179SET DEBUG_SYNC='p0 SIGNAx s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; 180--error ER_PARSE_ERROR 181SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOx s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; 182--error ER_PARSE_ERROR 183SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUx 0 EXECUTE 2 HIT_LIMIT 3'; 184--error ER_PARSE_ERROR 185SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTx 2 HIT_LIMIT 3'; 186--error ER_PARSE_ERROR 187SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIx 3'; 188--error ER_PARSE_ERROR 189SET DEBUG_SYNC='p0 CLEARx'; 190--error ER_PARSE_ERROR 191SET DEBUG_SYNC='p0 TESTx'; 192--error ER_PARSE_ERROR 193SET DEBUG_SYNC='RESETx'; 194 195# 196# Syntax. Invalid numbers. Decimal only. 197# 198--error ER_PARSE_ERROR 199SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 0x6 EXECUTE 2 HIT_LIMIT 3'; 200--error ER_PARSE_ERROR 201SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 0x2 HIT_LIMIT 3'; 202--error ER_PARSE_ERROR 203SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 7 EXECUTE 2 HIT_LIMIT 0x3'; 204 205# 206# Syntax. Invalid value type. 207# 208--error ER_WRONG_TYPE_FOR_VAR 209SET DEBUG_SYNC= 7; 210 211# 212# Syntax. DEBUG_SYNC is a SESSION-only variable. 213# 214--error ER_LOCAL_VARIABLE 215SET GLOBAL DEBUG_SYNC= 'p0 CLEAR'; 216 217# 218# Syntax. The variable value does not need to be a string literal. 219# 220SET @myvar= 'now SIGNAL from_myvar'; 221SET DEBUG_SYNC= @myvar; 222SHOW VARIABLES LIKE 'DEBUG_SYNC'; 223# 224SET DEBUG_SYNC= LEFT('now SIGNAL from_function_cut_here', 24); 225SHOW VARIABLES LIKE 'DEBUG_SYNC'; 226 227# 228# Functional tests. 229# 230# NOTE: There is the special synchronization point 'now'. It is placed 231# immediately after setting of the DEBUG_SYNC variable. 232# So it is executed before the SET statement ends. 233# 234# NOTE: There is only one global signal (say "signal post" or "flag mast"). 235# A SIGNAL action writes its signal into it ("sets a flag"). 236# The signal persists until explicitly overwritten. 237# To avoid confusion for later tests, it is recommended to clear 238# the signal by signalling "empty" ("setting the 'empty' flag"): 239# SET DEBUG_SYNC= 'now SIGNAL empty'; 240# Preferably you can reset the whole facility with: 241# SET DEBUG_SYNC= 'RESET'; 242# The signal is then '' (really empty) which connot be done otherwise. 243# 244 245# 246# Time out immediately. This gives just a warning. 247# 248SET DEBUG_SYNC= 'now SIGNAL something'; 249SHOW VARIABLES LIKE 'DEBUG_SYNC'; 250# Suppress warning number 251--replace_column 2 #### 252SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0'; 253# 254# If signal is present already, TIMEOUT 0 does not give a warning. 255# 256SET DEBUG_SYNC= 'now SIGNAL nothing'; 257SHOW VARIABLES LIKE 'DEBUG_SYNC'; 258SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0'; 259 260# 261# EXECUTE 0 is effectively a no-op. 262# 263SET DEBUG_SYNC= 'now SIGNAL something EXECUTE 0'; 264SHOW VARIABLES LIKE 'DEBUG_SYNC'; 265SET DEBUG_SYNC= 'now WAIT_FOR anotherthing TIMEOUT 0 EXECUTE 0'; 266 267# 268# Run into HIT_LIMIT. This gives an error. 269# 270--error ER_DEBUG_SYNC_HIT_LIMIT 271SET DEBUG_SYNC= 'now HIT_LIMIT 1'; 272 273# 274# Many actions. Watch the array growing and shrinking in the debug trace: 275# egrep 'query:|debug_sync_action:' mysql-test/var/log/master.trace 276# 277SET DEBUG_SYNC= 'RESET'; 278SHOW VARIABLES LIKE 'DEBUG_SYNC'; 279SET DEBUG_SYNC= 'p1abcd SIGNAL s1 EXECUTE 2'; 280SET DEBUG_SYNC= 'p2abc SIGNAL s2 EXECUTE 2'; 281SET DEBUG_SYNC= 'p9abcdef SIGNAL s9 EXECUTE 2'; 282SET DEBUG_SYNC= 'p4a SIGNAL s4 EXECUTE 2'; 283SET DEBUG_SYNC= 'p5abcde SIGNAL s5 EXECUTE 2'; 284SET DEBUG_SYNC= 'p6ab SIGNAL s6 EXECUTE 2'; 285SET DEBUG_SYNC= 'p7 SIGNAL s7 EXECUTE 2'; 286SET DEBUG_SYNC= 'p8abcdef SIGNAL s8 EXECUTE 2'; 287SET DEBUG_SYNC= 'p3abcdef SIGNAL s3 EXECUTE 2'; 288# 289# Execute some actions to show they exist. Each sets a distinct signal. 290# 291SET DEBUG_SYNC= 'p4a TEST'; 292SHOW VARIABLES LIKE 'DEBUG_SYNC'; 293SET DEBUG_SYNC= 'p1abcd TEST'; 294SHOW VARIABLES LIKE 'DEBUG_SYNC'; 295SET DEBUG_SYNC= 'p7 TEST'; 296SHOW VARIABLES LIKE 'DEBUG_SYNC'; 297SET DEBUG_SYNC= 'p9abcdef TEST'; 298SHOW VARIABLES LIKE 'DEBUG_SYNC'; 299SET DEBUG_SYNC= 'p3abcdef TEST'; 300SHOW VARIABLES LIKE 'DEBUG_SYNC'; 301# 302# Clear the actions. 303# 304SET DEBUG_SYNC= 'p1abcd CLEAR'; 305SET DEBUG_SYNC= 'p2abc CLEAR'; 306SET DEBUG_SYNC= 'p5abcde CLEAR'; 307SET DEBUG_SYNC= 'p6ab CLEAR'; 308SET DEBUG_SYNC= 'p8abcdef CLEAR'; 309SET DEBUG_SYNC= 'p9abcdef CLEAR'; 310SET DEBUG_SYNC= 'p3abcdef CLEAR'; 311SET DEBUG_SYNC= 'p4a CLEAR'; 312SET DEBUG_SYNC= 'p7 CLEAR'; 313# 314# Execute some actions to show they have gone. 315# 316SET DEBUG_SYNC= 'p1abcd TEST'; 317SHOW VARIABLES LIKE 'DEBUG_SYNC'; 318SET DEBUG_SYNC= 'p7 TEST'; 319SHOW VARIABLES LIKE 'DEBUG_SYNC'; 320SET DEBUG_SYNC= 'p9abcdef TEST'; 321SHOW VARIABLES LIKE 'DEBUG_SYNC'; 322# 323# Now cleanup. Actions are clear already, but signal needs to be cleared. 324# 325SET DEBUG_SYNC= 'RESET'; 326SHOW VARIABLES LIKE 'DEBUG_SYNC'; 327 328# 329# Facility requires SUPER privilege. 330# 331CREATE USER mysqltest_1@localhost; 332GRANT SUPER ON *.* TO mysqltest_1@localhost; 333connect (con1,localhost,mysqltest_1,,); 334SET DEBUG_SYNC= 'RESET'; 335disconnect con1; 336connection default; 337DROP USER mysqltest_1@localhost; 338# 339CREATE USER mysqltest_2@localhost; 340GRANT ALL ON *.* TO mysqltest_2@localhost; 341REVOKE SUPER ON *.* FROM mysqltest_2@localhost; 342connect (con1,localhost,mysqltest_2,,); 343--error ER_SPECIFIC_ACCESS_DENIED_ERROR 344SET DEBUG_SYNC= 'RESET'; 345disconnect con1; 346connection default; 347DROP USER mysqltest_2@localhost; 348 349# 350# Example 1. 351# 352# Preparative cleanup. 353--disable_warnings 354SET DEBUG_SYNC= 'RESET'; 355DROP TABLE IF EXISTS t1; 356--enable_warnings 357# 358# Test. 359CREATE TABLE t1 (c1 INT); 360 connect (con1,localhost,root,,); 361 SET DEBUG_SYNC= 'before_lock_tables_takes_lock 362 SIGNAL opened WAIT_FOR flushed'; 363 send INSERT INTO t1 VALUES(1); 364connection default; 365SET DEBUG_SYNC= 'now WAIT_FOR opened'; 366SET DEBUG_SYNC= 'after_flush_unlock SIGNAL flushed'; 367FLUSH TABLE t1; 368 connection con1; 369 reap; 370 disconnect con1; 371connection default; 372DROP TABLE t1; 373 374# 375# Example 2. 376# 377# Preparative cleanup. 378--disable_warnings 379SET DEBUG_SYNC= 'RESET'; 380DROP TABLE IF EXISTS t1; 381--enable_warnings 382# 383# Test. 384CREATE TABLE t1 (c1 INT) ENGINE=MyISAM; 385INSERT INTO t1 VALUES (1); 386SELECT GET_LOCK('mysqltest_lock', 100); 387 388connect (con1,localhost,root,,); 389--echo # Sending: 390--send UPDATE t1 SET c1=GET_LOCK('mysqltest_lock', 100); 391 392connect (con2,localhost,root,,); 393let $wait_condition= 394 select count(*) = 1 from information_schema.processlist 395 where state = "User lock" and 396 info = "UPDATE t1 SET c1=GET_LOCK('mysqltest_lock', 100)"; 397--source include/wait_condition.inc 398 399# Retain action after use. First used by general_log. 400SET DEBUG_SYNC= 'wait_for_lock SIGNAL locked EXECUTE 2'; 401send INSERT INTO t1 VALUES (1); 402 403connection default; 404# Wait until INSERT waits for lock. 405SET DEBUG_SYNC= 'now WAIT_FOR locked'; 406# let UPDATE continue. 407SELECT RELEASE_LOCK('mysqltest_lock'); 408connection con1; 409--echo # Reaping UPDATE 410reap; 411SELECT RELEASE_LOCK('mysqltest_lock'); 412 413connection con2; 414--echo retrieve INSERT result. 415reap; 416disconnect con1; 417disconnect con2; 418connection default; 419DROP TABLE t1; 420 421# 422# Cleanup after test case. 423# Otherwise signal would contain 'flushed' here, 424# which could confuse the next test. 425# 426SET DEBUG_SYNC= 'RESET'; 427 428