mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-04-08 03:00:28 -04:00
fix(server): Fix node input concurrency deadlock (#7936)
In `autogpt_server.util.lock:KeyedMutex`: - track number of pending requests for each lock - only remove a lock from `self.locks` when the number of pending lock requests hits 0
This commit is contained in:
committed by
GitHub
parent
078ad29356
commit
82239dd129
@@ -12,21 +12,20 @@ class KeyedMutex:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.locks: dict[Any, Lock] = ExpiringDict(max_len=6000, max_age_seconds=60)
|
||||
self.locks: dict[Any, tuple[Lock, int]] = ExpiringDict(
|
||||
max_len=6000, max_age_seconds=60
|
||||
)
|
||||
self.locks_lock = Lock()
|
||||
|
||||
def lock(self, key: Any):
|
||||
with self.locks_lock:
|
||||
if key not in self.locks:
|
||||
self.locks[key] = (lock := Lock())
|
||||
else:
|
||||
lock = self.locks[key]
|
||||
lock, request_count = self.locks.get(key, (Lock(), 0))
|
||||
self.locks[key] = (lock, request_count + 1)
|
||||
lock.acquire()
|
||||
|
||||
def unlock(self, key: Any):
|
||||
with self.locks_lock:
|
||||
if key in self.locks:
|
||||
lock = self.locks.pop(key)
|
||||
else:
|
||||
return
|
||||
lock, request_count = self.locks.pop(key)
|
||||
if request_count > 1:
|
||||
self.locks[key] = (lock, request_count - 1)
|
||||
lock.release()
|
||||
|
||||
Reference in New Issue
Block a user