From 37852f7434075ee37779d7616b1ee95b940469d3 Mon Sep 17 00:00:00 2001 From: j2rong4cn Date: Wed, 1 Oct 2025 08:53:06 +0800 Subject: [PATCH 1/4] fix(sync-closers): improve Close method --- pkg/utils/io.go | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/pkg/utils/io.go b/pkg/utils/io.go index 7ce6a9125..453cdd2fb 100644 --- a/pkg/utils/io.go +++ b/pkg/utils/io.go @@ -214,23 +214,17 @@ func (c *SyncClosers) AcquireReference() bool { } func (c *SyncClosers) Close() error { - for { - ref := atomic.LoadInt32(&c.ref) - if ref < 0 { - return nil - } - newRef := ref - 1 - if newRef <= 0 { - newRef = math.MinInt16 - } - if atomic.CompareAndSwapInt32(&c.ref, ref, newRef) { - log.Debugf("Close %p: %d", c, ref) - if newRef > 0 { - return nil - } - break - } + ref := atomic.AddInt32(&c.ref, -1) + if ref < -1 { + atomic.StoreInt32(&c.ref, math.MinInt16) + return nil + } + if ref > 0 { + log.Debugf("ReleaseReference %p: %d", c, ref) + return nil } + atomic.StoreInt32(&c.ref, math.MinInt16) + log.Debugf("FinalClose %p", c) var errs []error for _, closer := range c.closers { From d195f76d53984ac197fdb67cb631be08d53f191d Mon Sep 17 00:00:00 2001 From: j2rong4cn Date: Wed, 1 Oct 2025 10:30:28 +0800 Subject: [PATCH 2/4] fix(sync-closers): improve Close method --- pkg/utils/io.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/pkg/utils/io.go b/pkg/utils/io.go index 453cdd2fb..8e2837001 100644 --- a/pkg/utils/io.go +++ b/pkg/utils/io.go @@ -213,19 +213,28 @@ func (c *SyncClosers) AcquireReference() bool { } } +const closersClosed = math.MinInt16 + func (c *SyncClosers) Close() error { ref := atomic.AddInt32(&c.ref, -1) + if ref > 0 { + log.Debugf("ReleaseReference %p: %d", c, ref) + return nil + } + if ref < -1 { - atomic.StoreInt32(&c.ref, math.MinInt16) + atomic.StoreInt32(&c.ref, closersClosed) return nil } - if ref > 0 { - log.Debugf("ReleaseReference %p: %d", c, ref) + + // 尝试抢占 FinalClose 权限。 + // 执行到此,ref 必然是 0 或 -1。我们尝试将其原子地转换为 closersClosed 状态。 + // 只有第一个成功的协程能获得清理权限。 + if !atomic.CompareAndSwapInt32(&c.ref, ref, closersClosed) { return nil } - atomic.StoreInt32(&c.ref, math.MinInt16) - log.Debugf("FinalClose %p", c) + log.Debugf("FinalClose %p", c) var errs []error for _, closer := range c.closers { if closer != nil { From ed9f499eb9fdc86cd5c4f9d183ed40b6c1beb2e9 Mon Sep 17 00:00:00 2001 From: j2rong4cn <36783515+j2rong4cn@users.noreply.github.com> Date: Wed, 1 Oct 2025 10:38:30 +0800 Subject: [PATCH 3/4] Update pkg/utils/io.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: j2rong4cn <36783515+j2rong4cn@users.noreply.github.com> --- pkg/utils/io.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/utils/io.go b/pkg/utils/io.go index 8e2837001..68af25c71 100644 --- a/pkg/utils/io.go +++ b/pkg/utils/io.go @@ -227,9 +227,9 @@ func (c *SyncClosers) Close() error { return nil } - // 尝试抢占 FinalClose 权限。 - // 执行到此,ref 必然是 0 或 -1。我们尝试将其原子地转换为 closersClosed 状态。 - // 只有第一个成功的协程能获得清理权限。 + // Attempt to acquire FinalClose permission. + // At this point, ref must be 0 or -1. We try to atomically change it to the closersClosed state. + // Only the first successful goroutine gets the cleanup permission. if !atomic.CompareAndSwapInt32(&c.ref, ref, closersClosed) { return nil } From 20fd9ba4ea82034d5e994e6d900f29fd789c2809 Mon Sep 17 00:00:00 2001 From: j2rong4cn Date: Wed, 1 Oct 2025 11:24:55 +0800 Subject: [PATCH 4/4] fix(sync-closers): disable debug logging in AcquireReference and Close methods --- pkg/utils/io.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/utils/io.go b/pkg/utils/io.go index 68af25c71..ff52f843e 100644 --- a/pkg/utils/io.go +++ b/pkg/utils/io.go @@ -207,7 +207,7 @@ func (c *SyncClosers) AcquireReference() bool { } newRef := ref + 1 if atomic.CompareAndSwapInt32(&c.ref, ref, newRef) { - log.Debugf("AcquireReference %p: %d", c, newRef) + // log.Debugf("AcquireReference %p: %d", c, newRef) return true } } @@ -218,7 +218,7 @@ const closersClosed = math.MinInt16 func (c *SyncClosers) Close() error { ref := atomic.AddInt32(&c.ref, -1) if ref > 0 { - log.Debugf("ReleaseReference %p: %d", c, ref) + // log.Debugf("ReleaseReference %p: %d", c, ref) return nil } @@ -234,7 +234,7 @@ func (c *SyncClosers) Close() error { return nil } - log.Debugf("FinalClose %p", c) + // log.Debugf("FinalClose %p", c) var errs []error for _, closer := range c.closers { if closer != nil {