aboutsummaryrefslogtreecommitdiff
path: root/weed/cluster/lock_manager/lock_manager.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/cluster/lock_manager/lock_manager.go')
-rw-r--r--weed/cluster/lock_manager/lock_manager.go25
1 files changed, 19 insertions, 6 deletions
diff --git a/weed/cluster/lock_manager/lock_manager.go b/weed/cluster/lock_manager/lock_manager.go
index 6943a8084..0e3e47ba4 100644
--- a/weed/cluster/lock_manager/lock_manager.go
+++ b/weed/cluster/lock_manager/lock_manager.go
@@ -20,6 +20,7 @@ type Lock struct {
Token string
ExpiredAtNs int64
Key string // only used for moving locks
+ Owner string
}
func NewLockManager() *LockManager {
@@ -30,7 +31,7 @@ func NewLockManager() *LockManager {
return t
}
-func (lm *LockManager) Lock(path string, expiredAtNs int64, token string) (renewToken string, err error) {
+func (lm *LockManager) Lock(path string, expiredAtNs int64, token string, owner string) (renewToken string, err error) {
lm.locks.Compute(path, func(oldValue *Lock, loaded bool) (newValue *Lock, delete bool) {
if oldValue != nil {
if oldValue.ExpiredAtNs > 0 && oldValue.ExpiredAtNs < time.Now().UnixNano() {
@@ -41,14 +42,14 @@ func (lm *LockManager) Lock(path string, expiredAtNs int64, token string) (renew
} else {
// new lock
renewToken = uuid.New().String()
- return &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs}, false
+ return &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs, Owner: owner}, false
}
}
// not expired
if oldValue.Token == token {
// token matches, renew the lock
renewToken = uuid.New().String()
- return &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs}, false
+ return &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs, Owner: owner}, false
} else {
err = LockErrorTokenMismatch
return oldValue, false
@@ -57,7 +58,7 @@ func (lm *LockManager) Lock(path string, expiredAtNs int64, token string) (renew
if token == "" {
// new lock
renewToken = uuid.New().String()
- return &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs}, false
+ return &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs, Owner: owner}, false
} else {
err = LockErrorNonEmptyTokenOnNewLock
return nil, false
@@ -132,6 +133,18 @@ func (lm *LockManager) SelectLocks(selectFn func(key string) bool) (locks []*Loc
}
// InsertLock inserts a lock unconditionally
-func (lm *LockManager) InsertLock(path string, expiredAtNs int64, token string) {
- lm.locks.Store(path, &Lock{Token: token, ExpiredAtNs: expiredAtNs})
+func (lm *LockManager) InsertLock(path string, expiredAtNs int64, token string, owner string) {
+ lm.locks.Store(path, &Lock{Token: token, ExpiredAtNs: expiredAtNs, Owner: owner})
+}
+
+func (lm *LockManager) GetLockOwner(key string) (owner string, err error) {
+ lm.locks.Range(func(k string, lock *Lock) bool {
+ if k == key {
+ owner = lock.Owner
+ return false
+ }
+ return true
+ })
+ return
+
}