From 83676a0bc2ad9ff6fd4d2a52701ed20d1a10c169 Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Mon, 26 Jul 2021 07:42:23 +0100 Subject: [PATCH] Node should clear a lock internally that the lock owner don't recognize (#12782) If a lock owner says the lock is expired, all nodes should remove the lock internally immediately. --- cmd/lock-rest-server.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd/lock-rest-server.go b/cmd/lock-rest-server.go index 27663a348..da5aad22e 100644 --- a/cmd/lock-rest-server.go +++ b/cmd/lock-rest-server.go @@ -22,6 +22,7 @@ import ( "errors" "math/rand" "net/http" + "net/url" "path" "sort" "strconv" @@ -303,6 +304,7 @@ func lockMaintenance(ctx context.Context, interval time.Duration) error { for lendpoint, nlrips := range getLongLivedLocks(interval) { nlripsMap := make(map[string]nlock, len(nlrips)) for _, nlrip := range nlrips { + expiredInOwner := false for _, c := range allLockersFn() { if !c.IsOnline() || c == nil { continue @@ -325,11 +327,18 @@ func lockMaintenance(ctx context.Context, interval time.Duration) error { if !expired { updateNlocks(nlripsMap, nlrip.name, nlrip.lri.Writer) + } else { + // Check if the lock owner still recognizes the lock + u, err := url.Parse(c.String()) + if err == nil && u.Host == nlrip.lri.Owner { + expiredInOwner = true + } } + } - // less than the quorum, we have locks expired. - if nlripsMap[nlrip.name].locks < nlrip.lri.Quorum { + // Remove the lock if Less than the quorum or the lock owner does not recognize it + if expiredInOwner || nlripsMap[nlrip.name].locks < nlrip.lri.Quorum { // Purge the stale entry if it exists. globalLockServers[lendpoint].removeEntryIfExists(nlrip) }