From 712648bc354b186d6654fdb8a46fd4848fdc4e00 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Jan 2026 18:20:58 -0800 Subject: [PATCH] atomic --- weed/pb/filer_pb/filer_client_bfs.go | 7 ++++--- weed/shell/command_fs_meta_save.go | 12 ++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/weed/pb/filer_pb/filer_client_bfs.go b/weed/pb/filer_pb/filer_client_bfs.go index 5a72d5cad..e97bc5fd5 100644 --- a/weed/pb/filer_pb/filer_client_bfs.go +++ b/weed/pb/filer_pb/filer_client_bfs.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "sync" + "sync/atomic" "time" "github.com/seaweedfs/seaweedfs/weed/glog" @@ -23,7 +24,7 @@ func TraverseBfs(ctx context.Context, filerClient FilerClient, parentPath util.F pending.Add(1) queue.Enqueue(parentPath) - var once sync.Once + var hasError int32 var firstErr error enqueue := func(p util.FullPath) bool { @@ -64,10 +65,10 @@ func TraverseBfs(ctx context.Context, filerClient FilerClient, parentPath util.F if ctx.Err() == nil { processErr := processOneDirectory(ctx, filerClient, dir, enqueue, fn) if processErr != nil { - once.Do(func() { + if atomic.CompareAndSwapInt32(&hasError, 0, 1) { firstErr = processErr cancel() - }) + } } } pending.Done() diff --git a/weed/shell/command_fs_meta_save.go b/weed/shell/command_fs_meta_save.go index c6db7c2d2..bc049d093 100644 --- a/weed/shell/command_fs_meta_save.go +++ b/weed/shell/command_fs_meta_save.go @@ -155,7 +155,6 @@ func doTraverseBfsAndSaving(filerClient filer_pb.FilerClient, writer io.Writer, }() var dirCount, fileCount uint64 - var once sync.Once var firstErr error var hasErr atomic.Bool @@ -176,10 +175,8 @@ func doTraverseBfsAndSaving(filerClient filer_pb.FilerClient, writer io.Writer, return firstErr } if genErr := genFn(protoMessage, outputChan); genErr != nil { - once.Do(func() { - firstErr = genErr - hasErr.Store(true) - }) + firstErr = genErr + hasErr.Store(true) return genErr } else { if e.IsDirectory { @@ -208,11 +205,10 @@ func doTraverseBfsAndSaving(filerClient filer_pb.FilerClient, writer io.Writer, return firstErr } if genErr := genFn(protoMessage, outputChan); genErr != nil { - once.Do(func() { + if hasErr.CompareAndSwap(false, true) { firstErr = genErr - hasErr.Store(true) cancel() - }) + } return genErr }