aboutsummaryrefslogtreecommitdiff
path: root/weed/mount/weedfs.go
diff options
context:
space:
mode:
authorPatrick Schmidt <patrick.schmidt@innogames.com>2022-08-21 21:18:13 +0200
committerGitHub <noreply@github.com>2022-08-21 12:18:13 -0700
commit2ef6ab998c68f385be3076f41af703ac83bbf5b2 (patch)
treebe0de47204b0d09184ad11d34bee0778a7c1f4ae /weed/mount/weedfs.go
parentf49a9297c2d140cd8a8ba3e80842ad64db9be29d (diff)
downloadseaweedfs-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.go22
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() {