aboutsummaryrefslogtreecommitdiff
path: root/weed/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'weed/cluster')
-rw-r--r--weed/cluster/lock_client.go69
-rw-r--r--weed/cluster/lock_manager/lock_manager.go16
2 files changed, 38 insertions, 47 deletions
diff --git a/weed/cluster/lock_client.go b/weed/cluster/lock_client.go
index e222807e6..3d8dae8cb 100644
--- a/weed/cluster/lock_client.go
+++ b/weed/cluster/lock_client.go
@@ -57,27 +57,7 @@ func (lc *LockClient) StartLock(key string, owner string) (lock *LiveLock) {
lc: lc,
}
go func() {
- util.RetryUntil("create lock:"+key, func() error {
- errorMessage, err := lock.doLock(lock_manager.MaxDuration)
- if err != nil {
- glog.V(0).Infof("create lock %s: %s", key, err)
- time.Sleep(time.Second)
- return err
- }
- if errorMessage != "" {
- glog.V(4).Infof("create lock %s: %s", key, errorMessage)
- time.Sleep(time.Second)
- return fmt.Errorf("%v", errorMessage)
- }
- lock.isLocked = true
- return nil
- }, func(err error) (shouldContinue bool) {
- if err != nil {
- glog.Warningf("create lock %s: %s", key, err)
- time.Sleep(time.Second)
- }
- return lock.renewToken == ""
- })
+ lock.CreateLock(lock_manager.MaxDuration)
lc.keepLock(lock)
}()
return
@@ -98,30 +78,39 @@ func (lc *LockClient) doNewLock(key string, lockDuration time.Duration, owner st
lockDuration = lc.maxLockDuration
needRenewal = true
}
- util.RetryUntil("create lock:"+key, func() error {
- errorMessage, err := lock.doLock(lockDuration)
- if err != nil {
- time.Sleep(time.Second)
- return err
- }
- if errorMessage != "" {
- time.Sleep(time.Second)
- return fmt.Errorf("%v", errorMessage)
- }
- lock.isLocked = true
- return nil
+
+ lock.CreateLock(lockDuration)
+
+ if needRenewal {
+ go lc.keepLock(lock)
+ }
+
+ return
+}
+
+func (lock *LiveLock) CreateLock(lockDuration time.Duration) {
+ util.RetryUntil("create lock:"+lock.key, func() error {
+ return lock.DoLock(lockDuration)
}, func(err error) (shouldContinue bool) {
if err != nil {
- glog.Warningf("create lock %s: %s", key, err)
+ glog.Warningf("create lock %s: %s", lock.key, err)
}
return lock.renewToken == ""
})
+}
- if needRenewal {
- go lc.keepLock(lock)
+func (lock *LiveLock) DoLock(lockDuration time.Duration) error {
+ errorMessage, err := lock.doLock(lockDuration)
+ if err != nil {
+ time.Sleep(time.Second)
+ return err
}
-
- return
+ if errorMessage != "" {
+ time.Sleep(time.Second)
+ return fmt.Errorf("%v", errorMessage)
+ }
+ lock.isLocked = true
+ return nil
}
func (lock *LiveLock) IsLocked() bool {
@@ -161,12 +150,14 @@ func (lc *LockClient) keepLock(lock *LiveLock) {
if err != nil {
lock.isLocked = false
time.Sleep(time.Second)
+ glog.V(0).Infof("keep lock %s: %v", lock.key, err)
return err
}
if errorMessage != "" {
lock.isLocked = false
time.Sleep(time.Second)
- return fmt.Errorf("%v", errorMessage)
+ glog.V(4).Infof("keep lock message %s: %v", lock.key, errorMessage)
+ return fmt.Errorf("keep lock error: %v", errorMessage)
}
return nil
}, func(err error) (shouldContinue bool) {
diff --git a/weed/cluster/lock_manager/lock_manager.go b/weed/cluster/lock_manager/lock_manager.go
index 49b951dd9..acf5b93da 100644
--- a/weed/cluster/lock_manager/lock_manager.go
+++ b/weed/cluster/lock_manager/lock_manager.go
@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/google/uuid"
"github.com/puzpuzpuz/xsync/v2"
+ "github.com/seaweedfs/seaweedfs/weed/glog"
"time"
)
@@ -11,6 +12,7 @@ var LockErrorNonEmptyTokenOnNewLock = fmt.Errorf("lock: non-empty token on a new
var LockErrorNonEmptyTokenOnExpiredLock = fmt.Errorf("lock: non-empty token on an expired lock")
var LockErrorTokenMismatch = fmt.Errorf("lock: token mismatch")
var UnlockErrorTokenMismatch = fmt.Errorf("unlock: token mismatch")
+var LockNotFound = fmt.Errorf("lock not found")
// LockManager local lock manager, used by distributed lock manager
type LockManager struct {
@@ -138,13 +140,11 @@ func (lm *LockManager) InsertLock(path string, expiredAtNs int64, token string,
}
func (lm *LockManager) GetLockOwner(key string) (owner string, err error) {
- lm.locks.Range(func(k string, lock *Lock) bool {
- if k == key && lock != nil {
- owner = lock.Owner
- return false
- }
- return true
- })
+ lock, _ := lm.locks.Load(key)
+ if lock != nil {
+ return lock.Owner, nil
+ }
+ glog.V(0).Infof("get lock %s %+v", key, lock)
+ err = LockNotFound
return
-
}