feat: handle case where TOB is empty for bids or asks for TOB checker

This commit is contained in:
Lukas deConantsesznak
2025-08-03 10:40:50 -06:00
parent cb29896ce5
commit c52c963404

View File

@@ -720,90 +720,90 @@ const main = async () => {
const bestBidOrder = l3OrderBook.bids[0]; const bestBidOrder = l3OrderBook.bids[0];
const bestAskOrder = l3OrderBook.asks[0]; const bestAskOrder = l3OrderBook.asks[0];
if (bestBidOrder && bestAskOrder) { // Track each side independently, even if one side is empty
// Create order ID strings using maker (user account) and orderId const currentBidOrderId = bestBidOrder
const currentBidOrderId = `${bestBidOrder.maker.toBase58()}-${ ? `${bestBidOrder.maker.toBase58()}-${bestBidOrder.orderId}`
bestBidOrder.orderId : '';
}`; const currentAskOrderId = bestAskOrder
const currentAskOrderId = `${bestAskOrder.maker.toBase58()}-${ ? `${bestAskOrder.maker.toBase58()}-${bestAskOrder.orderId}`
bestAskOrder.orderId : '';
}`;
const currentTobOrderIds = { const currentTobOrderIds = {
bidOrderId: currentBidOrderId, bidOrderId: currentBidOrderId,
askOrderId: currentAskOrderId, askOrderId: currentAskOrderId,
}; };
const lastTobOrderId = lastTobOrderIds.get(marketIndex); const lastTobOrderId = lastTobOrderIds.get(marketIndex);
const lastUpdate = lastTobUpdateTimes.get(marketIndex); const lastUpdate = lastTobUpdateTimes.get(marketIndex);
// Check if TOB orders have changed (not just prices) // Check if TOB orders have changed on either side
const tobChanged = const tobChanged =
!lastTobOrderId || !lastTobOrderId ||
lastTobOrderId.bidOrderId !== currentTobOrderIds.bidOrderId || lastTobOrderId.bidOrderId !== currentTobOrderIds.bidOrderId ||
lastTobOrderId.askOrderId !== currentTobOrderIds.askOrderId; lastTobOrderId.askOrderId !== currentTobOrderIds.askOrderId;
if (tobChanged) { if (tobChanged) {
// TOB orders changed, update tracking // TOB orders changed, update tracking
lastTobOrderIds.set(marketIndex, currentTobOrderIds); lastTobOrderIds.set(marketIndex, currentTobOrderIds);
lastTobUpdateTimes.set(marketIndex, currentTime); lastTobUpdateTimes.set(marketIndex, currentTime);
logger.debug( logger.debug(
`TOB orders updated for market ${marketIndex}: bidOrderId=${currentTobOrderIds.bidOrderId}, askOrderId=${currentTobOrderIds.askOrderId}` `TOB orders updated for market ${marketIndex}: bidOrderId=${
); currentTobOrderIds.bidOrderId || 'none'
} else if ( }, askOrderId=${currentTobOrderIds.askOrderId || 'none'}`
lastUpdate && );
currentTime - lastUpdate > TOB_STUCK_THRESHOLD } else if (
) { lastUpdate &&
// TOB has been stuck for too long, trigger resubscribe currentTime - lastUpdate > TOB_STUCK_THRESHOLD
const stuckDuration = (currentTime - lastUpdate) / 1000; ) {
logger.warn( // TOB has been stuck for too long, trigger resubscribe
`TOB stuck for market ${marketIndex} for ${stuckDuration}s, triggering resubscribe` const stuckDuration = (currentTime - lastUpdate) / 1000;
); logger.warn(
`TOB stuck for market ${marketIndex} for ${stuckDuration}s, triggering resubscribe`
);
// Update metrics // Update metrics
tobStuckGauge.setLatestValue(stuckDuration, { tobStuckGauge.setLatestValue(stuckDuration, {
marketIndex: marketIndex.toString(), marketIndex: marketIndex.toString(),
marketType: 'perp', marketType: 'perp',
}); });
// Get the OrderSubscriber instance for resubscribe // Get the OrderSubscriber instance for resubscribe
if (orderSubscriber) { if (orderSubscriber) {
try { try {
// Resubscribe and fetch to clear stuck state // Resubscribe and fetch to clear stuck state
await orderSubscriber.unsubscribe(); await orderSubscriber.unsubscribe();
await orderSubscriber.subscribe(); await orderSubscriber.subscribe();
await orderSubscriber.fetch(); await orderSubscriber.fetch();
logger.info( logger.info(
`Successfully resubscribed OrderSubscriber for market ${marketIndex}` `Successfully resubscribed OrderSubscriber for market ${marketIndex}`
);
// Update metrics
tobResubscribeCounter.add(1, {
marketIndex: marketIndex.toString(),
marketType: 'perp',
success: 'true',
});
// Reset the timer after successful resubscribe
lastTobUpdateTimes.set(marketIndex, currentTime);
} catch (error) {
logger.error(
`Failed to resubscribe OrderSubscriber for market ${marketIndex}:`,
error
);
// Update metrics for failed resubscribe
tobResubscribeCounter.add(1, {
marketIndex: marketIndex.toString(),
marketType: 'perp',
success: 'false',
});
}
} else {
logger.error(
`OrderSubscriber not available for market ${marketIndex}`
); );
// Update metrics
tobResubscribeCounter.add(1, {
marketIndex: marketIndex.toString(),
marketType: 'perp',
success: 'true',
});
// Reset the timer after successful resubscribe
lastTobUpdateTimes.set(marketIndex, currentTime);
} catch (error) {
logger.error(
`Failed to resubscribe OrderSubscriber for market ${marketIndex}:`,
error
);
// Update metrics for failed resubscribe
tobResubscribeCounter.add(1, {
marketIndex: marketIndex.toString(),
marketType: 'perp',
success: 'false',
});
} }
} else {
logger.error(
`OrderSubscriber not available for market ${marketIndex}`
);
} }
} }
} catch (error) { } catch (error) {