ctdb-daemon: Invalidate records if a node becomes INACTIVE
authorAmitay Isaacs <amitay@gmail.com>
Wed, 14 Feb 2018 03:19:44 +0000 (14:19 +1100)
committerAmitay Isaacs <amitay@samba.org>
Mon, 8 Oct 2018 00:46:20 +0000 (02:46 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13641

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/server/ctdb_freeze.c

index c41fc7d53ee7cad35dbb7a8758424013fac06fc6..10841efa1b9176c7513a403683fb3c2734075681 100644 (file)
@@ -140,6 +140,9 @@ static int ctdb_db_freeze_handle_destructor(struct ctdb_db_freeze_handle *h)
        ctdb_db->freeze_mode = CTDB_FREEZE_NONE;
        ctdb_db->freeze_handle = NULL;
 
+       /* Clear invalid records flag */
+       ctdb_db->invalid_records = false;
+
        talloc_free(h->lreq);
        return 0;
 }
@@ -393,6 +396,19 @@ static int db_freeze_waiter_destructor(struct ctdb_db_freeze_waiter *w)
        return 0;
 }
 
+/**
+ * Invalidate the records in the database.
+ * This only applies to volatile databases.
+ */
+static int db_invalidate(struct ctdb_db_context *ctdb_db, void *private_data)
+{
+       if (ctdb_db_volatile(ctdb_db)) {
+               ctdb_db->invalid_records = true;
+       }
+
+       return 0;
+}
+
 /**
  * Count the number of databases
  */
@@ -436,13 +452,17 @@ static int db_freeze(struct ctdb_db_context *ctdb_db, void *private_data)
 }
 
 /*
-  start the freeze process for a certain priority
+  start the freeze process for all databases
+  This is only called from ctdb_control_freeze(), which is called
+  only on node becoming INACTIVE.  So mark the records invalid.
  */
 static void ctdb_start_freeze(struct ctdb_context *ctdb)
 {
        struct ctdb_freeze_handle *h;
        int ret;
 
+       ctdb_db_iterator(ctdb, db_invalidate, NULL);
+
        if (ctdb->freeze_mode == CTDB_FREEZE_FROZEN) {
                int count = 0;
 
@@ -534,6 +554,8 @@ static int ctdb_freeze_waiter_destructor(struct ctdb_freeze_waiter *w)
 
 /*
   freeze all the databases
+  This control is only used when freezing database on node becoming INACTIVE.
+  So mark the records invalid in ctdb_start_freeze().
  */
 int32_t ctdb_control_freeze(struct ctdb_context *ctdb,
                            struct ctdb_req_control_old *c, bool *async_reply)