rpl_deadlock.test
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. # See if slave restarts the transaction after failing on an InnoDB deadlock error.
  2. # Note: testing what happens when too many retries is possible, but
  3. # needs large waits when running with --debug, so we don't do it.
  4. # The same way, this test may not test what is expected when run
  5. # under Valgrind, timings are too short then (with --valgrind I
  6. # (Guilhem) have seen the test manage to provoke lock wait timeout
  7. # error but not deadlock error; that is ok as code deals with the two
  8. # errors in exactly the same way.
  9. # We don't 'show status like 'slave_retried_transactions'' because this
  10. # is not repeatable (depends on sleeps).
  11. source include/have_innodb.inc;
  12. source include/master-slave.inc;
  13. connection master;
  14. create table t1 (a int not null, key(a)) engine=innodb;
  15. create table t2 (a int not null, key(a)) engine=innodb;
  16. create table t3 (a int) engine=innodb;
  17. create table t4 (a int) engine=innodb;
  18. show variables like 'slave_transaction_retries';
  19. sync_slave_with_master;
  20. show create table t1;
  21. show create table t2;
  22. show variables like 'slave_transaction_retries';
  23. stop slave;
  24. # 1) Test deadlock
  25. connection master;
  26. begin;
  27. # Let's keep BEGIN and the locked statement in two different relay logs.
  28. let $1=200;
  29. disable_query_log;
  30. while ($1)
  31. {
  32.  eval insert into t3 values( $1 );
  33.  dec $1;
  34. }
  35. enable_query_log;
  36. insert into t3 select * from t2 for update;
  37. insert into t1 values(1);
  38. commit;
  39. save_master_pos;
  40. connection slave;
  41. begin;
  42. # Let's make our transaction large so that it's slave who is chosen as
  43. # victim
  44. let $1=1000;
  45. disable_query_log;
  46. while ($1)
  47. {
  48.  eval insert into t4 values( $1 );
  49.  dec $1;
  50. }
  51. enable_query_log;
  52. select * from t1 for update;
  53. start slave;
  54. --sleep 3 # hope that slave is blocked now
  55. insert into t2 values(22); # provoke deadlock, slave should be victim
  56. commit;
  57. sync_with_master;
  58. select * from t1; # check that slave succeeded finally
  59. select * from t2;
  60. # check that no error is reported
  61. --replace_column 1 # 8 # 9 # 23 # 33 #
  62. --replace_result $MASTER_MYPORT MASTER_MYPORT
  63. show slave status;
  64. # 2) Test lock wait timeout
  65. stop slave;
  66. change master to master_log_pos=401; # the BEGIN log event
  67. begin;
  68. select * from t2 for update; # hold lock
  69. start slave;
  70. --sleep 10 # slave should have blocked, and be retrying
  71. commit;
  72. sync_with_master;
  73. select * from t1; # check that slave succeeded finally
  74. select * from t2;
  75. # check that no error is reported
  76. --replace_column 1 # 8 # 9 # 23 # 33 #
  77. --replace_result $MASTER_MYPORT MASTER_MYPORT
  78. show slave status;
  79. # Now we repeat 2), but with BEGIN in the same relay log as
  80. # COMMIT (to see if seeking into hot log is ok).
  81. set global max_relay_log_size=0;
  82. # This is really copy-paste of 2) of above
  83. stop slave;
  84. change master to master_log_pos=401;
  85. begin;
  86. select * from t2 for update;
  87. start slave;
  88. --sleep 10
  89. commit;
  90. sync_with_master;
  91. select * from t1;
  92. select * from t2;
  93. --replace_column 1 # 8 # 9 # 23 # 33 #
  94. --replace_result $MASTER_MYPORT MASTER_MYPORT
  95. show slave status;
  96. connection master;
  97. drop table t1,t2,t3,t4;
  98. sync_slave_with_master;
  99. # End of 4.1 tests