Skip to content

Rates Engine v0.5.0-rc.53

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 15 May 10:06
· 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's backfill_coverage was 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-effort trade_count enrichment + off-chain CEX/FX context
    rows; an empty or stale cache can no longer blank the whole
    section. earliest_ledger / latest_ledger are now the
    merged-cursor processed span (honest "what we walked"), not a
    trades MIN/MAX that could imply an interior gap is covered —
    density_pct remains the gap-aware number. Added
    soroswap-router + defindex to sourceGenesisLedger so 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_transaction 256 → 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-chunk trades hypertable
    (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=pair 500s, cagg/fx
    coverage out 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.