From: Martin Schwenke Date: Thu, 20 Sep 2018 02:30:58 +0000 (+1000) Subject: ctdb-recoverd: Factor out function cluster_lock_take() X-Git-Tag: tdb-1.4.6~121 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=011e880002b8d2bc783f96e8ea5713322fcc2a93;p=thirdparty%2Fsamba.git ctdb-recoverd: Factor out function cluster_lock_take() Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c index eb7773f9d47..0bd085df9b8 100644 --- a/ctdb/server/ctdb_recoverd.c +++ b/ctdb/server/ctdb_recoverd.c @@ -506,6 +506,33 @@ static int update_flags_on_all_nodes(struct ctdb_recoverd *rec, return 0; } +static bool ctdb_recovery_lock(struct ctdb_recoverd *rec); +static bool ctdb_recovery_have_lock(struct ctdb_recoverd *rec); + +static bool cluster_lock_take(struct ctdb_recoverd *rec) +{ + struct ctdb_context *ctdb = rec->ctdb; + bool lock_taken; + + if (ctdb->recovery_lock == NULL) { + return true; + } + + if (ctdb_recovery_have_lock(rec)) { + D_NOTICE("Already holding recovery lock\n"); + return true; + } + + D_NOTICE("Attempting to take recovery lock (%s)\n", ctdb->recovery_lock); + lock_taken = ctdb_recovery_lock(rec); + if (!lock_taken) { + return false; + } + + D_NOTICE("Recovery lock taken successfully\n"); + return true; +} + /* called when ctdb_wait_timeout should finish */ @@ -1244,31 +1271,23 @@ static int do_recovery(struct ctdb_recoverd *rec, TALLOC_CTX *mem_ctx) } if (ctdb->recovery_lock != NULL) { - if (ctdb_recovery_have_lock(rec)) { - D_NOTICE("Already holding recovery lock\n"); - } else { - bool ok; - - D_NOTICE("Attempting to take recovery lock (%s)\n", - ctdb->recovery_lock); - - ok = ctdb_recovery_lock(rec); - if (! ok) { - D_ERR("Unable to take recovery lock\n"); + bool ok; - if (!this_node_is_leader(rec)) { - D_NOTICE("Leader changed to %u," - " aborting recovery\n", - rec->leader); - rec->need_recovery = false; - goto fail; - } + ok = cluster_lock_take(rec); + if (!ok) { + D_ERR("Unable to take recovery lock\n"); - D_ERR("Abort recovery, ban this node\n"); - ctdb_ban_node(rec, rec->pnn); + if (!this_node_is_leader(rec)) { + D_NOTICE("Leader changed to %u," + " aborting recovery\n", + rec->leader); + rec->need_recovery = false; goto fail; } - D_NOTICE("Recovery lock taken successfully\n"); + + D_ERR("Abort recovery, ban this node\n"); + ctdb_ban_node(rec, rec->pnn); + goto fail; } }