ctdb-tests: Add leader broadcasts to fake_ctdbd
authorMartin Schwenke <martin@meltin.net>
Tue, 5 May 2020 13:02:03 +0000 (23:02 +1000)
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/tests/src/fake_ctdbd.c

index 1f831305e244fcec1abbe1d9dd450bf0fdc78d4e..9b269ca2fe4289f241a5d12090b670ca4650edd2 100644 (file)
@@ -4362,9 +4362,14 @@ static int client_recv(struct tevent_req *req, int *perr)
 struct server_state {
        struct tevent_context *ev;
        struct ctdbd_context *ctdb;
+       struct tevent_timer *leader_broadcast_te;
        int fd;
 };
 
+static void server_leader_broadcast(struct tevent_context *ev,
+                                   struct tevent_timer *te,
+                                   struct timeval current_time,
+                                   void *private_data);
 static void server_new_client(struct tevent_req *subreq);
 static void server_client_done(struct tevent_req *subreq);
 
@@ -4385,6 +4390,15 @@ static struct tevent_req *server_send(TALLOC_CTX *mem_ctx,
        state->ctdb = ctdb;
        state->fd = fd;
 
+       state->leader_broadcast_te = tevent_add_timer(state->ev,
+                                                     state,
+                                                     timeval_current_ofs(0, 0),
+                                                     server_leader_broadcast,
+                                                     state);
+       if (state->leader_broadcast_te == NULL) {
+               DBG_WARNING("Failed to set up leader broadcast\n");
+       }
+
        subreq = accept_send(state, ev, fd);
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
@@ -4394,6 +4408,41 @@ static struct tevent_req *server_send(TALLOC_CTX *mem_ctx,
        return req;
 }
 
+static void server_leader_broadcast(struct tevent_context *ev,
+                                   struct tevent_timer *te,
+                                   struct timeval current_time,
+                                   void *private_data)
+{
+       struct server_state *state = talloc_get_type_abort(
+               private_data, struct server_state);
+       struct ctdbd_context *ctdb = state->ctdb;
+       uint32_t leader = ctdb->node_map->recmaster;
+       TDB_DATA data;
+       int ret;
+
+       if (leader == CTDB_UNKNOWN_PNN) {
+               goto done;
+       }
+
+       data.dptr = (uint8_t *)&leader;
+       data.dsize = sizeof(leader);
+
+       ret = srvid_dispatch(ctdb->srv, CTDB_SRVID_LEADER, 0, data);
+       if (ret != 0) {
+               DBG_WARNING("Failed to send leader broadcast, ret=%d\n", ret);
+       }
+
+done:
+       state->leader_broadcast_te = tevent_add_timer(state->ev,
+                                                     state,
+                                                     timeval_current_ofs(1, 0),
+                                                     server_leader_broadcast,
+                                                     state);
+       if (state->leader_broadcast_te == NULL) {
+               DBG_WARNING("Failed to set up leader broadcast\n");
+       }
+}
+
 static void server_new_client(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(