in the destructor for the lock-wait child, make sure that we cancel any pending
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Sun, 6 Jul 2008 22:50:12 +0000 (08:50 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Sun, 6 Jul 2008 22:50:12 +0000 (08:50 +1000)
transactions.

server/ctdb_freeze.c
server/ctdb_recoverd.c

index 4e365e1ea0a44212f8c20bf1a7c30caa46620991..9cf0b7e4aa405a6c5f42066639c991fc3c35f8a4 100644 (file)
@@ -67,7 +67,25 @@ struct ctdb_freeze_handle {
  */    
 static int ctdb_freeze_handle_destructor(struct ctdb_freeze_handle *h)
 {
-       h->ctdb->freeze_mode = CTDB_FREEZE_NONE;
+       struct ctdb_context *ctdb = h->ctdb;
+       struct ctdb_db_context *ctdb_db;
+
+       /* cancel any pending transactions */
+       if (ctdb->freeze_handle && ctdb->freeze_handle->transaction_started) {
+               for (ctdb_db=ctdb->db_list;ctdb_db;ctdb_db=ctdb_db->next) {
+                       tdb_add_flags(ctdb_db->ltdb->tdb, TDB_NOLOCK);
+                       if (tdb_transaction_cancel(ctdb_db->ltdb->tdb) != 0) {
+                               DEBUG(DEBUG_ERR,(__location__ " Failed to cancel transaction for db '%s'\n",
+                                        ctdb_db->db_name));
+                       }
+                       tdb_remove_flags(ctdb_db->ltdb->tdb, TDB_NOLOCK);
+               }
+               ctdb->freeze_handle->transaction_started = false;
+       }
+
+       ctdb->freeze_mode = CTDB_FREEZE_NONE;
+       ctdb->freeze_handle = NULL;
+
        kill(h->child, SIGKILL);
        waitpid(h->child, NULL, 0);
        return 0;
index a20776a8f4cffe183e48dea5a6edbfa82b46b18b..80443bb75ad19efde7ca7518afc5bcc88909a9a4 100644 (file)
@@ -1375,7 +1375,7 @@ static int do_recovery(struct ctdb_recoverd *rec,
 
        /* set recovery mode to active on all nodes */
        ret = set_recovery_mode(ctdb, nodemap, CTDB_RECOVERY_ACTIVE);
-       if (ret!=0) {
+       if (ret != 0) {
                DEBUG(DEBUG_ERR, (__location__ " Unable to set recovery mode to active on cluster\n"));
                return -1;
        }
@@ -1515,7 +1515,7 @@ static int do_recovery(struct ctdb_recoverd *rec,
 
        /* disable recovery mode */
        ret = set_recovery_mode(ctdb, nodemap, CTDB_RECOVERY_NORMAL);
-       if (ret!=0) {
+       if (ret != 0) {
                DEBUG(DEBUG_ERR, (__location__ " Unable to set recovery mode to normal on cluster\n"));
                return -1;
        }
@@ -1846,7 +1846,7 @@ static void force_election(struct ctdb_recoverd *rec, uint32_t pnn,
 
        /* set all nodes to recovery mode to stop all internode traffic */
        ret = set_recovery_mode(ctdb, nodemap, CTDB_RECOVERY_ACTIVE);
-       if (ret!=0) {
+       if (ret != 0) {
                DEBUG(DEBUG_ERR, (__location__ " Unable to set recovery mode to active on cluster\n"));
                return;
        }