in orderbook-core/src/main/java/com/epam/deltix/orderbook/core/impl/L2SingleExchangeQuoteProcessor.java [152:241]
public boolean processL2Snapshot(final PackageHeaderInfo pck) {
if (!isSnapshotAllowed(pck)) {
return false;
}
final ObjectList<BaseEntryInfo> entries = pck.getEntries();
final int prevAsksDepth = asks.depth();
final int prevBidsDepth = bids.depth();
int askCnt = 0;
int bidCnt = 0;
for (int i = 0; i < entries.size(); i++) {
final BaseEntryInfo e = entries.get(i);
if (e instanceof L2EntryNewInterface) {
final L2EntryNewInterface entry = (L2EntryNewInterface) e;
// //We expect that all entries are sorted by side and level
// if (entry == null || entry.getSide() == null ||
// (entry.getSide() == ASK && askCnt != entry.getLevel()) ||
// (entry.getSide() == BID && bidCnt != entry.getLevel())) {
// clear();
// eventHandler.onBroken();
// return false;
// }
final int level = entry.getLevel();
final QuoteSide side = entry.getSide();
@Alphanumeric final long exchangeId = entry.getExchangeId();
// We expect that exchangeId is valid and all entries have the same exchangeId
final Option<MutableExchange<Quote, L2Processor<Quote>>> exchange = getOrCreateExchange(exchangeId);
if (!exchange.hasValue()) {
clear();
eventHandler.onBroken();
return false;
}
final L2MarketSide<Quote> marketSide = exchange.get().getProcessor().getMarketSide(side);
// Both side have the same max depth
final int maxDepth = marketSide.getMaxDepth();
if ((side == ASK && askCnt == maxDepth) || (side == BID && bidCnt == maxDepth)) {
continue;
}
if (marketSide.hasLevel(level)) {
final Quote quote = marketSide.getQuote(level);
quote.copyFrom(pck, entry);
} else {
final Quote quote = pool.borrow();
quote.copyFrom(pck, entry);
marketSide.add(level, quote);
}
if (side == ASK) {
askCnt++;
} else {
bidCnt++;
}
if (askCnt == maxDepth && bidCnt == maxDepth) {
break;
}
}
}
//Remove all worst quotes after snapshot.
//We're doing this because we don't release quotes during snapshot processing.
for (int i = askCnt; i < prevAsksDepth; i++) {
final Quote quote = asks.removeWorstQuote();
pool.release(quote);
}
for (int i = bidCnt; i < prevBidsDepth; i++) {
final Quote quote = bids.removeWorstQuote();
pool.release(quote);
}
//Validate state after snapshot
//We believe that snapshot is valid, but...
if (!asks.validateState() || !bids.validateState()) {
clear();
eventHandler.onBroken();
return false;
}
eventHandler.onSnapshot();
return true;
}