From 28a1b75886fb4aea65e23bfd00b9f4c98780fdfd Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Tue, 6 May 2014 14:24:52 +1000 Subject: [PATCH] ctdb-recoverd: Set recovery mode before freezing databases Setting recovery mode to active is the only correct way to inform recovery daemon to run database recovery. Only freezing databases without setting recovery mode should not trigger database recovery, as this mechanism is used in tool to implement wipedb/restoredb commands. Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- ctdb/server/ctdb_banning.c | 2 +- ctdb/server/ctdb_recoverd.c | 42 +++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/ctdb/server/ctdb_banning.c b/ctdb/server/ctdb_banning.c index 13d97c84b13..a9d18910a06 100644 --- a/ctdb/server/ctdb_banning.c +++ b/ctdb/server/ctdb_banning.c @@ -70,11 +70,11 @@ void ctdb_local_node_got_banned(struct ctdb_context *ctdb) */ ctdb->vnn_map->generation = INVALID_GENERATION; + ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE; for (i=1; i<=NUM_DB_PRIORITIES; i++) { ctdb_start_freeze(ctdb, i); } ctdb_release_all_ips(ctdb); - ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE; } int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata) diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c index f553f67715e..ab73e884c28 100644 --- a/ctdb/server/ctdb_recoverd.c +++ b/ctdb/server/ctdb_recoverd.c @@ -379,8 +379,23 @@ static int set_recovery_mode(struct ctdb_context *ctdb, struct ctdb_recoverd *re tmp_ctx = talloc_new(ctdb); CTDB_NO_MEMORY(ctdb, tmp_ctx); - /* freeze all nodes */ nodes = list_of_active_nodes(ctdb, nodemap, tmp_ctx, true); + + data.dsize = sizeof(uint32_t); + data.dptr = (unsigned char *)&rec_mode; + + if (ctdb_client_async_control(ctdb, CTDB_CONTROL_SET_RECMODE, + nodes, 0, + CONTROL_TIMEOUT(), + false, data, + NULL, NULL, + NULL) != 0) { + DEBUG(DEBUG_ERR, (__location__ " Unable to set recovery mode. Recovery failed.\n")); + talloc_free(tmp_ctx); + return -1; + } + + /* freeze all nodes */ if (rec_mode == CTDB_RECOVERY_ACTIVE) { int i; @@ -399,21 +414,6 @@ static int set_recovery_mode(struct ctdb_context *ctdb, struct ctdb_recoverd *re } } - - data.dsize = sizeof(uint32_t); - data.dptr = (unsigned char *)&rec_mode; - - if (ctdb_client_async_control(ctdb, CTDB_CONTROL_SET_RECMODE, - nodes, 0, - CONTROL_TIMEOUT(), - false, data, - NULL, NULL, - NULL) != 0) { - DEBUG(DEBUG_ERR, (__location__ " Unable to set recovery mode. Recovery failed.\n")); - talloc_free(tmp_ctx); - return -1; - } - talloc_free(tmp_ctx); return 0; } @@ -3654,17 +3654,17 @@ static void main_loop(struct ctdb_context *ctdb, struct ctdb_recoverd *rec, if (ctdb->recovery_mode == CTDB_RECOVERY_NORMAL) { DEBUG(DEBUG_ERR,("Node is stopped or banned but recovery mode is not active. Activate recovery mode and lock databases\n")); - ret = ctdb_ctrl_freeze_priority(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, 1); - if (ret != 0) { - DEBUG(DEBUG_ERR,(__location__ " Failed to freeze node in STOPPED or BANNED state\n")); - return; - } ret = ctdb_ctrl_setrecmode(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, CTDB_RECOVERY_ACTIVE); if (ret != 0) { DEBUG(DEBUG_ERR,(__location__ " Failed to activate recovery mode in STOPPED or BANNED state\n")); return; } + ret = ctdb_ctrl_freeze(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE); + if (ret != 0) { + DEBUG(DEBUG_ERR,(__location__ " Failed to freeze node in STOPPED or BANNED state\n")); + return; + } } /* If this node is stopped or banned then it is not the recovery -- 2.11.4.GIT