summaryrefslogtreecommitdiff
path: root/ctdb
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2020-03-19 17:14:10 +1100
committerMartin Schwenke <martins@samba.org>2022-01-17 10:21:33 +0000
commite60581d5b5ecbac2b4bae49fbf60e071372fc2d3 (patch)
treedda288dd2349e5e24148c0a1ccd9e293888c886d /ctdb
parent92fb68e9b8a5481d9dd5c9033c98e204035509fe (diff)
downloadsamba-e60581d5b5ecbac2b4bae49fbf60e071372fc2d3.tar.gz
ctdb-tools: Use leader broadcast in get_leader()
Signed-off-by: Martin Schwenke <martin@meltin.net> Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb')
-rw-r--r--ctdb/tools/ctdb.c30
1 files changed, 21 insertions, 9 deletions
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;
}