-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Context
We experimented with adding multi_get at the ReadonlyKV/storage-wrapper level in evolve_storage, but the current backend (commonware_storage::qmdb in use here) exposes single-key get and write batching, not native read batching.
That means wrapper-level multi_get can reduce some overhead, but remains fundamentally N x single-key reads.
Problem
Hot read paths (cache warming, account/state lookups, RPC-adjacent storage reads) need deterministic, ordered batch reads without paying per-key API/runtime overhead repeatedly.
Proposal
- Add native read-side batch API support in storage backend integration:
- Target API shape in our layer:
multi_get(&[Vec<u8>]) -> Vec<Option<Vec<u8>>>(input-order preserving). - If upstream QMDB adds a native batch read, use it directly.
- If not, implement the best possible pipelined/parallel strategy with bounded concurrency and deterministic output ordering.
- Target API shape in our layer:
- Keep cache behavior explicit:
- Resolve cache hits first.
- Fetch misses in batch path.
- Backfill positive and negative cache deterministically.
- Adopt in first consumer path:
- cache warming (
warm_cache) - then one RPC/state query hot path
- cache warming (
- Add benchmarks + regression gates:
- compare
getloop vsmulti_getfor cold/warm cache - include key cardinality and hit-ratio variants
- compare
Acceptance Criteria
- Deterministic output order for any key vector (including duplicates).
- No behavior regressions vs existing single-key
get. - Measurable latency improvement on representative read-heavy workloads.
- Benchmarks checked into repo and runnable in CI/dev.
Notes
- This should be done as small reversible steps: API -> backend impl -> one consumer -> benchmarks.
- Keep memory bounds explicit for any parallel/pipelined implementation.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels