ctdb-tools: Use leader broadcast in get_leader()
authorMartin Schwenke <martin@meltin.net>
Thu, 19 Mar 2020 06:14:10 +0000 (17:14 +1100)
committerMartin Schwenke <martins@samba.org>
Mon, 17 Jan 2022 10:21:33 +0000 (10:21 +0000)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/tools/ctdb.c

index 1c3e4ba55daafc7d8006827b4e2bcb0a3836841a..0294040eec4f67adf32e7092eea285b154f32e76 100644 (file)
@@ -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;
 }