mirror of
https://github.com/MariaDB/server.git
synced 2025-08-31 22:22:30 +03:00
The bug case is similar to one fixed earlier bug_49536. Deadlock involving LOCK_log appears to be possible because the purge running thread is holding LOCK_log whereas there is no sense of doing that and which fact was exploited by the earlier bug fixes. Fixed with small reengineering of rotate_and_purge(), adding two new methods and setting up a policy to execute those instead of the former rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED). The policy for using rotate(), purge() is that if the caller acquires LOCK_log itself, it should call rotate(), release the mutex and run purge(). Side effect of this patch is refining error message of bug@11747416 to print the whole path.
31 lines
867 B
Plaintext
31 lines
867 B
Plaintext
include/master-slave.inc
|
|
[connection master]
|
|
show binary logs;
|
|
Log_name File_size
|
|
master-bin.000001 #
|
|
create table t1 (f text) engine=innodb;
|
|
SET DEBUG_SYNC = 'at_purge_logs_before_date WAIT_FOR rotated';
|
|
insert into t1 set f=repeat('a', 4096);
|
|
*** there must be two logs in the list ***
|
|
show binary logs;
|
|
Log_name File_size
|
|
master-bin.000001 #
|
|
master-bin.000002 #
|
|
insert into t1 set f=repeat('b', 4096);
|
|
*** there must be three logs in the list ***
|
|
show binary logs;
|
|
Log_name File_size
|
|
master-bin.000001 #
|
|
master-bin.000002 #
|
|
master-bin.000003 #
|
|
SET DEBUG_SYNC = 'now SIGNAL rotated';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
SET DEBUG_SYNC = 'at_purge_logs_before_date WAIT_FOR rotated';
|
|
insert into t1 set f=repeat('b', 4096);
|
|
SET DEBUG_SYNC = 'now SIGNAL rotated';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
drop table t1;
|
|
include/rpl_end.inc
|