chore: add timeout to log when buffer takes v long

helps debug deadlocks
This commit is contained in:
Adhiraj Singh
2022-11-25 09:03:05 +05:30
parent f1ca770930
commit b20a3b9a6a

View File

@@ -21,6 +21,8 @@ const BUFFERABLE_EVENT = [
'groups.update', 'groups.update',
] as const ] as const
const BUFFER_TIMEOUT_MS = 30_000
type BufferableEvent = typeof BUFFERABLE_EVENT[number] type BufferableEvent = typeof BUFFERABLE_EVENT[number]
/** /**
@@ -64,7 +66,12 @@ export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter =
let data = makeBufferData() let data = makeBufferData()
let isBuffering = false let isBuffering = false
let preBufferTask: Promise<any> = Promise.resolve() let preBufferTask: Promise<any> = Promise.resolve()
// debugging utils
let preBufferTraces: string[] = [] let preBufferTraces: string[] = []
let bufferStartTrace: string | undefined
let bufferTimeout: NodeJS.Timeout | undefined
let waitingForPreBufferEnd = false
// take the generic event and fire it as a baileys event // take the generic event and fire it as a baileys event
ev.on('event', (map: BaileysEventData) => { ev.on('event', (map: BaileysEventData) => {
@@ -73,10 +80,21 @@ export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter =
} }
}) })
function startTimeout() {
bufferTimeout = setTimeout(() => {
logger.warn(
{ preBufferTraces, bufferStartTrace, waitingForPreBufferEnd },
'event buffer taking a while'
)
}, BUFFER_TIMEOUT_MS)
}
function buffer() { function buffer() {
if(!isBuffering) { if(!isBuffering) {
logger.trace('buffering events') logger.trace('buffering events')
isBuffering = true isBuffering = true
startTimeout()
bufferStartTrace = new Error('buffer start').stack
return true return true
} }
@@ -89,7 +107,9 @@ export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter =
} }
logger.trace({ preBufferTraces }, 'releasing buffered events...') logger.trace({ preBufferTraces }, 'releasing buffered events...')
waitingForPreBufferEnd = true
await preBufferTask await preBufferTask
waitingForPreBufferEnd = false
preBufferTraces = [] preBufferTraces = []
isBuffering = false isBuffering = false
@@ -113,6 +133,8 @@ export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter =
data = newData data = newData
clearTimeout(bufferTimeout)
logger.trace( logger.trace(
{ conditionalChatUpdatesLeft }, { conditionalChatUpdatesLeft },
'released buffered events' 'released buffered events'