Skip to content

fix(wal): isolate raft-engine entry caches by engine - #398

Merged
beinan merged 1 commit into
lance-format:mainfrom
beinan:codex/wal-engine-cache
Oct 20, 2026
Merged

beinan merged 1 commit into
lance-format:mainfrom
beinan:codex/wal-engine-cache

Conversation

@beinan

@beinan beinan commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • With two physical raft-engine logs on one thread, identical file/block coordinates can return the other engine's payload. The rewrite path can also persist those wrong bytes. Give each engine lifetime a non-reused cache identity and use it in both ordinary and rewrite reads; disk and wire formats stay unchanged.
  • Vendor the pinned 0.4.2 release and use a direct path dependency so repository and Git consumers use the correction. Only engine.rs and purge.rs differ from upstream source; the complete two-file delta is in vendor/raft-engine/read-cache-identity.patch, with source revision, archive checksum and licensing provenance alongside it. The WAL crate remains unpublished; publishing it will need a separate dependency packaging decision.
  • Add real-file regressions for scalar reads, batch reads, closed/replaced engines, and physical rewrite followed by fresh-thread recovery. Run them in CI, including when only the vendored dependency changes.

Refs #378. This is a prerequisite correctness fix for the ingestion work, not production enablement of the distributed writer.

Testing

  • The original dependency failed all four cases with wrong payloads; the unchanged cases passed with the correction, including persisted rewrite corruption recovery.
  • cargo test --locked -p lance-context-wal --features lab --test engine_cache: 4 passed. Optional WAL feature Clippy passed.
  • Full ci-pr-helper checks passed: workspace Rust tests, Python tests (229 passed, 2 skipped, 1 expected failure), Ruff, Pyright, formatting and Clippy.
  • Workspace package metadata check passed with cargo package --workspace --exclude lance-context-python --allow-dirty --no-verify --all-features --locked; spelling and final source-integrity checks passed.

@beinan
beinan merged commit 9130401 into lance-format:main Oct 20, 2026
16 checks passed
beinan added a commit that referenced this pull request Oct 20, 2026
## Summary

- Add an opt-in `raft-log` storage boundary: one physical engine per
node and cloneable raft-rs `Storage` handles for its static
session-sharded groups. Persist entries, term ranges and HardState
atomically, then wait for a shared physical sync barrier. Bind the
layout and node identity before returning any handles.
- Reject committed-prefix replacement and term/vote/commit regressions.
Look up terms without decoding payloads, and bound each engine
range-read request before applying Raft's byte limit. A disk-write error
or unwinding sync panic permanently fences every group handle until the
physical log is reopened.
- Cover real files, independent-engine cache isolation, concurrent
sync/error paths, Linux child-process write failures and SIGKILL
recovery, and the RawNode persistence/Ready contract. Use the vendored
cache correction from #398 and run the optional storage tests in CI.

A successful local persist is not a quorum ACK. This increment retains
the full log and static membership; transport, snapshots/reclamation,
producer deduplication and Lance publication remain follow-up work. It
does not switch production ingestion.

Refs #378.

## Testing

- `cargo test --locked -p lance-context-wal --features raft-log --lib
--test raft_log --test raft_log_cache_identity`: 18 passed; the
subprocess worker is invoked by its parent tests and ignored as a
standalone test.
- The three unchanged facade cache tests returned exact wrong payloads
on the original engine and passed with the vendored correction.
- `cargo clippy --locked -p lance-context-wal --all-features
--all-targets -- -D warnings`: passed.
- Full `ci-pr-helper` checks passed: workspace Rust tests, Python (229
passed, 2 skipped, 1 expected failure), Ruff, Pyright, formatting and
Clippy. Workspace package metadata and spelling checks passed.
- The final term-decoding iteration also passes Rust 1.99 Clippy and all
18 durable-storage tests; the truncated-index check and on-disk
representation are unchanged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant