From eb577afed28ef3d95e1316e6b7c57bd2f31a238b Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sun, 16 Aug 2026 18:23:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20healthcheck=20auto-check=20=E5=B9=82?= =?UTF-8?q?=E7=AD=89=E9=87=8D=E5=90=AF(stopCh=20=E5=8F=AF=E9=87=8D?= =?UTF-8?q?=E5=BB=BA,=20=E4=BF=AE=E5=A4=8D=20plgreload=20=E5=90=8E?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=99=A8=E5=A4=B1=E6=95=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/plugins/healthcheck/plugin.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/internal/plugins/healthcheck/plugin.go b/internal/plugins/healthcheck/plugin.go index ea4428e..ff59e41 100644 --- a/internal/plugins/healthcheck/plugin.go +++ b/internal/plugins/healthcheck/plugin.go @@ -49,8 +49,7 @@ type Plugin struct { selfToolNames map[string]bool checkMu sync.Mutex - stopCh chan struct{} - stopOnce sync.Once + stopCh chan struct{} perfData PerfData autoInterval time.Duration @@ -83,6 +82,15 @@ func New(name string) *Plugin { func (p *Plugin) Name() string { return p.name } func (p *Plugin) Start(s *sdk.PluginSDK) error { + // 幂等重启 auto-check:若实例被 Stop 过(stopCh 已关闭)后再次 Start + // (如 plgreload 复用实例),重建 stopCh 使 startAutoCheck 能重新调度 ticker。 + p.mu.Lock() + select { + case <-p.stopCh: + p.stopCh = make(chan struct{}) + default: + } + p.mu.Unlock() s.SetAutoRestart(true) p.autoInterval = 30 * time.Minute p.llmTimeout = 120 * time.Second @@ -280,9 +288,14 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error { } func (p *Plugin) Stop() error { - p.stopOnce.Do(func() { + // 幂等关闭:仅当 stopCh 未被关闭时 close。 + p.mu.Lock() + select { + case <-p.stopCh: + default: close(p.stopCh) - }) + } + p.mu.Unlock() return nil }