feat: handle case where TOB is empty for bids or asks for TOB checker
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user