diff --git a/src/box/raft.c b/src/box/raft.c index c4d393c3ab70220c42d8a18b0d9eb9692625ad17..24f65ada7d6cce007fa1f5e4d62c03097ca69f9c 100644 --- a/src/box/raft.c +++ b/src/box/raft.c @@ -643,6 +643,7 @@ raft_worker_handle_broadcast(void) } replicaset_foreach(replica) relay_push_raft(replica->relay, &req); + trigger_run(&raft.on_update, NULL); raft.is_broadcast_scheduled = false; } @@ -903,6 +904,12 @@ raft_serialize_for_disk(struct raft_request *req) req->vote = raft.vote; } +void +raft_on_update(struct trigger *trigger) +{ + trigger_add(&raft.on_update, trigger); +} + void raft_cfg_is_enabled(bool is_enabled) { @@ -1040,4 +1047,5 @@ void raft_init(void) { ev_timer_init(&raft.timer, raft_sm_schedule_new_election_cb, 0, 0); + rlist_create(&raft.on_update); } diff --git a/src/box/raft.h b/src/box/raft.h index be77a547375dff2017a0027e1fc8d97238365968..82d5aa4428b55381e47ded7b6676a4ac17aedbeb 100644 --- a/src/box/raft.h +++ b/src/box/raft.h @@ -32,6 +32,7 @@ #include <stdint.h> #include <stdbool.h> #include "tarantool_ev.h" +#include "trigger.h" #if defined(__cplusplus) extern "C" { @@ -150,6 +151,11 @@ struct raft { struct fiber *worker; /** Configured election timeout in seconds. */ double election_timeout; + /** + * Trigger invoked each time any of the Raft node visible attributes are + * changed. + */ + struct rlist on_update; }; extern struct raft raft; @@ -251,6 +257,13 @@ raft_serialize_for_network(struct raft_request *req, struct vclock *vclock); void raft_serialize_for_disk(struct raft_request *req); +/** + * Add a trigger invoked each time any of the Raft node visible attributes are + * changed. + */ +void +raft_on_update(struct trigger *trigger); + /** Initialize Raft global data structures. */ void raft_init(void);