From bc49fc11ffe8c687c5d4ea46f25ead9191155ec0 Mon Sep 17 00:00:00 2001 From: Viktor Kuzmin Date: Sat, 3 Sep 2022 11:40:32 +0300 Subject: Remove linux specific magic from fuse process start/stop. Use pid from cmd.Process instead of /proc lookup Use mount specific mutex Log fuse mount process stderr and stdout for problems investigation --- pkg/driver/utils.go | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'pkg/driver/utils.go') diff --git a/pkg/driver/utils.go b/pkg/driver/utils.go index c2e0c49..485d4da 100644 --- a/pkg/driver/utils.go +++ b/pkg/driver/utils.go @@ -8,17 +8,15 @@ import ( "github.com/container-storage-interface/spec/lib/go/csi" "github.com/seaweedfs/seaweedfs/weed/glog" - "github.com/seaweedfs/seaweedfs/weed/util" "golang.org/x/net/context" "google.golang.org/grpc" "k8s.io/utils/mount" ) func NewNodeServer(n *SeaweedFsDriver) *NodeServer { - return &NodeServer{ Driver: n, - volumeMutexes: NewKeyMutex(32), + volumeMutexes: NewKeyMutex(), } } @@ -65,13 +63,19 @@ func logGRPC(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, h } func checkMount(targetPath string) (bool, error) { - notMnt, err := mount.New("").IsLikelyNotMountPoint(targetPath) + mounter := mount.New("") + notMnt, err := mount.IsNotMountPoint(mounter, targetPath) if err != nil { if os.IsNotExist(err) { if err = os.MkdirAll(targetPath, 0750); err != nil { return false, err } notMnt = true + } else if mount.IsCorruptedMnt(err) { + if err := mounter.Unmount(targetPath); err != nil { + return false, err + } + notMnt, err = mount.IsNotMountPoint(mounter, targetPath) } else { return false, err } @@ -80,22 +84,19 @@ func checkMount(targetPath string) (bool, error) { } type KeyMutex struct { - mutexes []sync.RWMutex - size int32 + mutexes sync.Map } -func NewKeyMutex(size int32) *KeyMutex { - return &KeyMutex{ - mutexes: make([]sync.RWMutex, size), - size: size, - } +func NewKeyMutex() *KeyMutex { + return &KeyMutex{} } -func (km *KeyMutex) GetMutex(key string) *sync.RWMutex { - index := util.HashToInt32([]byte(key)) - if index < 0 { - index = -index - } +func (km *KeyMutex) GetMutex(key string) *sync.Mutex { + m, _ := km.mutexes.LoadOrStore(key, &sync.Mutex{}) + + return m.(*sync.Mutex) +} - return &km.mutexes[index%km.size] +func (km *KeyMutex) RemoveMutex(key string) { + km.mutexes.Delete(key) } -- cgit v1.2.3