From 94602ba9b7982cda26a7c632ae3c8db33bfe89d0 Mon Sep 17 00:00:00 2001 From: langhuihui <178529795@qq.com> Date: Fri, 27 Sep 2024 13:44:09 +0800 Subject: [PATCH] fix: race --- util/ring-writer.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/util/ring-writer.go b/util/ring-writer.go index b65e551..c9dd485 100644 --- a/util/ring-writer.go +++ b/util/ring-writer.go @@ -81,19 +81,20 @@ func (rb *RingWriter[T, F]) Reduce(size int) { p := rb.Unlink(size) pSize := size rb.Size -= size + // 遍历即将回收的节点,如果有读锁未释放,则丢弃,不回收该节点 for i := 0; i < size; i++ { - if p.Value.StartWrite() { + if !p.Value.IsDiscarded() && p.Value.StartWrite() { // 尝试加写锁,成功则说明该节点可正常回收 p.Value.Reset() p.Value.Ready() rb.poolSize++ } else { p.Value.Reset() if pSize == 1 { - // last one,无法删除最后一个节点,直接返回即可 + // last one,无法删除最后一个节点,直接返回即可(不回收) return } p = p.Prev() - p.Unlink(1) + p.Unlink(1) // 丢弃该节点,不回收 pSize-- } p = p.Next()