fix: parse websocket levels outside book lock

This commit is contained in:
floor-licker
2026-06-22 20:59:41 -04:00
parent 8a38779661
commit 0da5ecb1cf
+20 -6
View File
@@ -144,17 +144,31 @@ fn process_stream_object<'tape, 'input>(
.as_array() .as_array()
.ok_or_else(|| PolyfillError::parse("Invalid asks", None))?; .ok_or_else(|| PolyfillError::parse("Invalid asks", None))?;
let result = books.with_book_mut(asset_id, |book| { parsed_levels.clear();
parsed_levels.clear();
if !book.should_apply_ws_book_update(asset_id, timestamp, hash)? { let should_parse = books.with_book_mut(asset_id, |book| {
return Ok(0); book.should_apply_ws_book_update(asset_id, timestamp, hash)
} })?;
if !should_parse {
return Ok(WsBookApplyStats {
book_messages: 1,
book_levels_applied: 0,
});
}
let parsed_count = match (|| {
collect_levels(Side::BUY, bids, parsed_levels)?; collect_levels(Side::BUY, bids, parsed_levels)?;
collect_levels(Side::SELL, asks, parsed_levels)?; collect_levels(Side::SELL, asks, parsed_levels)?;
Ok(parsed_levels.len())
})() {
Ok(parsed_count) => parsed_count,
Err(error) => {
parsed_levels.clear();
return Err(error);
},
};
let parsed_count = parsed_levels.len(); let result = books.with_book_mut(asset_id, |book| {
if book.apply_ws_book_snapshot_fast(asset_id, timestamp, hash, parsed_levels)? { if book.apply_ws_book_snapshot_fast(asset_id, timestamp, hash, parsed_levels)? {
Ok(parsed_count) Ok(parsed_count)
} else { } else {