From: Martin Schwenke Date: Thu, 19 Mar 2020 06:14:10 +0000 (+1100) Subject: ctdb-tools: Use leader broadcast in get_leader() X-Git-Tag: tdb-1.4.6~108 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e60581d5b5ecbac2b4bae49fbf60e071372fc2d3;p=thirdparty%2Fsamba.git ctdb-tools: Use leader broadcast in get_leader() Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c index 1c3e4ba55da..0294040eec4 100644 --- a/ctdb/tools/ctdb.c +++ b/ctdb/tools/ctdb.c @@ -744,24 +744,36 @@ static void leader_handler(uint64_t srvid, ctdb->leader_pnn = leader_pnn; } +static bool get_leader_done(void *private_data) +{ + struct ctdb_context *ctdb = talloc_get_type_abort( + private_data, struct ctdb_context); + + return ctdb->leader_pnn != CTDB_UNKNOWN_PNN; +} + static int get_leader(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb, uint32_t *leader) { - uint32_t pnn; int ret; - ret = ctdb_ctrl_get_recmaster(mem_ctx, - ctdb->ev, - ctdb->client, - ctdb->cmd_pnn, - TIMEOUT(), - &pnn); - if (ret != 0) { + ret = ctdb_client_wait_func_timeout(ctdb->ev, + get_leader_done, + ctdb, + TIMEOUT()); + /* + * If ETIMEDOUT then assume there is no leader and succeed so + * initial value of CTDB_UNKNOWN_PNN is returned + */ + if (ret == ETIMEDOUT) { + ret = 0; + } else if (ret != 0) { + fprintf(stderr, "Error getting recovery master\n"); return ret; } - *leader = pnn; + *leader = ctdb->leader_pnn; return 0; }