aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--other/java/client/src/main/proto/filer.proto1
-rw-r--r--weed/cluster/lock_manager/distributed_lock_manager.go19
2 files changed, 14 insertions, 6 deletions
diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto
index 2058322cc..50aee1b0e 100644
--- a/other/java/client/src/main/proto/filer.proto
+++ b/other/java/client/src/main/proto/filer.proto
@@ -73,6 +73,7 @@ service SeaweedFiler {
}
rpc Unlock(UnlockRequest) returns (UnlockResponse) {
}
+ // distributed lock management internal use only
rpc TransferLocks(TransferLocksRequest) returns (TransferLocksResponse) {
}
}
diff --git a/weed/cluster/lock_manager/distributed_lock_manager.go b/weed/cluster/lock_manager/distributed_lock_manager.go
index 7061dfd1a..0378d02b2 100644
--- a/weed/cluster/lock_manager/distributed_lock_manager.go
+++ b/weed/cluster/lock_manager/distributed_lock_manager.go
@@ -29,18 +29,25 @@ func (dlm *DistributedLockManager) Lock(key string, token string) (renewToken st
}
func (dlm *DistributedLockManager) LockWithTimeout(key string, expiredAtNs int64, token string) (renewToken string, movedTo pb.ServerAddress, err error) {
+ movedTo, err = dlm.FindLockOwner(key)
+ if err != nil {
+ return
+ }
+ if movedTo != dlm.Host {
+ return
+ }
+ renewToken, err = dlm.lockManager.Lock(key, expiredAtNs, token)
+ return
+}
+
+func (dlm *DistributedLockManager) FindLockOwner(key string) (movedTo pb.ServerAddress, err error) {
servers := dlm.LockRing.GetSnapshot()
if servers == nil {
err = NoLockServerError
return
}
- server := hashKeyToServer(key, servers)
- if server != dlm.Host {
- movedTo = server
- return
- }
- renewToken, err = dlm.lockManager.Lock(key, expiredAtNs, token)
+ movedTo = hashKeyToServer(key, servers)
return
}