diff options
| author | chrislu <chris.lu@gmail.com> | 2022-09-04 22:47:01 -0700 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2022-09-04 22:47:01 -0700 |
| commit | a5808d5f084cb0194bda12aa68ba1807ac213926 (patch) | |
| tree | bf02f64b98691539946e53b9624081dbe1053773 /pkg/driver/utils.go | |
| parent | 38b671c1db0adef5e8678b6529488cf36295c2cc (diff) | |
| parent | eeb091f89e795eeb8688e277d88a1b11330eddb3 (diff) | |
| download | seaweedfs-csi-driver-a5808d5f084cb0194bda12aa68ba1807ac213926.tar.xz seaweedfs-csi-driver-a5808d5f084cb0194bda12aa68ba1807ac213926.zip | |
Merge branch 'master' of https://github.com/seaweedfs/seaweedfs-csi-driver
Diffstat (limited to 'pkg/driver/utils.go')
| -rw-r--r-- | pkg/driver/utils.go | 35 |
1 files changed, 18 insertions, 17 deletions
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) } |
