Browse Source

atomic

pull/8015/head
Chris Lu 16 hours ago
parent
commit
712648bc35
  1. 7
      weed/pb/filer_pb/filer_client_bfs.go
  2. 12
      weed/shell/command_fs_meta_save.go

7
weed/pb/filer_pb/filer_client_bfs.go

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"io" "io"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/glog"
@ -23,7 +24,7 @@ func TraverseBfs(ctx context.Context, filerClient FilerClient, parentPath util.F
pending.Add(1) pending.Add(1)
queue.Enqueue(parentPath) queue.Enqueue(parentPath)
var once sync.Once
var hasError int32
var firstErr error var firstErr error
enqueue := func(p util.FullPath) bool { enqueue := func(p util.FullPath) bool {
@ -64,10 +65,10 @@ func TraverseBfs(ctx context.Context, filerClient FilerClient, parentPath util.F
if ctx.Err() == nil { if ctx.Err() == nil {
processErr := processOneDirectory(ctx, filerClient, dir, enqueue, fn) processErr := processOneDirectory(ctx, filerClient, dir, enqueue, fn)
if processErr != nil { if processErr != nil {
once.Do(func() {
if atomic.CompareAndSwapInt32(&hasError, 0, 1) {
firstErr = processErr firstErr = processErr
cancel() cancel()
})
}
} }
} }
pending.Done() pending.Done()

12
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 dirCount, fileCount uint64
var once sync.Once
var firstErr error var firstErr error
var hasErr atomic.Bool var hasErr atomic.Bool
@ -176,10 +175,8 @@ func doTraverseBfsAndSaving(filerClient filer_pb.FilerClient, writer io.Writer,
return firstErr return firstErr
} }
if genErr := genFn(protoMessage, outputChan); genErr != nil { if genErr := genFn(protoMessage, outputChan); genErr != nil {
once.Do(func() {
firstErr = genErr
hasErr.Store(true)
})
firstErr = genErr
hasErr.Store(true)
return genErr return genErr
} else { } else {
if e.IsDirectory { if e.IsDirectory {
@ -208,11 +205,10 @@ func doTraverseBfsAndSaving(filerClient filer_pb.FilerClient, writer io.Writer,
return firstErr return firstErr
} }
if genErr := genFn(protoMessage, outputChan); genErr != nil { if genErr := genFn(protoMessage, outputChan); genErr != nil {
once.Do(func() {
if hasErr.CompareAndSwap(false, true) {
firstErr = genErr firstErr = genErr
hasErr.Store(true)
cancel() cancel()
})
}
return genErr return genErr
} }

Loading…
Cancel
Save