From 4b7d81955ac75be59a972bfe0d467096eb9bac38 Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Wed, 14 Feb 2018 14:19:44 +1100 Subject: ctdb-daemon: Invalidate records if a node becomes INACTIVE BUG: https://bugzilla.samba.org/show_bug.cgi?id=13641 Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke (cherry picked from commit c4ec99b1d3f1c5bff83bf66e3fd64d45a8be7441) --- ctdb/server/ctdb_freeze.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'ctdb') diff --git a/ctdb/server/ctdb_freeze.c b/ctdb/server/ctdb_freeze.c index c41fc7d53ee..10841efa1b9 100644 --- a/ctdb/server/ctdb_freeze.c +++ b/ctdb/server/ctdb_freeze.c @@ -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) -- cgit v1.2.1