summaryrefslogtreecommitdiff
path: root/ctdb
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2020-05-05 23:02:03 +1000
committerMartin Schwenke <martins@samba.org>2022-01-17 10:21:33 +0000
commit4786982cc80f4ec0c23673a144ac179fa60bde78 (patch)
tree093c73b4655355630f14276ca3d9dbfd0b90f49d /ctdb
parent756dfdfed9fe7d6acf2cf894d9918c8ac489571e (diff)
downloadsamba-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.c49
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(