| Bug #71901 | rotate + purge binlog lead to stall | ||
|---|---|---|---|
| Submitted: | 3 Mar 2014 2:12 | Modified: | 10 May 2019 7:34 | 
| Reporter: | zhai weixiang (OCA) | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Utilities: Binlog Events | Severity: | S3 (Non-critical) | 
| Version: | 5.6.16, 5.6.17 | OS: | Any | 
| Assigned to: | CPU Architecture: | Any | |
   [21 Apr 2014 11:23]
   MySQL Verification Team        
  Hello Weixiang, Thank you for the bug report. Verified as described. I'm able to reproduce this only 1/15 times with large binary logs. Thanks, Umesh
   [2 Nov 2016 8:04]
   MySQL Verification Team        
  Bug #83526 marked as duplicate of this one.
   [10 May 2019 7:34]
   Erlend Dahl        
  Duplicate of Bug#44150 non-blocking PURGE MASTER LOGS
   [21 Apr 2020 16:26]
   MySQL Verification Team        
  https://bugs.mysql.com/bug.php?id=99315 marked as duplicate of this one.

Description: related backtrace: 1 unlink(libc.so.6),my_delete(my_delete.c:26),inline_mysql_file_delete(mysql_file.h:1281),MYSQL_BIN_LOG::purge_index_entry(mysql_file.h:1281),MYSQL_BIN_LOG::purge_logs(binlog.cc:4194),purge_master_logs(binlog.cc:2063),mysql_execute_command(sql_parse.cc:2682),mysql_parse(sql_parse.cc:6235),dispatch_command(sql_parse.cc:1334),do_handle_one_connection(sql_connect.cc:982),handle_one_connection(sql_connect.cc:898),start_thread(libpthread.so.0),clone(libc.so.6) ----- this thread holds the LOCK_index until the purge operation finished 1 __lll_lock_wait(libpthread.so.0),_L_lock_854(libpthread.so.0),pthread_mutex_lock(libpthread.so.0),inline_mysql_mutex_lock(mysql_thread.h:690),MYSQL_BIN_LOG::new_file_impl(binlog.cc:4737),new_file_without_locking(binlog.cc:4691),MYSQL_BIN_LOG::rotate(binlog.cc:4691),MYSQL_BIN_LOG::ordered_commit(binlog.cc:6930),MYSQL_BIN_LOG::commit(binlog.cc:6320),ha_commit_trans(handler.cc:1435),trans_commit_stmt(transaction.cc:434),mysql_execute_command(sql_parse.cc:4997),mysql_parse(sql_parse.cc:6235),dispatch_command(sql_parse.cc:1334),do_handle_one_connection(sql_connect.cc:982),handle_one_connection(sql_connect.cc:898),start_thread(libpthread.so.0),clone(libc.so.6) ----waiting for LOCK_index How to repeat: rotate + purge binary logs Suggested fix: The main logic of function MYSQL_BIN_LOG::purge_logs: 1. Lock LOCK_index 2. scan the index file and store binary files that need to be purged in purge_index_file 3. update the index file 4. delete binary logs 5. unlock LOCK_index I think we can exchange step 4 and step5 , and introduce another lock to only protect the purge_index_file (or just create an independent IO_CACHE for each purge operation ? )