Skip to content

perf(txpool): replace BTreeMap with imbl::OrdMap in BestTransactions#23621

Merged
DaniPopes merged 3 commits into
mainfrom
danipopes/imbl-ordmap
Apr 20, 2026
Merged

perf(txpool): replace BTreeMap with imbl::OrdMap in BestTransactions#23621
DaniPopes merged 3 commits into
mainfrom
danipopes/imbl-ordmap

Conversation

@decofe
Copy link
Copy Markdown
Member

@decofe decofe commented Apr 18, 2026

Replaces BTreeMap with imbl::OrdMap for the all map in BestTransactions and by_id in PendingPool.

OrdMap is a persistent/immutable B-tree that provides O(1) clone via structural sharing. Since PendingPool::best() clones the entire by_id map to create a BestTransactions snapshot, this is a significant win for large pools — the clone goes from O(n) to O(1).

Prompted by: DaniPopes

Use imbl::OrdMap for the `all` map in BestTransactions and `by_id` in
PendingPool. OrdMap provides O(1) clone via structural sharing, making
the snapshot taken when creating a BestTransactions iterator
significantly cheaper for large pools.

Co-Authored-By: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019d9e53-4ca4-75a2-b014-0c4c75b9034b
Required by imbl and its dependencies (bitmaps, imbl-sized-chunks).

Co-Authored-By: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019d9e53-4ca4-75a2-b014-0c4c75b9034b
Comment thread crates/transaction-pool/src/pool/pending.rs
@github-project-automation github-project-automation Bot moved this from Backlog to In Progress in Reth Tracker Apr 20, 2026
@DaniPopes DaniPopes enabled auto-merge April 20, 2026 12:44
@DaniPopes DaniPopes added this pull request to the merge queue Apr 20, 2026
Merged via the queue into main with commit 14570f3 Apr 20, 2026
34 checks passed
@DaniPopes DaniPopes deleted the danipopes/imbl-ordmap branch April 20, 2026 13:05
@github-project-automation github-project-automation Bot moved this from In Progress to Done in Reth Tracker Apr 20, 2026
crazywriter1 pushed a commit to crazywriter1/tempo that referenced this pull request Apr 23, 2026
Automated nightly update of reth dependencies from `paradigmxyz/reth`
main branch.

## Upstream reth changes


[`98ebc34...7839f3d`](paradigmxyz/reth@98ebc34...7839f3d)

🔗 Amp thread:
https://ampcode.com/threads/T-019db884-a7c3-738b-8f38-cc04f8942d8a
**Engine**
- Suppress persistence during payload building
([#23618](paradigmxyz/reth#23618))
- Align Amsterdam endpoint validation
([#23625](paradigmxyz/reth#23625))
- Revert [#23541](paradigmxyz/reth#23541) and
[#23578](paradigmxyz/reth#23578)
([#23646](paradigmxyz/reth#23646))
- Let consensus impls control which errors are transient
([#23668](paradigmxyz/reth#23668))
- Configure invalid header cache hit eviction
([#23670](paradigmxyz/reth#23670))

**Perf**
- Relax executor reset thresholds for re-execute
([#23617](paradigmxyz/reth#23617))
- Replace `BTreeMap` with `imbl::OrdMap` in `BestTransactions`
([#23621](paradigmxyz/reth#23621))
- Avoid reopening `.csoff` on every changeset lookup
([#23687](paradigmxyz/reth#23687))
- Disable read tx timeout during re-execute
([#23680](paradigmxyz/reth#23680))

**P2P / Net**
- Add snap/2 wire helpers and messages
([#23611](paradigmxyz/reth#23611))
- Optionally fetch BAL with full blocks
([#23629](paradigmxyz/reth#23629))
- Discv5 enabled by default
([#23686](paradigmxyz/reth#23686))

**DB**
- Add `reth db migrate-v2` for v1→v2 storage migration
([#23422](paradigmxyz/reth#23422))
- Detect and warn about ZFS
([#23685](paradigmxyz/reth#23685))

**BAL**
- Scaffold BAL store abstraction
([#23596](paradigmxyz/reth#23596))
- Enable BAL building in ethereum payload
([#23597](paradigmxyz/reth#23597))
- Add parallelization and batch IO flags
([#23663](paradigmxyz/reth#23663))

**Refactor**
- Make `WorkerPool` lazy by default
([#23627](paradigmxyz/reth#23627))
- Encapsulate state fetching in db provider
([#23656](paradigmxyz/reth#23656))
- Remove `TrieNodeProvider`
([#23658](paradigmxyz/reth#23658))
- Unify opaque consensus error helpers
([#23669](paradigmxyz/reth#23669))

**Payload**
- Add gas limit and slot number to `BlockOrPayload`
([#23624](paradigmxyz/reth#23624),
[#23626](paradigmxyz/reth#23626))

**Bench**
- Add CLI flag to fetch balances by default; require local benchmark
data ([#23655](paradigmxyz/reth#23655),
[#23679](paradigmxyz/reth#23679))

**Deps**
- Bump alloy crates to 2.0.1
([#23677](paradigmxyz/reth#23677)),
rustls-webpki
([#23681](paradigmxyz/reth#23681)), weekly
`cargo update`
([#23628](paradigmxyz/reth#23628))

**Testing**
- Remove unsafe `env::set_var(RUST_LOG)` from tests
([#23672](paradigmxyz/reth#23672))
- Address nightly clippy warnings
([#23630](paradigmxyz/reth#23630))

## Migrations

🔗 Amp thread:
https://ampcode.com/threads/T-019db884-dc46-71f5-a823-00c3a16191d4
- **Reth dependency bump**: All `reth-*` git dependencies updated from
rev `98ebc34` to `7839f3d`
- **Alloy version bump**: `alloy-*` crates updated from `2.0.0` to
`2.0.1`; `alloy-evm` changed from `0.33.2` to `0.33.0`
- **`ConsensusError::Other` → `ConsensusError::msg`**: All
`ConsensusError::Other(...)` calls migrated to
`ConsensusError::msg(...)`, which accepts `&str`/`impl Display` directly
instead of requiring `String` (removes `.to_string()` calls for string
literals)
- **`deny.toml` license exceptions**: Added MPL-2.0 exceptions for
`bitmaps`, `imbl`, and `imbl-sized-chunks` (new transitive dependencies)

[GitHub
Workflow](https://github.com/tempoxyz/tempo/actions/runs/24816009191)

---------

Co-authored-by: Alexey Shekhirin <github@shekhirin.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants