diff --git a/src/lib/swim/swim.c b/src/lib/swim/swim.c index 54c5b3250e76c5c3db46f05c708d4a19bd3b05c3..725ebf222856f84e609dae4d52ca955489fb9f5b 100644 --- a/src/lib/swim/swim.c +++ b/src/lib/swim/swim.c @@ -1797,11 +1797,18 @@ swim_cfg(struct swim *swim, const char *uri, double heartbeat_rate, } else { addr = swim->self->addr; } - if (swim->round_tick.repeat != heartbeat_rate && heartbeat_rate > 0) - swim_ev_timer_set(&swim->round_tick, 0, heartbeat_rate); - - if (swim->wait_ack_tick.repeat != ack_timeout && ack_timeout > 0) - swim_ev_timer_set(&swim->wait_ack_tick, 0, ack_timeout); + struct ev_timer *t = &swim->round_tick; + if (t->repeat != heartbeat_rate && heartbeat_rate > 0) { + swim_ev_timer_set(t, 0, heartbeat_rate); + if (swim_ev_is_active(t)) + swim_ev_timer_again(loop(), t); + } + t = &swim->wait_ack_tick; + if (t->repeat != ack_timeout && ack_timeout > 0) { + swim_ev_timer_set(t, 0, ack_timeout); + if (swim_ev_is_active(t)) + swim_ev_timer_again(loop(), t); + } if (new_self != NULL) { swim->self->status = MEMBER_LEFT; diff --git a/src/lib/swim/swim_ev.h b/src/lib/swim/swim_ev.h index b68ed9e19fbae757f3ce0d73c2f49ba54e5a782e..fe261ff38bfe09a983a6d8d0d0790e1d3893a504 100644 --- a/src/lib/swim/swim_ev.h +++ b/src/lib/swim/swim_ev.h @@ -52,6 +52,8 @@ swim_ev_timer_again(struct ev_loop *loop, struct ev_timer *watcher); void swim_ev_timer_stop(struct ev_loop *loop, struct ev_timer *watcher); +#define swim_ev_is_active ev_is_active + #define swim_ev_init ev_init #define swim_ev_timer_init ev_timer_init