fix Memory leak in makeMutex - Promise never gets garbage collected (#2151)

* Memory leak in makeMutex - Promise never gets garbage collected

Hey, I've been debugging a memory leak in my application and traced it back to the makeMutex implementation.

The current implementation chains promises indefinitely without ever breaking the chain:

Every call to mutex() creates a new Promise that awaits the previous task, then becomes the new task. The problem is the old promises never get released because each one holds a reference to the previous through the closure.

What I found
Took a heap snapshot after running for a while and found hundreds of Promises from make-mutex.js holding ~15MB and growing. The retainer graph shows a long chain of Promises all pointing back to each other.

Since processingMutex handles every incoming message/notification, this chain grows constantly and never shrinks.

This keeps the same mutex behavior but lets the GC clean up old promises every 50 tasks instead of holding them forever.

* Refactor makeMutex to use AsyncMutex directly

* lint

* revert
This commit is contained in:
YonkoSam
2025-12-12 03:35:24 +01:00
committed by GitHub
parent 829fa8d601
commit 1e6f65cf5e
2 changed files with 25 additions and 28 deletions
+1 -1
View File
@@ -153,7 +153,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
await delay(5000)
if (!await placeholderResendCache.get(messageKey?.id!)) {
if (!(await placeholderResendCache.get(messageKey?.id!))) {
logger.debug({ messageKey }, 'message received while resend requested')
return 'RESOLVED'
}