Fix lock table shared wait condition (#8707)

* Fix lock table shared wait condition (#8696)

* Refactor lock table waiter check

* Add exclusive lock wait helper test
This commit is contained in:
Chris Lu
2026-03-19 16:08:24 -07:00
committed by GitHub
parent 80f3079d2a
commit 08b79a30f6
2 changed files with 58 additions and 2 deletions

View File

@@ -52,6 +52,18 @@ func (lt *LockTable[T]) NewActiveLock(intention string, lockType LockType) *Acti
return l
}
func isNotFirstWaiter(lock *ActiveLock, entry *LockEntry) bool {
return len(entry.waiters) > 0 && lock.ID != entry.waiters[0].ID
}
func shouldWaitForExclusiveLock(lock *ActiveLock, entry *LockEntry) bool {
return !lock.isDeleted && (isNotFirstWaiter(lock, entry) || entry.activeExclusiveLockOwnerCount > 0 || entry.activeSharedLockOwnerCount > 0)
}
func shouldWaitForSharedLock(lock *ActiveLock, entry *LockEntry) bool {
return !lock.isDeleted && (isNotFirstWaiter(lock, entry) || entry.activeExclusiveLockOwnerCount > 0)
}
func (lt *LockTable[T]) AcquireLock(intention string, key T, lockType LockType) (lock *ActiveLock) {
lt.mu.Lock()
// Get or create the lock entry for the key
@@ -81,11 +93,11 @@ func (lt *LockTable[T]) AcquireLock(intention string, key T, lockType LockType)
}
entry.waiters = append(entry.waiters, lock)
if lockType == ExclusiveLock {
for !lock.isDeleted && ((len(entry.waiters) > 0 && lock.ID != entry.waiters[0].ID) || entry.activeExclusiveLockOwnerCount > 0 || entry.activeSharedLockOwnerCount > 0) {
for shouldWaitForExclusiveLock(lock, entry) {
entry.cond.Wait()
}
} else {
for !lock.isDeleted && (len(entry.waiters) > 0 && lock.ID != entry.waiters[0].ID) || entry.activeExclusiveLockOwnerCount > 0 {
for shouldWaitForSharedLock(lock, entry) {
entry.cond.Wait()
}
}