diff options
| author | Patrick Schmidt <patrick.schmidt@innogames.com> | 2022-08-21 21:18:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-21 12:18:13 -0700 |
| commit | 2ef6ab998c68f385be3076f41af703ac83bbf5b2 (patch) | |
| tree | be0de47204b0d09184ad11d34bee0778a7c1f4ae /weed/mount/weedfs.go | |
| parent | f49a9297c2d140cd8a8ba3e80842ad64db9be29d (diff) | |
| download | seaweedfs-2ef6ab998c68f385be3076f41af703ac83bbf5b2.tar.xz seaweedfs-2ef6ab998c68f385be3076f41af703ac83bbf5b2.zip | |
Avoid race conditions with current filer address (#3474)
When multiple filer requests are in-flight and the current filer
disappears and a new one is selected by the first goroutine, then
there can be a lot of race conditions while retrieving the current
filer.
Therefore, load/save the current filer index atomically.
Diffstat (limited to 'weed/mount/weedfs.go')
| -rw-r--r-- | weed/mount/weedfs.go | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/weed/mount/weedfs.go b/weed/mount/weedfs.go index aaaa2877d..d7d5695da 100644 --- a/weed/mount/weedfs.go +++ b/weed/mount/weedfs.go @@ -2,7 +2,16 @@ package mount import ( "context" + "math/rand" + "os" + "path" + "path/filepath" + "sync/atomic" + "time" + "github.com/hanwen/go-fuse/v2/fuse" + "google.golang.org/grpc" + "github.com/seaweedfs/seaweedfs/weed/filer" "github.com/seaweedfs/seaweedfs/weed/mount/meta_cache" "github.com/seaweedfs/seaweedfs/weed/pb" @@ -13,12 +22,6 @@ import ( "github.com/seaweedfs/seaweedfs/weed/util/chunk_cache" "github.com/seaweedfs/seaweedfs/weed/util/grace" "github.com/seaweedfs/seaweedfs/weed/wdclient" - "google.golang.org/grpc" - "math/rand" - "os" - "path" - "path/filepath" - "time" "github.com/hanwen/go-fuse/v2/fs" ) @@ -26,7 +29,7 @@ import ( type Option struct { MountDirectory string FilerAddresses []pb.ServerAddress - filerIndex int + filerIndex int32 GrpcDialOption grpc.DialOption FilerMountRootPath string Collection string @@ -86,7 +89,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { dhmap: NewDirectoryHandleToInode(), } - wfs.option.filerIndex = rand.Intn(len(option.FilerAddresses)) + wfs.option.filerIndex = int32(rand.Intn(len(option.FilerAddresses))) wfs.option.setupUniqueCacheDirectory() if option.CacheSizeMB > 0 { wfs.chunkCache = chunk_cache.NewTieredChunkCache(256, option.getUniqueCacheDir(), option.CacheSizeMB, 1024*1024) @@ -181,7 +184,8 @@ func (wfs *WFS) LookupFn() wdclient.LookupFileIdFunctionType { } func (wfs *WFS) getCurrentFiler() pb.ServerAddress { - return wfs.option.FilerAddresses[wfs.option.filerIndex] + i := atomic.LoadInt32(&wfs.option.filerIndex) + return wfs.option.FilerAddresses[i] } func (option *Option) setupUniqueCacheDirectory() { |
