From 6c8046c086c8c0b5257ef8f75a2de31e1525a9e6 Mon Sep 17 00:00:00 2001 From: Prabhjot Singh Sethi Date: Sun, 20 Apr 2025 11:18:17 +0000 Subject: [PATCH] Handle release of locks if the owner doesn't exist Signed-off-by: Prabhjot Singh Sethi --- sync/lock.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/sync/lock.go b/sync/lock.go index 0156831..f322756 100644 --- a/sync/lock.go +++ b/sync/lock.go @@ -59,6 +59,32 @@ func (t *LockTable) Callback(op string, wKey interface{}) { // handle callback as and when needed // we may need notification of release of locks // allowing others to start working on it + data := &lockData{} + err := t.col.FindOne(context.Background(), wKey, data) + if err != nil { + if errors.IsNotFound(err) { + return + } + log.Panicln("failed to find lock entry corresponding to key", wKey) + } + + oKey := &ownerKey{ + Name: data.Owner, + } + oData := &ownerData{} + err = ownerTable.col.FindOne(context.Background(), oKey, oData) + if err != nil { + if errors.IsNotFound(err) { + filter := bson.D{{ + Key: "owner", + Value: oKey.Name, + }} + _, err := t.col.DeleteMany(t.ctx, filter) + if err != nil && !errors.IsNotFound(err) { + log.Panicf("failed to perform delete of locks for owner %s, got error: %s", oKey.Name, err) + } + } + } } func (t *LockTable) handleOwnerRelease(op string, wKey interface{}) {