From nobody Fri Jan 21 18:42:42 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id C4405196273F; Fri, 21 Jan 2022 18:42:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JgStB4tNYz3DPM; Fri, 21 Jan 2022 18:42:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642790562; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=YjhmrMaitj01hZvgbTEL5iaq384O7Y0su97Oeoz2MVU=; b=iAUPoz960YmjmdFJuPB2whoYTOrVpRTo/zcgKY70Qsa9xDRC7GncHPtn+c+NLiqOHz226p i9Mwb7W7HMywzW/IWjP0HbSkqA+i9yXWoHDbn/HT1Gf0OiTPxXhZL22PKLdtNT39bFQUho IhbVjOm5pjV1cbX6eBKw/5VAwQVUDJ/hPLiZ8AYp4aMuUYcqbH3esabpdz13dtq2hex8MV W9f47cukOmFCEmA1Lcgk6J9o2xY+gmsV4VGCrWYeav1WvMGYtj74QeunkaI+agFK/dxO9E TCk5zyPQ/pZp3WNwLCTviuWglx/mxieHY3Dbo0bTNVIbi1TyRKrDhYcHrx+m+g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 87BB820E35; Fri, 21 Jan 2022 18:42:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20LIggJJ008451; Fri, 21 Jan 2022 18:42:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20LIggEg008450; Fri, 21 Jan 2022 18:42:42 GMT (envelope-from git) Date: Fri, 21 Jan 2022 18:42:42 GMT Message-Id: <202201211842.20LIggEg008450@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Gleb Smirnoff Subject: git: f7735c3952d9 - stable/13 - carp: fix send error demotion recovery List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: glebius X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: f7735c3952d9d54f745f1682ba1f13a70897a8f7 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642790562; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=YjhmrMaitj01hZvgbTEL5iaq384O7Y0su97Oeoz2MVU=; b=YnfPc4LSWaZ9fdjMpqGryFzkfRXea1L4KkYz6h9ij9H8HIo1hPt/X+9RrvCE4y2PyTP4fi nupZ259a+icJNs616uZ9cOtYiAIhTESa8QhDJ590oICDkJ52lq970TazP49UYCYCyJiRMI AlSy/y9wpKNHWYjsLYKyVNT66u/HHoQZrK/1vqUejL85Xthay4bqEkLdifkCdJ4TPnRR8M M5xYmt4jUwVrQ02k/ZTloxQvGaEW5U3LQHDcQnkT4yzwnnW3IAIb6dbVwCdP2wJv2EVuHU /Ea7KH+OW6F83VL/YdGkldygTiTPDEOzeUKyGJr3J8Nhm6By5oTmPj+i3NU03w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1642790562; a=rsa-sha256; cv=none; b=B9F2I9lwsDe6Q5UD+PziH3FPKmpoMcuROrVurSvPD1tC2ZVwSIUBI03g6svARdeInIvKEJ heTfvsHGvcRL1GN6fTqKJC/nhy7eEvP8Xw3itYJYxr1arn4/Pu03mZkPFA7NLK7hZAJqfw vMQeSR8IbdPRN6QxtGxWCXOAZHqKlwJjhOml113t3PP30+9RSw4UOAoLuzCv1O36XHpsTP JNl8Y6z8jSaqNpaMSiATCowgUdvJ+LHeIta/lOb6xO39uzgH7BlKYH1DZvYGqUoR69q8Qk 4GJjziOuksfEkbcKsfG/SXqV1tuKlL0xUmKDn5cKP6iNZfRNpSuXAFA+mApxzg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=f7735c3952d9d54f745f1682ba1f13a70897a8f7 commit f7735c3952d9d54f745f1682ba1f13a70897a8f7 Author: Gleb Smirnoff AuthorDate: 2021-12-19 01:19:26 +0000 Commit: Gleb Smirnoff 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; + } } }