Rates Engine v0.5.0-rc.53
Pre-release
Pre-release
·
726 commits
to main
since this release
[v0.5.0-rc.53] — 2026-05-15
Fixed
- Coverage snapshot now populates DURING an all-time backfill.
/v1/diagnostics/ingestion'sbackfill_coveragewas built from
the background trades-scan cache (BackfillCoverageStats). Under
the all-time SDEX backfill that query is too IO-contended to
finish within its timeout, so the cache stayed empty and the
status page showed "Coverage snapshot pending" indefinitely —
exactly when operators most need it. Rebuilt cursor-first:
density_pct/ covered / expected / earliest / latest for every
on-chain source now derive purely from the union of completed
backfill-cursor intervals (no trades scan), so the snapshot is
live even mid-backfill. The trades-scan cache is demoted to
best-efforttrade_countenrichment + off-chain CEX/FX context
rows; an empty or stale cache can no longer blank the whole
section.earliest_ledger/latest_ledgerare now the
merged-cursor processed span (honest "what we walked"), not a
trades MIN/MAX that could imply an interior gap is covered —
density_pctremains the gap-aware number. Added
soroswap-router+defindextosourceGenesisLedgerso the
two new on-chain Soroban sources get an honest density bar
instead of falling through to the un-mapped cache-only path.
Changed
max_locks_per_transaction256 → 4096 (archival-node ansible
role default + R1 postgresql.conf). The per-transaction lock-table
sizing knob drives the instance-wide lock table
(max_locks_per_transaction × max_connections). TimescaleDB takes
one lock per chunk a query scans — not just INSERTs; any broad
SELECT over the now-2,738-chunktradeshypertable
(per-source coverage, the pools/markets CTE, cagg/fx coverage)
locks one entry per scanned chunk. The 64→256 hand-bump from the
2026-05-06 SEV-3 lasted ~9 days before the table grew enough that
concurrent diagnostics + the all-time SDEX backfill thrashed it
again (a single query observed holding 26,927 locks; coverage
snapshot stuck "pending",/v1/pools?order_by=pair500s, cagg/fx
coverageout of shared memory). Re-sized to 4096 (819,200-entry
table) for permanent growth headroom rather than another
incremental bump — memory cost ≈220 MB, negligible against the
48 GB shared_buffers / 188 GB host. Applied live to R1 (postgres
restart) + codified in the role so R1 rebuilds and R2/R3 cutover
inherit it.