Date: Fri, 21 Jan 2022 18:42:42 GMT From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: f7735c3952d9 - stable/13 - carp: fix send error demotion recovery Message-ID: <202201211842.20LIggEg008450@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=f7735c3952d9d54f745f1682ba1f13a70897a8f7 commit f7735c3952d9d54f745f1682ba1f13a70897a8f7 Author: Gleb Smirnoff <glebius@FreeBSD.org> AuthorDate: 2021-12-19 01:19:26 +0000 Commit: Gleb Smirnoff <glebius@FreeBSD.org> CommitDate: 2022-01-21 18:41:46 +0000 carp: fix send error demotion recovery The problem is that carp(4) would clear the error counter on first successful send, and stop counting successes after that. Fix this logic and document it in human language. PR: 260499 Differential revision: https://reviews.freebsd.org/D33536 (cherry picked from commit 9a8cf950b259f6833c7562ce941b0cfeae6687e5) --- sys/netinet/ip_carp.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c index 7554becb974e..71558be619d8 100644 --- a/sys/netinet/ip_carp.c +++ b/sys/netinet/ip_carp.c @@ -854,6 +854,13 @@ static void carp_send_ad_error(struct carp_softc *sc, int error) { + /* + * We track errors and successfull sends with this logic: + * - Any error resets success counter to 0. + * - MAX_ERRORS triggers demotion. + * - MIN_SUCCESS successes resets error counter to 0. + * - MIN_SUCCESS reverts demotion, if it was triggered before. + */ if (error) { if (sc->sc_sendad_errors < INT_MAX) sc->sc_sendad_errors++; @@ -865,17 +872,17 @@ carp_send_ad_error(struct carp_softc *sc, int error) carp_demote_adj(V_carp_senderr_adj, msg); } sc->sc_sendad_success = 0; - } else { - if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS && - ++sc->sc_sendad_success >= CARP_SENDAD_MIN_SUCCESS) { - static const char fmt[] = "send ok on %s"; - char msg[sizeof(fmt) + IFNAMSIZ]; - - sprintf(msg, fmt, sc->sc_carpdev->if_xname); - carp_demote_adj(-V_carp_senderr_adj, msg); - sc->sc_sendad_errors = 0; - } else + } else if (sc->sc_sendad_errors > 0) { + if (++sc->sc_sendad_success >= CARP_SENDAD_MIN_SUCCESS) { + if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS) { + static const char fmt[] = "send ok on %s"; + char msg[sizeof(fmt) + IFNAMSIZ]; + + sprintf(msg, fmt, sc->sc_carpdev->if_xname); + carp_demote_adj(-V_carp_senderr_adj, msg); + } sc->sc_sendad_errors = 0; + } } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202201211842.20LIggEg008450>