diff options
author | Martin Schwenke <martin@meltin.net> | 2020-05-05 23:02:03 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2022-01-17 10:21:33 +0000 |
commit | 4786982cc80f4ec0c23673a144ac179fa60bde78 (patch) | |
tree | 093c73b4655355630f14276ca3d9dbfd0b90f49d /ctdb | |
parent | 756dfdfed9fe7d6acf2cf894d9918c8ac489571e (diff) | |
download | samba-4786982cc80f4ec0c23673a144ac179fa60bde78.tar.gz |
ctdb-tests: Add leader broadcasts to fake_ctdbd
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb')
-rw-r--r-- | ctdb/tests/src/fake_ctdbd.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/ctdb/tests/src/fake_ctdbd.c b/ctdb/tests/src/fake_ctdbd.c index 1f831305e24..9b269ca2fe4 100644 --- a/ctdb/tests/src/fake_ctdbd.c +++ b/ctdb/tests/src/fake_ctdbd.c @@ -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( |