List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:December 9 2009 10:40am
Subject:bzr commit into mysql-5.1-telco-6.3 branch (jonas:3189) Bug#49536
View as plain text  
#At file:///home/jonas/src/telco-6.3/ based on revid:jonas@stripped

 3189 Jonas Oreland	2009-12-09
      bug#49536 - deadlock on rotate_and_purge when using expire_logs_days
        Problem is that purge_logs implementation in ndb (ndbcluster_binlog_index_purge_file)
          calls mysql_parse (with (thd->options & OPTION_BIN_LOG) === 0)) 
          but MYSQL_BIN_LOG first takes LOCK_log and then checks thd->options
      
        Solution in this patch, changes so that rotate_and_purge does not hold
          LOCK_log when calling purge_logs_before_date. I think this is safe
          as other "purge"-function(s) is called wo/ holding LOCK_log, e.g purge_master_logs

    modified:
      sql/log.cc
=== modified file 'sql/log.cc'
--- a/sql/log.cc	2009-10-01 05:56:05 +0000
+++ b/sql/log.cc	2009-12-09 10:40:21 +0000
@@ -4267,23 +4267,32 @@ bool general_log_write(THD *thd, enum en
 
 void MYSQL_BIN_LOG::rotate_and_purge(uint flags)
 {
+#ifdef HAVE_REPLICATION
+  bool check_purge= false;
+#endif
   if (!(flags & RP_LOCK_LOG_IS_ALREADY_LOCKED))
     pthread_mutex_lock(&LOCK_log);
   if ((flags & RP_FORCE_ROTATE) ||
       (my_b_tell(&log_file) >= (my_off_t) max_size))
   {
     new_file_without_locking();
-#ifdef HAVE_REPLICATION
-    if (expire_logs_days)
-    {
-      time_t purge_time= my_time(0) - expire_logs_days*24*60*60;
-      if (purge_time >= 0)
-        purge_logs_before_date(purge_time);
-    }
-#endif
+    check_purge= true;
   }
   if (!(flags & RP_LOCK_LOG_IS_ALREADY_LOCKED))
     pthread_mutex_unlock(&LOCK_log);
+
+#ifdef HAVE_REPLICATION
+  /*
+    NOTE: Run purge_logs wo/ holding LOCK_log
+          as it otherwise will deadlock in ndbcluster_binlog_index_purge_file
+  */
+  if (check_purge && expire_logs_days)
+  {
+    time_t purge_time= my_time(0) - expire_logs_days*24*60*60;
+    if (purge_time >= 0)
+      purge_logs_before_date(purge_time);
+  }
+#endif
 }
 
 uint MYSQL_BIN_LOG::next_file_id()


Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20091209104021-w3ep6ecrfe6ktahf.bundle
Thread
bzr commit into mysql-5.1-telco-6.3 branch (jonas:3189) Bug#49536Jonas Oreland9 Dec