From 73deb682bdca5da869e65521a49afc4eee529b05 Mon Sep 17 00:00:00 2001 From: yusing Date: Sun, 4 Jan 2026 20:40:38 +0800 Subject: [PATCH] fix(autocert): forceRenewalDoneCh was never closed --- internal/autocert/provider.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/autocert/provider.go b/internal/autocert/provider.go index bff4e55a..4be580c2 100644 --- a/internal/autocert/provider.go +++ b/internal/autocert/provider.go @@ -83,6 +83,8 @@ func NewProvider(cfg *Config, user *User, legoCfg *lego.Config) (*Provider, erro lastFailureFile: lastFailureFileFor(cfg.CertPath, cfg.KeyPath), forceRenewalCh: make(chan struct{}, 1), } + p.forceRenewalDoneCh.Store(emptyForceRenewalDoneCh) + if cfg.idx == 0 { p.logger = log.With().Str("provider", "main").Logger() } else { @@ -360,7 +362,7 @@ func (p *Provider) ShouldRenewOn() time.Time { // If at least one renewal is triggered, returns true. func (p *Provider) ForceExpiryAll() (ok bool) { doneCh := make(chan struct{}) - if swapped := p.forceRenewalDoneCh.CompareAndSwap(nil, doneCh); !swapped { // already in progress + if swapped := p.forceRenewalDoneCh.CompareAndSwap(emptyForceRenewalDoneCh, doneCh); !swapped { // already in progress close(doneCh) return false }