From: Rusty Russell Date: Thu, 1 Jul 2010 11:46:55 +0000 (+1000) Subject: ctdb_freeze: extend db priority hack to cover serverid.tdb deadlock. X-Git-Tag: ctdb-1.9.1~3 X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=dfdaa446cf256854ff6d267dceeb86fbee8bb188;p=sahlberg%2Fctdb.git ctdb_freeze: extend db priority hack to cover serverid.tdb deadlock. We discovered that recent smbd locks the serverid tdb while holding a lock on another tdb (locking.tdb): 7: POSIX ADVISORY WRITE smbd-2224318 locking.tdb.0 10600 10600 22: -> POSIX ADVISORY READ smbd-2224318 serverid.tdb.0 26580 26580 The result is a deadlock against the ctdb_freeze code called for recovery. We extend the "notify" workaround to this case, too. BZ:65158 Signed-off-by: Rusty Russell --- diff --git a/server/ctdb_freeze.c b/server/ctdb_freeze.c index 70333b0b..e641ef3a 100644 --- a/server/ctdb_freeze.c +++ b/server/ctdb_freeze.c @@ -26,6 +26,10 @@ #include "lib/util/dlinklist.h" #include "db_wrap.h" +static bool later_db(const char *name) +{ + return (strstr(name, "notify") || strstr(name, "serverid")); +} /* lock all databases @@ -43,7 +47,7 @@ static int ctdb_lock_all_databases(struct ctdb_context *ctdb, uint32_t priority) if (ctdb_db->priority != priority) { continue; } - if (strstr(ctdb_db->db_name, "notify") != NULL) { + if (later_db(ctdb_db->db_name)) { continue; } DEBUG(DEBUG_INFO,("locking database 0x%08x priority:%u %s\n", ctdb_db->db_id, ctdb_db->priority, ctdb_db->db_name)); @@ -56,7 +60,7 @@ static int ctdb_lock_all_databases(struct ctdb_context *ctdb, uint32_t priority) if (ctdb_db->priority != priority) { continue; } - if (strstr(ctdb_db->db_name, "notify") == NULL) { + if (!later_db(ctdb_db->db_name)) { continue; } DEBUG(DEBUG_INFO,("locking database 0x%08x priority:%u %s\n", ctdb_db->db_id, ctdb_db->priority, ctdb_db->db_name));