From 00c009966c565254bc9464d14a1e7d3372cee372 Mon Sep 17 00:00:00 2001 From: Yonglong Li Date: Wed, 5 Jun 2024 17:58:26 +0800 Subject: [PATCH] ipvs: keeap rs down if sorry server is up after reload issue: when sorry server up and all rs down, at this time change rs check config and do reload(the rs modified is up now), it will result in sorry server and rs coexist. fix: if sorry server up keep new rs down after reload Signed-off-by: Yonglong Li --- keepalived/check/ipwrapper.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/keepalived/check/ipwrapper.c b/keepalived/check/ipwrapper.c index 25ac13458e..06a5277b25 100644 --- a/keepalived/check/ipwrapper.c +++ b/keepalived/check/ipwrapper.c @@ -941,7 +941,7 @@ rs_exist(real_server_t *old_rs, list_head_t *l) } static void -migrate_checkers(virtual_server_t *vs, real_server_t *old_rs, real_server_t *new_rs) +migrate_checkers(virtual_server_t *new_vs, virtual_server_t *old_vs, real_server_t *old_rs, real_server_t *new_rs) { checker_t *old_c, *new_c; checker_t dummy_checker; @@ -952,7 +952,8 @@ migrate_checkers(virtual_server_t *vs, real_server_t *old_rs, real_server_t *new if (!new_c->checker_funcs->compare) continue; list_for_each_entry(old_c, &old_rs->checkers_list, rs_list) { - if (old_c->checker_funcs->type == new_c->checker_funcs->type && new_c->checker_funcs->compare(old_c, new_c)) { + if ((old_vs->s_svr && ISALIVE(old_vs->s_svr)) || + old_c->checker_funcs->type == new_c->checker_funcs->type && new_c->checker_funcs->compare(old_c, new_c)) { /* Update status if different */ if (old_c->has_run && old_c->is_up != new_c->is_up) set_checker_state(new_c, old_c->is_up); @@ -1006,13 +1007,13 @@ migrate_checkers(virtual_server_t *vs, real_server_t *old_rs, real_server_t *new /* If there are no failed checkers, the RS needs to be up */ if (!new_rs->num_failed_checkers && !new_rs->alive) { - dummy_checker.vs = vs; + dummy_checker.vs = new_vs; dummy_checker.rs = new_rs; perform_svr_state(true, &dummy_checker); } else if (new_rs->num_failed_checkers && new_rs->set != new_rs->inhibit) { /* ipvs_cmd() checks for alive rather than set */ new_rs->alive = new_rs->set; - ipvs_cmd(new_rs->inhibit ? IP_VS_SO_SET_ADDDEST : IP_VS_SO_SET_DELDEST, vs, new_rs); + ipvs_cmd(new_rs->inhibit ? IP_VS_SO_SET_ADDDEST : IP_VS_SO_SET_DELDEST, new_vs, new_rs); new_rs->alive = false; } } @@ -1058,7 +1059,7 @@ clear_diff_rs(virtual_server_t *old_vs, virtual_server_t *new_vs) * For alpha mode checkers, if it was up, we don't need another * success to say it is now up. */ - migrate_checkers(new_vs, rs, new_rs); + migrate_checkers(new_vs, old_vs, rs, new_rs); /* Do we need to update the RS configuration? */ if ((new_rs->alive && new_rs->effective_weight != rs->effective_weight) ||