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 <rusty@rustcorp.com.au>
#include "lib/util/dlinklist.h"
#include "db_wrap.h"
#include "lib/util/dlinklist.h"
#include "db_wrap.h"
+static bool later_db(const char *name)
+{
+ return (strstr(name, "notify") || strstr(name, "serverid"));
+}
if (ctdb_db->priority != priority) {
continue;
}
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));
continue;
}
DEBUG(DEBUG_INFO,("locking database 0x%08x priority:%u %s\n", ctdb_db->db_id, ctdb_db->priority, ctdb_db->db_name));
if (ctdb_db->priority != priority) {
continue;
}
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));
continue;
}
DEBUG(DEBUG_INFO,("locking database 0x%08x priority:%u %s\n", ctdb_db->db_id, ctdb_db->priority, ctdb_db->db_name));