Generated design docs and implementation plans via Codex for: - Batch 13: FileStore Read/Query - Batch 14: FileStore Write/Lifecycle - Batch 15: MsgBlock + ConsumerFileStore - Batch 18: Server Core - Batch 19: Accounts Core - Batch 20: Accounts Resolvers - Batch 21: Events + MsgTrace - Batch 22: Monitoring All plans include mandatory verification protocol and anti-stub guardrails. Updated batches.md with file paths and planned status.
5.5 KiB
Batch 15 MsgBlock + ConsumerFileStore Design
I'm using brainstorm to produce this design before implementation planning.
Context
- Batch:
15(MsgBlock + ConsumerFileStore) - Dependency: Batch
14(FileStore Write/Lifecycle) - Scope:
121features +89tests - Go source:
golang/nats-server/server/filestore.go - Current batch status:
pending(all mapped features/tests currentlydeferred)
Observed with PortTracker:
batch show 15: full feature/test inventory loaded fromserver/filestore.goand related tests.batch list: Batch 15 depends on Batch 14.batch ready: Batch 15 is not startable yet (dependency gate not satisfied).report summary: overall porting progress is1924/6942 (27.7%).
Problem Statement
Batch 15 is the deepest part of FileStore internals: message block recovery/scanning, cache lifecycle, compaction/tombstones, disk rewrite/compression/encryption paths, and ConsumerFileStore state flushing. If this batch is implemented without strict verification discipline, downstream stream/consumer lifecycle batches will inherit correctness and durability bugs that are expensive to debug.
Constraints and Success Criteria
- Do not start Batch 15 execution until Batch 14 is complete.
- Keep implementation scoped to Batch 15 mapped IDs.
- Enforce non-stub behavior for both production code and tests.
- Promote statuses only with evidence-backed build/test proof.
- If blocked, keep IDs deferred with explicit reasons; do not fake-pass.
Success for this batch means:
- All implementable Batch 15 features are real C# ports with parity-oriented behavior.
- All implementable mapped tests are real behavioral tests and passing.
- Blocked items remain deferred with concrete, auditable reasons.
- Batch can pass final
batch complete 15validation once dependencies are met and evidence is complete.
Approaches Considered
Approach 1 (Recommended): Vertical slices by feature groups and test waves
Split 121 features into seven groups (20/20/20/20/20/20/1) and execute each group with immediate build/test/status gates before moving on.
Pros:
- Contains risk in file-store concurrency code.
- Makes regressions local and debuggable.
- Supports strict anti-stub and evidence requirements.
Cons:
- More checkpoints and bookkeeping overhead.
Approach 2: Feature-complete first, tests second
Implement all production features first, then port all tests.
Pros:
- Fewer context switches while coding.
Cons:
- Late detection of regressions.
- Weak traceability for status updates.
- Higher risk of last-minute stub behavior.
Approach 3: Test-first broad wave with temporary placeholders
Attempt to satisfy test volume rapidly with minimal implementation placeholders.
Pros:
- Fast apparent progress.
Cons:
- Violates anti-stub requirement.
- Creates false confidence and rework.
- Unacceptable for durability-critical file store logic.
Recommended Design
1) Implementation Topology
Primary code targets:
dotnet/src/ZB.MOM.NatsNet.Server/JetStream/MessageBlock.csdotnet/src/ZB.MOM.NatsNet.Server/JetStream/FileStore.csdotnet/src/ZB.MOM.NatsNet.Server/JetStream/FileStoreTypes.csdotnet/src/ZB.MOM.NatsNet.Server/JetStream/StoreTypes.cs
Scope focus:
MessageBlockinternals (95 mapped features)ConsumerFileStoreinternals (18 mapped features)- Store enum/codec helpers and error wrappers
2) Verification-First Control Plane
Every feature group and test wave must pass:
- Per-feature read/port/build/test loop
- Stub scan gates (production + tests)
- Build gate after each feature group
- Related test gate before feature
verified - Chunked status updates (
<=15IDs/update) - Full checkpoint (
build + full test + commit) between tasks
3) Test Strategy
Mapped tests are concentrated in:
JetStreamFileStoreTests.Impltests.cs(58)JwtProcessorTests.Impltests.cs(24)GatewayHandlerTests.Impltests.cs(2)ConcurrencyTests1.Impltests.cs(1)ConcurrencyTests2.Impltests.cs(2)EventsHandlerTests.Impltests.cs(1)ConfigReloaderTests.Impltests.cs(1)
Design decision:
- Treat filestore/concurrency tests as primary verification for Batch 15 behavior.
- Treat cross-module JWT/gateway/events/reload tests as dependency-sensitive; keep deferred with reasons if blocked by non-Batch-15 surfaces.
4) Data and Concurrency Parity Priorities
Highest-risk behavior areas to preserve from Go:
- Block rebuild and index/tombstone accounting integrity.
- Cache ownership transitions and forced expiration races.
- Flush loops and fsync boundaries for pending writes.
- Compression/encryption conversion and checksum correctness.
- Consumer state encode/encrypt/flush sequencing.
5) Status Governance
- Feature lifecycle:
deferred -> stub -> complete -> verified - Test lifecycle:
deferred -> stub -> verified(ordeferredwith blocker note) - Status updates require direct evidence references (Go line reviewed, build output, targeted test output, stub scan clean).
Non-Goals
- Pulling in work from future stream/consumer lifecycle batches beyond mapped Batch 15 IDs.
- Marking cross-module tests verified without executable evidence.
- Using placeholder methods/tests to satisfy status transitions.
Acceptance Criteria
- Batch 15 feature groups fully implemented with non-stub logic.
- Mandatory verification protocol passed for each group/wave.
- Evidence-backed status transitions applied in chunks of max 15 IDs.
- Deferred items carry explicit blocker reasons.
- Batch closure commands are expected to pass once dependency Batch 14 is complete.