daemon: Add a tunable to enable automatic database priority setting
[obnox/ctdb.git] / server / ctdb_lock.c
index fd91c63e890f514513f44356b5711f39637b6ebf..8a2ba5cded6ffc0f951907b3fd60a860496b4761 100644 (file)
@@ -53,6 +53,13 @@ enum lock_type {
        LOCK_ALLDB,
 };
 
+static const char * const lock_type_str[] = {
+       "lock_record",
+       "lock_db",
+       "lock_alldb_prio",
+       "lock_db",
+};
+
 struct lock_request;
 
 /* lock_context is the common part for a lock request */
@@ -89,8 +96,12 @@ struct lock_request {
  * By default, all databases are set to priority 1. So only when priority
  * is set to 1, check for databases that need higher priority.
  */
-static bool later_db(const char *name)
+static bool later_db(struct ctdb_context *ctdb, const char *name)
 {
+       if (ctdb->tunable.samba3_hack == 0) {
+               return false;
+       }
+
        if (strstr(name, "brlock") ||
            strstr(name, "g_lock") ||
            strstr(name, "notify_onelevel") ||
@@ -113,7 +124,7 @@ int ctdb_lockall_prio(struct ctdb_context *ctdb, uint32_t priority)
                if (ctdb_db->priority != priority) {
                        continue;
                }
-               if (later_db(ctdb_db->db_name)) {
+               if (later_db(ctdb, ctdb_db->db_name)) {
                        continue;
                }
                DEBUG(DEBUG_INFO, ("locking database %s, priority:%u\n",
@@ -131,7 +142,7 @@ int ctdb_lockall_prio(struct ctdb_context *ctdb, uint32_t priority)
        }
 
        for (ctdb_db = ctdb->db_list; ctdb_db; ctdb_db = ctdb_db->next) {
-               if (!later_db(ctdb_db->db_name)) {
+               if (!later_db(ctdb, ctdb_db->db_name)) {
                        continue;
                }
                DEBUG(DEBUG_INFO, ("locking database %s, priority:%u\n",
@@ -221,7 +232,7 @@ int ctdb_lockall_mark_prio(struct ctdb_context *ctdb, uint32_t priority)
                if (ctdb_db->priority != priority) {
                        continue;
                }
-               if (later_db(ctdb_db->db_name)) {
+               if (later_db(ctdb, ctdb_db->db_name)) {
                        continue;
                }
                if (tdb_transaction_write_lock_mark(ctdb_db->ltdb->tdb) != 0) {
@@ -239,7 +250,7 @@ int ctdb_lockall_mark_prio(struct ctdb_context *ctdb, uint32_t priority)
        }
 
        for (ctdb_db = ctdb->db_list; ctdb_db; ctdb_db = ctdb_db->next) {
-               if (!later_db(ctdb_db->db_name)) {
+               if (!later_db(ctdb, ctdb_db->db_name)) {
                        continue;
                }
                if (tdb_transaction_write_lock_mark(ctdb_db->ltdb->tdb) != 0) {
@@ -567,11 +578,10 @@ static void ctdb_lock_handler(struct tevent_context *ev,
 
        if (locked) {
                CTDB_INCREMENT_STAT(lock_ctx->ctdb, locks.num_current);
-               CTDB_UPDATE_RECLOCK_LATENCY(lock_ctx->ctdb, "lock()", locks.latency, t);
                CTDB_INCREMENT_STAT(lock_ctx->ctdb, locks.buckets[id]);
                if (lock_ctx->ctdb_db) {
                        CTDB_INCREMENT_DB_STAT(lock_ctx->ctdb_db, locks.num_current);
-                       CTDB_UPDATE_DB_RECLOCK_LATENCY(lock_ctx->ctdb_db, "lock()", locks.latency, t);
+                       CTDB_UPDATE_DB_LATENCY(lock_ctx->ctdb_db, lock_type_str[lock_ctx->type], locks.latency, t);
                        CTDB_INCREMENT_DB_STAT(lock_ctx->ctdb_db, locks.buckets[id]);
                }
        } else {
@@ -1039,13 +1049,13 @@ void ctdb_lock_blocked_handler(struct tevent_context *ev,
                DEBUG(DEBUG_WARNING,
                      ("Process %s (pid=%d) locked database %s (inode %lu) for %.0lf seconds\n",
                       (process_name ? process_name : "unknown"),
-                      blocker_pid, db_name, inode,
+                      blocker_pid, db_name, (unsigned long)inode,
                       timeval_elapsed(&lock_ctx->start_time)));
        } else {
                DEBUG(DEBUG_WARNING,
                      ("Process %s (pid=%d) locked database (inode %lu) for %.0lf seconds\n",
                       (process_name ? process_name : "unknown"),
-                      blocker_pid, inode,
+                      blocker_pid, (unsigned long)inode,
                       timeval_elapsed(&lock_ctx->start_time)));
        }
 
@@ -1058,7 +1068,7 @@ void ctdb_lock_blocked_handler(struct tevent_context *ev,
            process_name && strstr(process_name, "smbd")) {
                DEBUG(DEBUG_WARNING,
                      ("Deadlock detected. Killing smbd process (pid=%d)", blocker_pid));
-               ctdb_kill(lock_ctx->ctdb, blocker_pid, SIGKILL);
+               kill(blocker_pid, SIGKILL);
        }
 
        free(process_name);