freeze: Do an early exit if freeze is pending
authorAmitay Isaacs <amitay@gmail.com>
Tue, 5 Aug 2014 05:35:57 +0000 (15:35 +1000)
committerAmitay Isaacs <amitay@gmail.com>
Tue, 3 Mar 2015 01:28:54 +0000 (12:28 +1100)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
server/ctdb_freeze.c

index d68b0183ac41ca8f77ba2aaa085cbff62e465461..99dc699f02600d18dd0937259168f574c1b4bc63 100644 (file)
@@ -139,25 +139,28 @@ void ctdb_start_freeze(struct ctdb_context *ctdb, uint32_t priority)
                return;
        }
 
+       if (ctdb->freeze_handles[priority] != NULL) {
+               /* already trying to freeze */
+               return;
+       }
+
        DEBUG(DEBUG_ERR, ("Freeze priority %u\n", priority));
 
        /* Stop any vacuuming going on: we don't want to wait. */
        ctdb_stop_vacuuming(ctdb);
 
-       /* if there isn't a freeze lock child then create one */
-       if (ctdb->freeze_handles[priority] == NULL) {
-               h = talloc_zero(ctdb, struct ctdb_freeze_handle);
-               CTDB_NO_MEMORY_FATAL(ctdb, h);
-               h->ctdb = ctdb;
-               h->priority = priority;
-               talloc_set_destructor(h, ctdb_freeze_handle_destructor);
-
-               h->lreq = ctdb_lock_alldb_prio(h, ctdb, priority, false,
-                                              ctdb_freeze_lock_handler, h);
-               CTDB_NO_MEMORY_FATAL(ctdb, h->lreq);
-               ctdb->freeze_handles[priority] = h;
-               ctdb->freeze_mode[priority] = CTDB_FREEZE_PENDING;
-       }
+       /* create freeze lock child */
+       h = talloc_zero(ctdb, struct ctdb_freeze_handle);
+       CTDB_NO_MEMORY_FATAL(ctdb, h);
+       h->ctdb = ctdb;
+       h->priority = priority;
+       talloc_set_destructor(h, ctdb_freeze_handle_destructor);
+
+       h->lreq = ctdb_lock_alldb_prio(h, ctdb, priority, false,
+                                      ctdb_freeze_lock_handler, h);
+       CTDB_NO_MEMORY_FATAL(ctdb, h->lreq);
+       ctdb->freeze_handles[priority] = h;
+       ctdb->freeze_mode[priority] = CTDB_FREEZE_PENDING;
 }
 
 /*