From 1994a555bf5e084192e66d061138456d66d9f5b0 Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Fri, 29 May 2026 21:45:03 +0800 Subject: [PATCH 01/12] perf(embedded) #392: add ReadActor fast path for Eventual/LeaseRead, ReadActorConfig, and full test coverage --- CHANGELOG.md | 21 ++ MIGRATION_GUIDE.md | 47 +++ benches/embedded-bench/config/n1.toml | 4 + benches/embedded-bench/config/n2.toml | 4 + benches/embedded-bench/config/n3.toml | 4 + benches/embedded-bench/src/main.rs | 24 +- benches/reports/v0.2.5/bench_report_v0.2.5.md | 113 +++++++ config/base/raft.toml | 13 + d-engine-core/src/config/raft.rs | 46 +++ d-engine-core/src/lib.rs | 4 + d-engine-core/src/raft.rs | 8 + d-engine-core/src/raft_role/leader_state.rs | 57 ++-- .../leader_state_test/become_follower_test.rs | 47 +++ .../leader_state_test/client_read_test.rs | 22 +- .../lease_refresh_on_log_flushed_test.rs | 49 ++- .../src/raft_role/leader_state_test/mod.rs | 3 + .../pending_lease_reads_test.rs | 10 +- d-engine-core/src/raft_role/mod.rs | 9 + d-engine-core/src/raft_role/read_lease.rs | 145 ++++++++ .../src/raft_role/read_lease_test.rs | 312 ++++++++++++++++++ d-engine-core/src/read_actor.rs | 112 +++++++ d-engine-core/src/read_actor_test.rs | 240 ++++++++++++++ d-engine-server/benches/lease_performance.rs | 4 +- d-engine-server/benches/state_machine.rs | 2 +- d-engine-server/benches/ttl.rs | 12 +- d-engine-server/benches/watch_overhead.rs | 14 +- d-engine-server/src/api/embedded.rs | 125 ++++--- d-engine-server/src/api/embedded_client.rs | 131 ++++++-- .../src/api/embedded_client_fast_path_test.rs | 293 ++++++++++++++++ .../src/api/embedded_client_test.rs | 6 +- d-engine-server/src/api/embedded_test.rs | 43 +-- d-engine-server/src/api/mod.rs | 22 +- d-engine-server/src/api/standalone.rs | 4 +- d-engine-server/src/lib.rs | 4 + d-engine-server/src/node/builder.rs | 2 + d-engine-server/src/node/mod.rs | 19 ++ .../adaptors/file/file_state_machine.rs | 8 +- .../adaptors/rocksdb/rocksdb_state_machine.rs | 8 +- .../rocksdb/rocksdb_unified_engine_test.rs | 6 +- d-engine-server/src/storage/lease.rs | 6 +- .../src/storage/lease_integration_test.rs | 24 +- .../src/storage/lease_unit_test.rs | 52 +-- d-engine-server/src/storage/mod.rs | 2 +- .../src/test_utils/mock/mock_node_builder.rs | 4 + .../bank_transfer_invariant_embedded.rs | 4 +- .../distributed_lock_embedded.rs | 4 +- .../leader_failover_cas_embedded.rs | 4 +- .../snapshot_recovery_embedded.rs | 6 +- .../config_loading_embedded.rs | 6 +- .../scale_single_to_three_node_embedded.rs | 58 ++-- .../single_node_bootstrap_embedded.rs | 14 +- .../cluster_state_consensus_embedded.rs | 87 +++-- .../consistent_reads/lease_read_embedded.rs | 8 +- .../linearizable_read_batching_embedded.rs | 10 +- .../linearizable_read_consistency_embedded.rs | 10 +- .../select_fairness_embedded.rs | 6 +- .../embedded_client_operations.rs | 18 +- .../leader_failover_embedded.rs | 12 +- .../tests/failover_and_recovery/mod.rs | 2 +- .../learner_readonly_sync_embedded.rs | 39 ++- .../learner_readonly_sync_standalone.rs | 2 +- ...napshot_concurrent_replication_embedded.rs | 13 +- .../snapshot_concurrent_writes_embedded.rs | 11 +- .../snapshot_follower_generation_embedded.rs | 11 +- .../snapshot_interrupted_transfer_embedded.rs | 6 +- ..._leader_change_during_transfer_embedded.rs | 6 +- .../watch_events_embedded.rs | 14 +- .../watch_membership_embedded.rs | 13 +- .../watch_performance_gate_embedded.rs | 6 +- d-engine/src/lib.rs | 4 +- examples/quick-start-embedded/src/main.rs | 4 +- examples/service-discovery-embedded/server.rs | 4 +- examples/three-nodes-embedded/src/main.rs | 16 +- .../three-nodes-standalone/config/n1.toml | 5 +- .../three-nodes-standalone/config/n2.toml | 4 + .../three-nodes-standalone/config/n3.toml | 4 + 76 files changed, 2072 insertions(+), 424 deletions(-) create mode 100644 benches/reports/v0.2.5/bench_report_v0.2.5.md create mode 100644 d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs create mode 100644 d-engine-core/src/raft_role/read_lease.rs create mode 100644 d-engine-core/src/raft_role/read_lease_test.rs create mode 100644 d-engine-core/src/read_actor.rs create mode 100644 d-engine-core/src/read_actor_test.rs create mode 100644 d-engine-server/src/api/embedded_client_fast_path_test.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 41c510ff..6015118f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file. --- +## [v0.2.5] - 2026-XX-XX + +### Added + +- **ReadActor fast path for Eventual/LeaseRead** (#392): Dedicated `ReadActor` task serves `EventualConsistency` and `LeaseRead` without entering the Raft loop, eliminating channel contention under high read concurrency. + - `Arc` is owned exclusively by ReadActor — guarantees RocksDB LOCK release before Raft shutdown on `stop()`, fixing `test_snapshot_recovery_embedded` + - `ReadLease.revoke()`: atomic lease invalidation on leader demotion (replaces `invalidate()`) + - `EmbeddedClient` routes Eventual/Lease → ReadActor; falls back to `cmd_tx` on `LeaseInvalid`/`SmStopped` + - New `[raft.read_actor]` config section: `channel_capacity` (default 512), `max_drain` (default 100) + - **Benchmark (local embedded, 100 concurrent clients)**: Lease Read +10.9%, Eventual Read +13.1% vs v0.2.4; write throughput unchanged (see `benches/reports/v0.2.5/`) + +### Fixed + +- **fix(ttl) #398**: Removed `lease.enabled` flag — TTL expiration is always active. Fixes fatal crash when calling `put_with_ttl` without setting the (now-removed) `lease.enabled = true`. + +### Changed + +- `[raft.read_actor]` replaces the previous flat `read_actor_channel_capacity` / `read_actor_max_drain` fields in `[raft]`. Update existing config files accordingly. + +--- + ## [v0.2.4] - 2026-05-23 ### Added diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md index 7c136ac5..fb768c2c 100644 --- a/MIGRATION_GUIDE.md +++ b/MIGRATION_GUIDE.md @@ -134,6 +134,7 @@ grep "WAL" /var/log/d-engine.log | v0.2.0–v0.2.2 | Absolute expiration | Compatible | ✅ Yes (clear WAL from v0.1.x) | | v0.2.3 | Same as v0.2.0+ | **Incompatible** | ✅ Yes (protobuf enum changes + API changes) | | v0.2.4 | Same as v0.2.0+ | Compatible (additive)| ✅ Yes (delete `snapshot/` — format changed to CF export)| +| v0.2.5 | Same as v0.2.0+ | Compatible (additive)| ⚠️ Minor (remove `lease.enabled` from config if present) | --- @@ -493,4 +494,50 @@ See [Watch Feature Guide](https://docs.rs/d-engine/latest/d_engine/docs/server_g --- +--- + +## For v0.2.4 Users: TTL Config Change in v0.2.5 (#398) + +### What Changed + +The `enabled` flag under `[raft.state_machine.lease]` has been removed. TTL expiration is now **always active** — no opt-in required. + +In v0.2.4, omitting `enabled = true` caused a fatal crash on `put_with_ttl`. This bug is fixed in v0.2.5. + +### Migration + +If your config contains `enabled = true` or `enabled = false`, remove the line: + +```toml +# Old (v0.2.4) — remove this line +[raft.state_machine.lease] +enabled = true # ← delete + +# New (v0.2.5) — TTL always active, no flag needed +[raft.state_machine.lease] +cleanup_interval_ms = 1000 +``` + +**Impact**: None if you do not touch the config — unrecognised fields are ignored. The only behavioral change is that TTL expiration is now unconditionally enabled. + +--- + +## For v0.2.4 Users: New `[raft.read_actor]` Config Section in v0.2.5 (#392) + +This section is **optional** — both fields have defaults and existing configs work without changes. + +```toml +[raft.read_actor] +# mpsc channel buffer for Eventual/LeaseRead fast path. +# Rule of thumb: ≥ 2× peak concurrent readers. Default: 512. +channel_capacity = 512 + +# Max reads drained per wakeup. Default: 100. +max_drain = 100 +``` + +No migration action required unless you want to tune read concurrency. + +--- + **Last Updated:** May 2026 diff --git a/benches/embedded-bench/config/n1.toml b/benches/embedded-bench/config/n1.toml index ab276307..4af9487a 100644 --- a/benches/embedded-bench/config/n1.toml +++ b/benches/embedded-bench/config/n1.toml @@ -9,6 +9,10 @@ initial_cluster = [ db_root_dir = "./data/n1" log_dir = "./logs" +[raft.read_actor] +channel_capacity = 10240 +max_drain = 2000 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations max_batch_size = 200 diff --git a/benches/embedded-bench/config/n2.toml b/benches/embedded-bench/config/n2.toml index ee6d95f0..69d05252 100644 --- a/benches/embedded-bench/config/n2.toml +++ b/benches/embedded-bench/config/n2.toml @@ -9,6 +9,10 @@ initial_cluster = [ db_root_dir = "./data/n2" log_dir = "./logs" +[raft.read_actor] +channel_capacity = 10240 +max_drain = 2000 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations max_batch_size = 200 diff --git a/benches/embedded-bench/config/n3.toml b/benches/embedded-bench/config/n3.toml index 651d5ce9..0521dc4a 100644 --- a/benches/embedded-bench/config/n3.toml +++ b/benches/embedded-bench/config/n3.toml @@ -9,6 +9,10 @@ initial_cluster = [ db_root_dir = "./data/n3" log_dir = "./logs" +[raft.read_actor] +channel_capacity = 10240 +max_drain = 2000 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations max_batch_size = 200 diff --git a/benches/embedded-bench/src/main.rs b/benches/embedded-bench/src/main.rs index caa0d23a..fa123ff6 100644 --- a/benches/embedded-bench/src/main.rs +++ b/benches/embedded-bench/src/main.rs @@ -1,4 +1,4 @@ -use d_engine::EmbeddedEngine; +use d_engine::DefaultEmbeddedEngine; use d_engine::protocol::ReadConsistencyPolicy; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Arc, Mutex}; @@ -202,7 +202,7 @@ async fn main() { /// Run a single benchmark test with specified parameters #[allow(clippy::too_many_arguments)] async fn run_benchmark_task( - engine: &Arc, + engine: &Arc, test_name: &str, command: Commands, total: u64, @@ -294,7 +294,7 @@ async fn run_benchmark_task( /// Run all benchmark tests in batch mode async fn run_batch_tests( - engine: &Arc, + engine: &Arc, cli: &Cli, ) { println!("\n╔════════════════════════════════════════╗"); @@ -420,7 +420,7 @@ async fn run_batch_tests( /// Helper function to run a single test in batch mode async fn run_single_batch_test( - engine: &Arc, + engine: &Arc, test_name: &str, command: Commands, total: u64, @@ -447,7 +447,7 @@ async fn run_local_benchmark(cli: Cli) { println!("Starting local benchmark mode..."); let engine = Arc::new( - EmbeddedEngine::start_with(&cli.config_path) + DefaultEmbeddedEngine::start_with(&cli.config_path) .await .expect("Failed to start engine"), ); @@ -673,7 +673,7 @@ async fn run_http_server(cli: Cli) { println!("Health check port: {}", cli.health_port); let engine = Arc::new( - EmbeddedEngine::start_with(&cli.config_path) + DefaultEmbeddedEngine::start_with(&cli.config_path) .await .expect("Failed to start engine"), ); @@ -701,7 +701,7 @@ async fn run_http_server(cli: Cli) { } async fn start_health_check_server( - engine: Arc, + engine: Arc, port: u16, ) { let app = Router::new() @@ -718,7 +718,7 @@ async fn start_health_check_server( axum::serve(listener, app).await.expect("Health check server failed"); } -async fn health_primary(State(engine): State>) -> StatusCode { +async fn health_primary(State(engine): State>) -> StatusCode { if engine.is_leader() { StatusCode::OK } else { @@ -726,7 +726,7 @@ async fn health_primary(State(engine): State>) -> StatusCode } } -async fn health_replica(State(engine): State>) -> StatusCode { +async fn health_replica(State(engine): State>) -> StatusCode { if !engine.is_leader() { StatusCode::OK } else { @@ -735,7 +735,7 @@ async fn health_replica(State(engine): State>) -> StatusCode } async fn start_business_server( - engine: Arc, + engine: Arc, port: u16, ) { let app = Router::new() @@ -753,7 +753,7 @@ async fn start_business_server( } async fn handle_put( - State(engine): State>, + State(engine): State>, Json(req): Json, ) -> StatusCode { match engine.client().put(req.key.into_bytes(), req.value.into_bytes()).await { @@ -763,7 +763,7 @@ async fn handle_put( } async fn handle_get( - State(engine): State>, + State(engine): State>, Path(key): Path, ) -> Result, StatusCode> { match engine.client().get_eventual(key.into_bytes()).await { diff --git a/benches/reports/v0.2.5/bench_report_v0.2.5.md b/benches/reports/v0.2.5/bench_report_v0.2.5.md new file mode 100644 index 00000000..da546fd6 --- /dev/null +++ b/benches/reports/v0.2.5/bench_report_v0.2.5.md @@ -0,0 +1,113 @@ +# d-engine v0.2.5 Benchmark Report + +**Test Environments**: + +- **Local**: Apple M2 Mac mini (8-core, 16GB RAM, 3-node cluster on localhost) +- **AWS**: EC2 c5.2xlarge (8 vCPUs, 16GB RAM, 50GB SSD) × 3 nodes + +**Test Dates**: + +- **Local v0.2.5 vs v0.2.4**: May 29, 2026 (3-round average, embedded; warmup round excluded) +- **AWS v0.2.5**: _(TBD — not yet collected)_ + +**Key/Value**: 8 bytes / 256 bytes + +--- + +## Local 3-Node Cluster: d-engine v0.2.5 vs d-engine v0.2.4 + +### Embedded Mode: v0.2.5 vs v0.2.4 + +_(3-round average, manually collected; see Benchmark Configuration for settings)_ + +| **Scenario** | **Metric** | **v0.2.4** | **v0.2.5** | **Δ** | +| ------------------- | ----------- | ------------- | ------------- | ------------- | +| Single Client Write | Throughput | 9,740 ops/s | 9,962 ops/s | +2.3% → | +| | Avg Latency | 0.102 ms | 0.100 ms | -2.0% → | +| | p99 Latency | 0.177 ms | 0.194 ms | +9.6% → | +| High Conc. Write | Throughput | 233,821 ops/s | 231,797 ops/s | -0.9% → | +| | Avg Latency | 0.426 ms | 0.430 ms | +0.9% → | +| | p99 Latency | 1.164 ms | 1.189 ms | +2.1% → | +| Linearizable Read | Throughput | 630,789 ops/s | 633,466 ops/s | +0.4% → | +| | Avg Latency | 0.157 ms | 0.156 ms | stable | +| | p99 Latency | 0.367 ms | 0.398 ms | +8.4% → | +| Lease Read | Throughput | 730,836 ops/s | 810,491 ops/s | **+10.9%** ✅ | +| | Avg Latency | 0.136 ms | 0.123 ms | **-9.4%** ✅ | +| | p99 Latency | 0.337 ms | 0.293 ms | **-13.1%** ✅ | +| Eventual Read | Throughput | 752,198 ops/s | 850,952 ops/s | **+13.1%** ✅ | +| | Avg Latency | 0.132 ms | 0.117 ms | **-11.4%** ✅ | +| | p99 Latency | 0.343 ms | 0.267 ms | **-22.2%** ✅ | +| Hot-Key (10 keys) | Throughput | 659,429 ops/s | 668,178 ops/s | +1.3% → | +| | Avg Latency | 0.153 ms | 0.148 ms | -3.0% → | +| | p99 Latency | 0.343 ms | 0.351 ms | +2.3% → | + +**Notes**: + +- Lease/Eventual Read improvement driven by ReadActor fast path (#392): dedicated task bypasses Raft loop entirely for Eventual/LeaseRead, eliminating channel contention under 100 concurrent clients. +- v0.2.4 had Lease/Eventual regression vs v0.2.3 re-measured baseline (705K/742K). v0.2.5 fully recovers: **+14.9%/+14.6% vs v0.2.3**. +- Lease Read run-to-run variance: 727K–865K across 3 rounds (3-round avg 810K). Rounds 1–2 avg ~851K; round 3 dropped to 727K (OS scheduler noise on a loaded Mac mini). +- Linearizable Read p99 +8.4% and Single Write p99 +9.6% are within local benchmark noise; both paths are unchanged from v0.2.4. +- Write throughput fully stable: HC Write within ±1% of v0.2.4. +- Default config (`read_actor_channel_capacity = 512`) yields Lease/Eventual ~790K/~806K (+8%/+7% vs v0.2.4). Results above use tuned settings (see configuration). + +--- + +### Standalone Mode: v0.2.5 vs v0.2.4 + +_(TBD — not yet collected)_ + +--- + +## AWS 3-Node Cluster: d-engine v0.2.5 vs v0.2.4 + +_(TBD — not yet collected)_ + +--- + +## Key Changes Driving Results + +| Change | Impact | +| ---------------------------------------- | ------------------------------------------------------------------------- | +| ReadActor fast path (#392) | Lease/Eventual Read +10.9%/+13.1% vs v0.2.4; bypasses Raft loop entirely | +| ReadLease.revoke() (#392) | Atomic lease invalidation on leader demotion; replaces `invalidate()` | +| Configurable ReadActor (#392) | `read_actor_channel_capacity` and `read_actor_max_drain` in `[raft]` | +| Fix: RocksDB LOCK on stop() (#392) | ReadActor is sole `Arc` holder; LOCK released before Raft shutdown | + +--- + +## ReadActor Parameter Tuning (Local, Embedded Mode) + +Four configurations tested to characterize `read_actor_channel_capacity` and `read_actor_max_drain` sensitivity: + +| Config | cap / drain / batch | Lease Read | Eventual Read | HC Write | vs v0.2.3 (705K/742K) | +| ------ | ------------------- | ---------- | ------------- | -------- | --------------------- | +| C1 | 1024 / 1000 / 200 | ~790K | ~806K | ~232K | +12% / +9% | +| C2 | 1024 / 1000 / 300 | ~785K | ~803K | ~231K | +11% / +8% | +| C3 | 1024 / 2000 / 200 | ~756K | ~789K | ~227K | +7% / +6% | +| **C4** | **10240 / 2000 / 200** | **~810K** | **~851K** | **~232K** | **+15% / +15%** | + +**Key findings**: + +- `channel_capacity` is the dominant knob: 512→1024 yields +30%, 1024→10240 yields +3–6%. +- `max_drain` > `channel_capacity` has no effect: drain loop exits early once channel is empty. +- `max_batch_size = 300` does not improve reads and introduces write p99 instability. +- Rule of thumb: `read_actor_channel_capacity = 2× peak_concurrent_readers`. + +--- + +## Benchmark Configuration + +All Local Embedded results above were collected with the following configuration: + +```toml +[raft] +read_actor_channel_capacity = 10240 +read_actor_max_drain = 2000 + +[raft.persistence] +strategy = "MemFirst" +flush_policy = { Batch = { idle_flush_interval_ms = 1000 } } + +[raft.batching] +max_batch_size = 200 +``` diff --git a/config/base/raft.toml b/config/base/raft.toml index e47abad7..4374172e 100644 --- a/config/base/raft.toml +++ b/config/base/raft.toml @@ -2,6 +2,19 @@ # DEVELOPER SETTINGS — safe to adjust for your application # ============================================================================= +[raft.read_actor] +# ReadActor fast path — serves Eventual and LeaseRead requests without entering the Raft loop. + +# mpsc channel buffer between the client layer and ReadActor. +# Rule of thumb: set to at least 2× your peak concurrent Eventual/LeaseRead clients. +# Default: 512. +channel_capacity = 512 + +# Max reads drained per ReadActor wakeup. +# Setting above channel_capacity has no effect (channel empties first). +# Default: 100. +max_drain = 100 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations. # A single value covers all drain loops (cmd_rx, role_rx, new_commit_rx) because diff --git a/d-engine-core/src/config/raft.rs b/d-engine-core/src/config/raft.rs index 4dce9b0b..3091a862 100644 --- a/d-engine-core/src/config/raft.rs +++ b/d-engine-core/src/config/raft.rs @@ -87,6 +87,10 @@ pub struct RaftConfig { #[serde(default = "default_ordered_channel_capacity")] pub ordered_channel_capacity: usize, + /// ReadActor configuration — tuning for the dedicated Eventual/LeaseRead fast path. + #[serde(default)] + pub read_actor: ReadActorConfig, + /// Configuration settings for new node auto join feature #[serde(default)] pub auto_join: AutoJoinConfig, @@ -145,6 +149,7 @@ impl Default for RaftConfig { snapshot_rpc_timeout_ms: default_snapshot_rpc_timeout_ms(), cmd_channel_capacity: default_cmd_channel_capacity(), ordered_channel_capacity: default_ordered_channel_capacity(), + read_actor: ReadActorConfig::default(), read_consistency: ReadConsistencyConfig::default(), backpressure: BackpressureConfig::default(), rpc_compression: RpcCompressionConfig::default(), @@ -221,6 +226,47 @@ fn default_ordered_channel_capacity() -> usize { 1024 } +/// Configuration for the ReadActor — the dedicated read task that serves +/// Eventual and LeaseRead requests without entering the Raft loop. +/// +/// Exposed as `[raft.read_actor]` in TOML configuration. +/// +/// # Tuning Guidelines +/// - `channel_capacity`: set to at least 2× peak concurrent Eventual/LeaseRead clients +/// - `max_drain`: rarely needs changing; must not exceed `channel_capacity` meaningfully +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ReadActorConfig { + /// mpsc channel buffer between the client layer and ReadActor. + /// Larger values reduce backpressure under high Eventual/LeaseRead concurrency. + /// Default: 512. + #[serde(default = "default_read_actor_channel_capacity")] + pub channel_capacity: usize, + + /// Max reads drained per ReadActor wakeup (mirrors Raft::drain_client_cmds). + /// After the first recv().await fires, the actor drains up to this many + /// additional commands with try_recv() before yielding. + /// Default: 100. + #[serde(default = "default_read_actor_max_drain")] + pub max_drain: usize, +} + +impl Default for ReadActorConfig { + fn default() -> Self { + Self { + channel_capacity: default_read_actor_channel_capacity(), + max_drain: default_read_actor_max_drain(), + } + } +} + +fn default_read_actor_channel_capacity() -> usize { + 512 +} + +fn default_read_actor_max_drain() -> usize { + 100 +} + #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ReplicationConfig { /// Heartbeat interval (milliseconds): how often the leader sends AppendEntries RPCs. diff --git a/d-engine-core/src/lib.rs b/d-engine-core/src/lib.rs index ab15ce29..43d56cf7 100644 --- a/d-engine-core/src/lib.rs +++ b/d-engine-core/src/lib.rs @@ -67,6 +67,7 @@ mod purge; mod raft; mod raft_context; mod raft_role; +pub mod read_actor; mod replication; mod state_machine_handler; mod timer; @@ -128,6 +129,9 @@ pub use utils::*; pub(crate) use timer::*; +#[cfg(test)] +mod read_actor_test; + #[cfg(test)] mod command_test; #[cfg(test)] diff --git a/d-engine-core/src/raft.rs b/d-engine-core/src/raft.rs index 42297fe0..6fd1b1f1 100644 --- a/d-engine-core/src/raft.rs +++ b/d-engine-core/src/raft.rs @@ -714,6 +714,14 @@ where self.cmd_tx.clone() } + pub fn read_lease(&self) -> Arc { + Arc::clone(&self.role.state().shared_state().lease) + } + + pub fn current_term(&self) -> u64 { + self.role.state().current_term() + } + /// Returns a cloned role event sender for internal use. /// /// # Warning diff --git a/d-engine-core/src/raft_role/leader_state.rs b/d-engine-core/src/raft_role/leader_state.rs index 5b9d9267..388528de 100644 --- a/d-engine-core/src/raft_role/leader_state.rs +++ b/d-engine-core/src/raft_role/leader_state.rs @@ -5,6 +5,7 @@ use super::StateSnapshot; use super::buffers::BatchBuffer; use super::buffers::ProposeBatchBuffer; use super::candidate_state::CandidateState; +use super::read_lease::now_ms; use super::role_state::RaftRoleState; use super::role_state::check_and_trigger_snapshot; use super::role_state::send_replay_raft_event; @@ -73,7 +74,6 @@ use std::collections::VecDeque; use std::fmt::Debug; use std::marker::PhantomData; use std::sync::Arc; -use std::sync::Mutex; use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicU32; use std::sync::atomic::Ordering; @@ -420,11 +420,6 @@ pub struct LeaderState { /// Queue of learners that have caught up and are pending promotion to voter. pub pending_promotions: VecDeque, - /// Monotonic instant of the last quorum ACK, used to check lease validity. - /// `None` until the first ACK; replaced on every subsequent quorum confirmation. - /// Must be `Instant` (not `SystemTime`) — wall clock can move backward under NTP. - pub(super) lease_instant: Mutex>, - // -- Cluster Topology Cache -- /// Cached cluster metadata (updated on membership changes) /// Avoids repeated async calls in hot paths @@ -702,6 +697,8 @@ impl RaftRoleState for LeaderState { self.node_id(), self.current_term() ); + // Revoke lease so ReadActor immediately returns LeaseInvalid on the next read. + self.shared_state.lease.revoke(); Ok(RaftRole::Follower(Box::new(self.into()))) } @@ -1705,7 +1702,9 @@ impl RaftRoleState for LeaderState { // Refresh lease timestamp after all post-commit work to eliminate the yield-point // race window introduced when drain_commit_actions became async. if self.cluster_metadata.single_voter { - self.update_lease_timestamp(); + self.update_lease_timestamp( + ctx.node_config().raft.read_consistency.lease_duration_ms, + ); self.drain_pending_lease_reads(ctx); } } @@ -1882,7 +1881,9 @@ impl RaftRoleState for LeaderState { if quorum_confirmed { // Refresh after all post-commit work to eliminate the yield-point race window // introduced when drain_commit_actions became async. - self.update_lease_timestamp(); + self.update_lease_timestamp( + ctx.node_config().raft.read_consistency.lease_duration_ms, + ); self.drain_pending_lease_reads(ctx); // Path A drain (Bug #381 fix): serve linearizable reads that have been // waiting for quorum confirmation. Pure-read batches never advance @@ -3118,7 +3119,6 @@ impl LeaderState { snapshot_in_progress: AtomicBool::new(false), stale_check_deadline: None, pending_promotions: VecDeque::new(), - lease_instant: Mutex::new(None), linearizable_read_buffer: Box::new(BatchBuffer::new(batch_size).with_length_gauge( node_id, "linearizable", @@ -3467,7 +3467,7 @@ impl LeaderState { if let Some(read_batch) = read_batch { let read_index = self.calculate_read_index(); let last_applied = ctx.state_machine().last_applied().index; - if (self.cluster_metadata.single_voter || self.is_lease_valid(ctx)) + if (self.cluster_metadata.single_voter || self.is_lease_valid()) && last_applied >= read_index { self.execute_pending_reads(read_batch, ctx); @@ -3712,22 +3712,20 @@ impl LeaderState { /// Returns true if the leader's lease is still within its validity window. /// /// Uses a monotonic `Instant` so NTP clock adjustments cannot extend the lease. - /// Returns false if no quorum ACK has been received yet (lease_instant is None). - pub fn is_lease_valid( - &self, - ctx: &RaftContext, - ) -> bool { - let lease_duration_ms = ctx.node_config().raft.read_consistency.lease_duration_ms; - match *self.lease_instant.lock().expect("lease_instant poisoned") { - Some(t) => (t.elapsed().as_millis() as u64) < lease_duration_ms, - None => false, - } + /// Returns true iff this leader holds a valid quorum-backed lease. + /// Uses a single atomic load (~4 ns) — no mutex, no lock contention. + pub fn is_lease_valid(&self) -> bool { + self.shared_state.lease.is_valid_for_leader(self.current_term(), now_ms()) } - /// Records the current monotonic instant as the last quorum-confirmed timestamp. - /// Called after every quorum ACK (handle_append_result, handle_log_flushed). - fn update_lease_timestamp(&self) { - *self.lease_instant.lock().expect("lease_instant poisoned") = Some(Instant::now()); + /// Renews the lease after every quorum ACK (handle_append_result, handle_log_flushed). + /// Computes absolute deadline from config and stores it atomically. + fn update_lease_timestamp( + &self, + lease_duration_ms: u64, + ) { + let deadline = now_ms().saturating_add(lease_duration_ms); + self.shared_state.lease.renew(self.current_term(), deadline); } /// Unified write + linearizable read: single RPC for both (2*RTT → 1*RTT). @@ -3805,7 +3803,9 @@ impl LeaderState { #[cfg(test)] pub(crate) fn test_update_lease_timestamp(&mut self) { - self.update_lease_timestamp(); + // Renew with a generous 60-second deadline so tests don't flake on slow CI. + let deadline = now_ms().saturating_add(60_000); + self.shared_state.lease.renew(self.current_term(), deadline); } /// Returns the current match_index for `peer_id`, or 0 if not yet tracked. @@ -3886,7 +3886,7 @@ impl LeaderState { ctx: &RaftContext, role_tx: &mpsc::UnboundedSender, ) -> Result<()> { - if self.is_lease_valid(ctx) { + if self.is_lease_valid() { // Lease valid - serve immediately let results = ctx .handlers @@ -3899,7 +3899,9 @@ impl LeaderState { // Lease expired - need to confirm leadership before serving. if self.cluster_metadata.single_voter { // Single-voter: self is the entire quorum, refresh immediately and serve. - self.update_lease_timestamp(); + self.update_lease_timestamp( + ctx.node_config().raft.read_consistency.lease_duration_ms, + ); let results = ctx .handlers .state_machine_handler @@ -3995,7 +3997,6 @@ impl From<&CandidateState> for LeaderState { total_voters: 0, replication_targets: vec![], }, - lease_instant: Mutex::new(None), linearizable_read_buffer: Box::new( BatchBuffer::new(candidate.node_config.raft.batching.max_batch_size) .with_length_gauge( diff --git a/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs b/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs new file mode 100644 index 00000000..3d50ae17 --- /dev/null +++ b/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs @@ -0,0 +1,47 @@ +//! Tests verifying that `become_follower()` revokes the read lease. +//! +//! Safety invariant: a stepped-down leader must not allow ReadActor to serve +//! stale lease reads. The shared `Arc` must be invalid immediately +//! after `become_follower()` returns so any concurrent ReadActor check fails. + +use std::sync::Arc; + +use crate::RaftNodeConfig; +use crate::now_ms; +use crate::raft_role::leader_state::LeaderState; +use crate::raft_role::role_state::RaftRoleState; +use crate::test_utils::mock::MockTypeConfig; + +/// become_follower() revokes the shared Arc so ReadActor immediately +/// returns LeaseInvalid on the very next is_valid() check. +/// +/// This pins the safety contract: after step-down the ReadActor fast path is +/// blocked regardless of when (before or after) its thread checks the lease. +#[tokio::test] +async fn test_become_follower_revokes_read_lease() { + let mut state = LeaderState::::new(1, RaftNodeConfig::default().into()); + + // Clone Arc before step-down to observe the shared lease from the outside + // (simulates what ReadActor holds). + let lease = Arc::clone(&state.shared_state.lease); + + // Renew with a generous 60-second deadline. + state.test_update_lease_timestamp(); + assert!( + state.is_lease_valid(), + "precondition: lease must be valid before become_follower()" + ); + assert!( + lease.is_valid(now_ms()), + "precondition: same Arc must also report valid" + ); + + // Transition to follower — must call lease.revoke() atomically. + let _ = state.become_follower().expect("become_follower must succeed"); + + // The shared Arc must now be invalid. + assert!( + !lease.is_valid(now_ms()), + "become_follower() must revoke the shared Arc" + ); +} diff --git a/d-engine-core/src/raft_role/leader_state_test/client_read_test.rs b/d-engine-core/src/raft_role/leader_state_test/client_read_test.rs index 67d972d1..f5b6621a 100644 --- a/d-engine-core/src/raft_role/leader_state_test/client_read_test.rs +++ b/d-engine-core/src/raft_role/leader_state_test/client_read_test.rs @@ -753,7 +753,7 @@ async fn test_expired_lease_detection() { // Don't update lease timestamp - lease should be expired by default assert!( - !state.is_lease_valid(&context), + !state.is_lease_valid(), "Lease should be expired when timestamp is never updated" ); } @@ -796,10 +796,7 @@ async fn test_expired_lease_single_voter_refreshed_immediately() { membership.expect_replication_peers().returning(Vec::new); state.init_cluster_metadata(&Arc::new(membership)).await.unwrap(); - assert!( - !state.is_lease_valid(&context), - "Precondition: lease expired" - ); + assert!(!state.is_lease_valid(), "Precondition: lease expired"); let client_read_request = ClientReadRequest { client_id: 1, @@ -815,7 +812,7 @@ async fn test_expired_lease_single_voter_refreshed_immediately() { // Lease must be refreshed after flush assert!( - state.is_lease_valid(&context), + state.is_lease_valid(), "Lease must be refreshed after single-voter flush" ); @@ -1187,10 +1184,7 @@ async fn test_lease_reuse_after_linearizable_read_refresh() { state.init_cluster_metadata(&Arc::new(membership)).await.unwrap(); // Verify: Initial lease is invalid - assert!( - !state.is_lease_valid(&ctx), - "Lease should be invalid initially" - ); + assert!(!state.is_lease_valid(), "Lease should be invalid initially"); let (role_tx, _role_rx) = mpsc::unbounded_channel(); @@ -1213,7 +1207,7 @@ async fn test_lease_reuse_after_linearizable_read_refresh() { state.handle_log_flushed(1, &ctx, &role_tx).await; assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should be valid after log flush (single-voter)" ); @@ -1282,7 +1276,7 @@ async fn test_eventual_consistency_ignores_stale_lease() { // Verify: Lease is invalid (simulates stale leader scenario) assert!( - !state.is_lease_valid(&ctx), + !state.is_lease_valid(), "Lease should be invalid (stale leader)" ); @@ -1306,7 +1300,7 @@ async fn test_eventual_consistency_ignores_stale_lease() { // Verify: Lease still invalid (not refreshed by EventualConsistency) assert!( - !state.is_lease_valid(&ctx), + !state.is_lease_valid(), "EventualConsistency should not refresh lease" ); @@ -2015,7 +2009,7 @@ async fn test_lease_read_empty_payload_verification_hangs_in_multi_node() { !state.cluster_metadata.single_voter, "precondition: multi-voter" ); - assert!(!state.is_lease_valid(&ctx), "precondition: lease expired"); + assert!(!state.is_lease_valid(), "precondition: lease expired"); let (role_tx, _role_rx) = mpsc::unbounded_channel(); let req = ClientReadRequest { diff --git a/d-engine-core/src/raft_role/leader_state_test/lease_refresh_on_log_flushed_test.rs b/d-engine-core/src/raft_role/leader_state_test/lease_refresh_on_log_flushed_test.rs index ac8faf6b..2adc6d43 100644 --- a/d-engine-core/src/raft_role/leader_state_test/lease_refresh_on_log_flushed_test.rs +++ b/d-engine-core/src/raft_role/leader_state_test/lease_refresh_on_log_flushed_test.rs @@ -155,7 +155,7 @@ async fn test_single_voter_lease_refreshed_on_log_flushed() { // Precondition: Lease is invalid initially assert!( - !state.is_lease_valid(&ctx), + !state.is_lease_valid(), "Lease should be invalid before any log flush" ); @@ -166,7 +166,7 @@ async fn test_single_voter_lease_refreshed_on_log_flushed() { // Verify: Lease is now valid assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should be valid after log flush in single_voter cluster" ); @@ -197,17 +197,17 @@ async fn test_single_voter_lease_expires_and_refreshes() { let (role_tx, _role_rx) = mpsc::unbounded_channel(); // T0: Lease invalid - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); // T1: Log flush → lease valid last_entry_id.store(1, Ordering::Relaxed); state.handle_log_flushed(1, &ctx, &role_tx).await; - assert!(state.is_lease_valid(&ctx)); + assert!(state.is_lease_valid()); // T2: Wait for lease to expire sleep(Duration::from_millis(lease_duration_ms + 50)).await; assert!( - !state.is_lease_valid(&ctx), + !state.is_lease_valid(), "Lease should expire after lease_duration_ms" ); @@ -215,7 +215,7 @@ async fn test_single_voter_lease_expires_and_refreshes() { last_entry_id.store(2, Ordering::Relaxed); state.handle_log_flushed(2, &ctx, &role_tx).await; assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should be refreshed by subsequent log flush" ); } @@ -244,13 +244,13 @@ async fn test_single_voter_lease_not_refreshed_when_commit_unchanged() { // Precondition: commit=0, lease invalid assert_eq!(state.commit_index(), 0); - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); // Action: Flush with durable=0, last_entry_id=0 (no new entries, commit unchanged) state.handle_log_flushed(0, &ctx, &role_tx).await; // Verify: Lease remains invalid (no leadership proof) - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); assert_eq!(state.commit_index(), 0); // Action: Flush with durable=1 (commit advances); set last_entry_id=1 to match @@ -258,7 +258,7 @@ async fn test_single_voter_lease_not_refreshed_when_commit_unchanged() { state.handle_log_flushed(1, &ctx, &role_tx).await; // Verify: Now lease is valid - assert!(state.is_lease_valid(&ctx)); + assert!(state.is_lease_valid()); assert_eq!(state.commit_index(), 1); } @@ -292,7 +292,7 @@ async fn test_single_voter_continuous_flushes_maintain_lease() { last_entry_id.store(i, Ordering::Relaxed); state.handle_log_flushed(i, &ctx, &role_tx).await; assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should remain valid after flush {i}" ); assert_eq!(state.commit_index(), i); @@ -302,7 +302,7 @@ async fn test_single_voter_continuous_flushes_maintain_lease() { } // Final verification: lease still valid - assert!(state.is_lease_valid(&ctx)); + assert!(state.is_lease_valid()); } // ============================================================================ @@ -331,7 +331,7 @@ async fn test_multi_voter_lease_not_refreshed_on_log_flushed() { // Precondition: Multi-voter cluster, lease invalid assert!(!state.cluster_metadata.single_voter); - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); // Action: Log flush with durable=1 // Note: In multi-voter, commit won't advance without follower ACKs, @@ -340,7 +340,7 @@ async fn test_multi_voter_lease_not_refreshed_on_log_flushed() { // Verify: Lease remains invalid (must wait for handle_append_result) assert!( - !state.is_lease_valid(&ctx), + !state.is_lease_valid(), "Lease should NOT be refreshed by log flush in multi-voter cluster" ); @@ -372,18 +372,18 @@ async fn test_multi_voter_lease_refresh_requires_append_result() { let (role_tx, _role_rx) = mpsc::unbounded_channel(); // Precondition: Lease invalid - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); // Action 1: Log flush → no lease refresh state.handle_log_flushed(1, &ctx, &role_tx).await; - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); // Action 2: Simulate append_result path (via test helper) state.test_update_lease_timestamp(); // Verify: Lease now valid (proves separation of paths) assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should be valid after explicit update (simulating append_result)" ); } @@ -413,7 +413,7 @@ async fn test_single_voter_durable_regression_does_not_refresh_lease() { last_entry_id.store(5, Ordering::Relaxed); state.handle_log_flushed(5, &ctx, &role_tx).await; assert_eq!(state.commit_index(), 5); - assert!(state.is_lease_valid(&ctx)); + assert!(state.is_lease_valid()); // Wait to distinguish timestamps sleep(Duration::from_millis(50)).await; @@ -424,10 +424,7 @@ async fn test_single_voter_durable_regression_does_not_refresh_lease() { // Verify: Commit unchanged, lease not updated (timestamp same as T1) assert_eq!(state.commit_index(), 5, "Commit should not regress"); - assert!( - state.is_lease_valid(&ctx), - "Lease should remain valid from T1" - ); + assert!(state.is_lease_valid(), "Lease should remain valid from T1"); } /// **Business Scenario**: Very short lease duration expires quickly @@ -452,13 +449,13 @@ async fn test_single_voter_very_short_lease_expires_quickly() { let (role_tx, _role_rx) = mpsc::unbounded_channel(); // T0: Lease invalid - assert!(!state.is_lease_valid(&ctx)); + assert!(!state.is_lease_valid()); // T1: Flush updates lease last_entry_id.store(1, Ordering::Relaxed); state.handle_log_flushed(1, &ctx, &role_tx).await; assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should be valid immediately after flush" ); @@ -467,7 +464,7 @@ async fn test_single_voter_very_short_lease_expires_quickly() { // T3: Lease expired assert!( - !state.is_lease_valid(&ctx), + !state.is_lease_valid(), "Lease should expire with lease_duration_ms = 50" ); } @@ -491,14 +488,14 @@ async fn test_single_voter_large_lease_duration() { // Action: Single flush last_entry_id.store(1, Ordering::Relaxed); state.handle_log_flushed(1, &ctx, &role_tx).await; - assert!(state.is_lease_valid(&ctx)); + assert!(state.is_lease_valid()); // Wait 1 second (much less than 10s lease) sleep(Duration::from_secs(1)).await; // Verify: Lease still valid assert!( - state.is_lease_valid(&ctx), + state.is_lease_valid(), "Lease should remain valid within duration" ); } diff --git a/d-engine-core/src/raft_role/leader_state_test/mod.rs b/d-engine-core/src/raft_role/leader_state_test/mod.rs index 3b263fc8..a9afc60c 100644 --- a/d-engine-core/src/raft_role/leader_state_test/mod.rs +++ b/d-engine-core/src/raft_role/leader_state_test/mod.rs @@ -60,3 +60,6 @@ mod stale_learner_deadline_test; #[cfg(test)] mod pending_reads_test; + +#[cfg(test)] +mod become_follower_test; diff --git a/d-engine-core/src/raft_role/leader_state_test/pending_lease_reads_test.rs b/d-engine-core/src/raft_role/leader_state_test/pending_lease_reads_test.rs index 7a99420c..ba7e96dd 100644 --- a/d-engine-core/src/raft_role/leader_state_test/pending_lease_reads_test.rs +++ b/d-engine-core/src/raft_role/leader_state_test/pending_lease_reads_test.rs @@ -166,10 +166,7 @@ async fn test_lease_read_expired_pushes_to_pending_lease_reads() { ) .await; - assert!( - !state.is_lease_valid(&context), - "precondition: lease expired" - ); + assert!(!state.is_lease_valid(), "precondition: lease expired"); let (resp_tx, _resp_rx) = MaybeCloneOneshot::new(); state.push_client_cmd(make_lease_read_cmd(resp_tx), &context); @@ -292,10 +289,7 @@ async fn test_single_voter_lease_read_served_immediately_on_expired_lease() { state.cluster_metadata.single_voter, "precondition: single-voter" ); - assert!( - !state.is_lease_valid(&context), - "precondition: lease expired" - ); + assert!(!state.is_lease_valid(), "precondition: lease expired"); let (resp_tx, mut resp_rx) = MaybeCloneOneshot::new(); let (role_tx, _role_rx) = mpsc::unbounded_channel(); diff --git a/d-engine-core/src/raft_role/mod.rs b/d-engine-core/src/raft_role/mod.rs index 6fea0855..5ed47b96 100644 --- a/d-engine-core/src/raft_role/mod.rs +++ b/d-engine-core/src/raft_role/mod.rs @@ -3,6 +3,7 @@ pub mod candidate_state; pub mod follower_state; pub mod leader_state; pub mod learner_state; +pub mod read_lease; pub mod role_state; #[cfg(test)] @@ -18,6 +19,7 @@ mod leader_state_test; mod learner_state_test; use std::collections::HashMap; +use std::sync::Arc; use std::sync::atomic::AtomicU32; use std::sync::atomic::Ordering; @@ -28,6 +30,7 @@ use follower_state::FollowerState; pub use leader_state::ClusterMetadata; use leader_state::LeaderState; use learner_state::LearnerState; +pub use read_lease::{ReadLease, init_clock, now_ms}; use role_state::RaftRoleState; use serde::Deserialize; use serde::Deserializer; @@ -84,6 +87,10 @@ pub struct SharedState { /// In-memory leader ID for hot-path reads (0 = no leader) /// Performance optimization: avoid RwLock on AppendEntries path current_leader_id: AtomicU32, + + /// Shared lease state between Raft loop (writer) and EmbeddedClient (reader). + /// Arc ensures the same allocation is shared across role transitions via clone(). + pub lease: Arc, } impl Clone for SharedState { @@ -93,6 +100,7 @@ impl Clone for SharedState { hard_state: self.hard_state, commit_index: self.commit_index, current_leader_id: AtomicU32::new(self.current_leader_id.load(Ordering::Acquire)), + lease: Arc::clone(&self.lease), } } } @@ -150,6 +158,7 @@ impl SharedState { hard_state, commit_index: last_applied_index_option.unwrap_or(0), current_leader_id: AtomicU32::new(0), + lease: Arc::new(ReadLease::new()), } } diff --git a/d-engine-core/src/raft_role/read_lease.rs b/d-engine-core/src/raft_role/read_lease.rs new file mode 100644 index 00000000..9eab7f10 --- /dev/null +++ b/d-engine-core/src/raft_role/read_lease.rs @@ -0,0 +1,145 @@ +use std::sync::OnceLock; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::Instant; + +// Process-local monotonic epoch. Initialized on first call to now_ms(). +// Using Instant (not SystemTime) guarantees NTP-safe monotonic time. +static EPOCH: OnceLock = OnceLock::new(); + +/// Monotonic milliseconds since first call. Safe to use for deadline arithmetic. +#[must_use] +pub fn now_ms() -> u64 { + EPOCH.get_or_init(Instant::now).elapsed().as_millis() as u64 +} + +/// Initializes the monotonic clock epoch. Call once at engine startup to avoid +/// first-call jitter on the hot path. +pub fn init_clock() { + let _ = now_ms(); +} + +/// Lock-free Raft read lease shared between the Raft loop (writer) and EmbeddedClient (reader). +/// +/// Packs term (16 bits) and deadline_ms (48 bits) into a single AtomicU64 so +/// that readers always observe a consistent (term, deadline) pair from one atomic +/// load — eliminating the ABA race that two separate AtomicU64 fields would have. +/// +/// Layout: `[63..48] term | [47..0] deadline_ms` +/// +/// - `deadline_ms = 0` → no valid lease (sentinel) +/// - `deadline_ms > now_ms()` → lease is still live +/// - `term` wraps at 16 bits (max 65535); Raft clusters rarely exceed a few thousand terms. +/// +/// # Writers (Raft loop only) +/// - `renew(term, deadline_ms)` — called on every quorum ACK +/// - `invalidate(new_term)` — called when leader steps down +/// +/// # Readers (EmbeddedClient hot path) +/// - `is_valid_for_leader(term, now_ms)` — validates term + deadline (~4 ns on L1 hit) +#[derive(Debug)] +pub struct ReadLease { + packed: AtomicU64, +} + +impl ReadLease { + const DEADLINE_MASK: u64 = (1u64 << 48) - 1; + const TERM_SHIFT: u32 = 48; + + pub fn new() -> Self { + Self { + packed: AtomicU64::new(0), + } + } + + #[inline] + fn pack( + term: u64, + deadline_ms: u64, + ) -> u64 { + debug_assert!( + deadline_ms <= Self::DEADLINE_MASK, + "deadline_ms overflows 48 bits" + ); + ((term & 0xFFFF) << Self::TERM_SHIFT) | (deadline_ms & Self::DEADLINE_MASK) + } + + #[inline] + fn unpack(v: u64) -> (u64, u64) { + (v >> Self::TERM_SHIFT, v & Self::DEADLINE_MASK) + } + + /// Renew the lease. Called by the Raft loop after every quorum ACK. + /// `deadline_ms` should be `now_ms() + lease_duration_ms`. + #[inline] + pub fn renew( + &self, + term: u64, + deadline_ms: u64, + ) { + self.packed.store(Self::pack(term, deadline_ms), Ordering::Release); + } + + /// Invalidate the lease. Called when leader steps down. + /// Sets `deadline_ms = 0`; subsequent `is_valid_for_leader` calls return false. + #[inline] + pub fn invalidate( + &self, + new_term: u64, + ) { + self.packed.store(Self::pack(new_term, 0), Ordering::Release); + } + + /// Revoke the lease immediately. Single atomic store(0, Release). + /// + /// Called by the Raft loop on ANY term change (leader step-down, new election). + /// Sets packed = 0 → deadline = 0 → `is_valid()` returns false until next `renew()`. + /// + /// Safety invariant: every term-change path in the Raft loop MUST call this. + /// Missing a call causes silent stale reads (LeaseRead correctness violation). + #[inline] + pub fn revoke(&self) { + self.packed.store(0, Ordering::Release); + } + + /// ReadActor hot path: single atomic load, no external term required. + /// + /// Returns `true` iff `deadline_ms > now_ms`. Safety relies on `revoke()` being + /// called on every term change — see `revoke()` doc for the invariant. + #[must_use] + #[inline] + pub fn is_valid( + &self, + now_ms: u64, + ) -> bool { + let packed = self.packed.load(Ordering::Acquire); + (packed & Self::DEADLINE_MASK) > now_ms + } + + /// Check both term and deadline in one atomic load (~4 ns on L1 hit). + /// + /// Used by both `LeaderState` (internal) and `EmbeddedClient` (fast path). + /// `current_term` is masked to 16 bits before comparison, matching the storage layout. + #[must_use] + #[inline] + pub fn is_valid_for_leader( + &self, + current_term: u64, + now_ms: u64, + ) -> bool { + let (term, deadline) = Self::unpack(self.packed.load(Ordering::Acquire)); + term == (current_term & 0xFFFF) && deadline > now_ms + } +} + +impl Default for ReadLease { + fn default() -> Self { + Self::new() + } +} + +// ReadLease is Send + Sync because AtomicU64 is Send + Sync. +// The compiler derives this automatically. + +#[cfg(test)] +#[path = "read_lease_test.rs"] +mod tests; diff --git a/d-engine-core/src/raft_role/read_lease_test.rs b/d-engine-core/src/raft_role/read_lease_test.rs new file mode 100644 index 00000000..bb4e58d3 --- /dev/null +++ b/d-engine-core/src/raft_role/read_lease_test.rs @@ -0,0 +1,312 @@ +use std::sync::Arc; +use std::sync::Barrier; +use std::thread; + +use super::{ReadLease, now_ms}; + +// ── now_ms ──────────────────────────────────────────────────────────────────── + +#[test] +fn test_now_ms_is_monotonically_nondecreasing() { + let a = now_ms(); + let b = now_ms(); + assert!(b >= a, "now_ms must never go backwards: a={a}, b={b}"); +} + +#[test] +fn test_now_ms_advances_over_time() { + let before = now_ms(); + thread::sleep(std::time::Duration::from_millis(5)); + let after = now_ms(); + assert!( + after > before, + "now_ms must advance over 5ms: before={before}, after={after}" + ); +} + +// ── new / default ───────────────────────────────────────────────────────────── + +#[test] +fn test_new_starts_invalid() { + let lease = ReadLease::new(); + // deadline=0 → always false regardless of term + assert!( + !lease.is_valid_for_leader(1, now_ms()), + "fresh ReadLease must be invalid (deadline=0)" + ); +} + +#[test] +fn test_new_is_invalid_for_any_term() { + let lease = ReadLease::new(); + assert!(!lease.is_valid_for_leader(1, now_ms())); + assert!(!lease.is_valid_for_leader(u16::MAX as u64, now_ms())); +} + +// ── renew ───────────────────────────────────────────────────────────────────── + +#[test] +fn test_renew_makes_lease_valid_for_matching_term() { + let lease = ReadLease::new(); + let deadline = now_ms() + 5_000; + lease.renew(1, deadline); + assert!(lease.is_valid_for_leader(1, now_ms())); +} + +#[test] +fn test_renew_invalid_for_leader_with_wrong_term() { + let lease = ReadLease::new(); + let deadline = now_ms() + 5_000; + lease.renew(42, deadline); + assert!(!lease.is_valid_for_leader(41, now_ms())); + assert!(!lease.is_valid_for_leader(43, now_ms())); +} + +#[test] +fn test_renew_with_past_deadline_is_invalid() { + let lease = ReadLease::new(); + let past = now_ms().saturating_sub(1_000); + lease.renew(1, past); + assert!(!lease.is_valid_for_leader(1, now_ms())); +} + +#[test] +fn test_renew_zero_deadline_is_invalid() { + let lease = ReadLease::new(); + lease.renew(1, 0); + assert!(!lease.is_valid_for_leader(1, now_ms())); +} + +// ── invalidate ──────────────────────────────────────────────────────────────── + +#[test] +fn test_invalidate_clears_valid_lease() { + let lease = ReadLease::new(); + lease.renew(1, now_ms() + 5_000); + assert!( + lease.is_valid_for_leader(1, now_ms()), + "pre-condition: lease must be valid" + ); + lease.invalidate(2); + assert!( + !lease.is_valid_for_leader(1, now_ms()), + "lease must be invalid after invalidate" + ); +} + +#[test] +fn test_invalidate_updates_term() { + let lease = ReadLease::new(); + lease.renew(1, now_ms() + 5_000); + lease.invalidate(2); + // deadline=0 after invalidate → false for any term + assert!(!lease.is_valid_for_leader(1, now_ms())); + assert!(!lease.is_valid_for_leader(2, now_ms())); +} + +#[test] +fn test_invalidate_on_fresh_lease_stays_invalid() { + let lease = ReadLease::new(); + lease.invalidate(5); + assert!(!lease.is_valid_for_leader(5, now_ms())); +} + +// ── renew → invalidate → renew cycle ───────────────────────────────────────── + +#[test] +fn test_renew_after_invalidate_makes_lease_valid_again() { + let lease = ReadLease::new(); + lease.renew(1, now_ms() + 5_000); + lease.invalidate(2); + assert!( + !lease.is_valid_for_leader(1, now_ms()), + "must be invalid after invalidate" + ); + lease.renew(3, now_ms() + 5_000); + assert!( + lease.is_valid_for_leader(3, now_ms()), + "must be valid after second renew" + ); + assert!( + !lease.is_valid_for_leader(1, now_ms()), + "old term must not match" + ); +} + +// ── term packing (16-bit truncation) ───────────────────────────────────────── + +#[test] +fn test_term_truncation_wraps_at_16_bits() { + let lease = ReadLease::new(); + let term_17bit: u64 = 0x1_0001; // bit 16 set — truncated to 0x0001 in 16-bit slot + lease.renew(term_17bit, now_ms() + 5_000); + // stored term = term_17bit & 0xFFFF = 1 + // both argument and stored value are masked to 16 bits, so 0x10001 → 1 on both sides + assert!( + lease.is_valid_for_leader(1, now_ms()), + "low 16 bits of 0x10001 == 1" + ); + assert!( + lease.is_valid_for_leader(term_17bit, now_ms()), + "0x10001 & 0xFFFF == 1 — same as passing 1" + ); + assert!( + !lease.is_valid_for_leader(2, now_ms()), + "term 2 must not match stored term 1" + ); +} + +// ── revoke ──────────────────────────────────────────────────────────────────── + +#[test] +fn test_revoke_clears_valid_lease() { + let lease = ReadLease::new(); + lease.renew(1, now_ms() + 5_000); + assert!( + lease.is_valid_for_leader(1, now_ms()), + "pre-condition: lease must be valid before revoke" + ); + lease.revoke(); + assert!( + !lease.is_valid_for_leader(1, now_ms()), + "lease must be invalid after revoke" + ); +} + +#[test] +fn test_revoke_on_fresh_lease_stays_invalid() { + let lease = ReadLease::new(); + lease.revoke(); + assert!(!lease.is_valid_for_leader(0, now_ms())); + assert!(!lease.is_valid_for_leader(1, now_ms())); +} + +#[test] +fn test_revoke_sets_packed_to_zero() { + let lease = ReadLease::new(); + lease.renew(42, now_ms() + 10_000); + lease.revoke(); + // After revoke, neither term=42 nor any other term should be valid. + assert!(!lease.is_valid_for_leader(42, now_ms())); + assert!(!lease.is_valid_for_leader(0, now_ms())); +} + +// ── is_valid ────────────────────────────────────────────────────────────────── + +#[test] +fn test_is_valid_returns_true_when_deadline_in_future() { + let lease = ReadLease::new(); + lease.renew(1, now_ms() + 5_000); + assert!( + lease.is_valid(now_ms()), + "is_valid must return true when deadline is in the future" + ); +} + +#[test] +fn test_is_valid_returns_false_when_deadline_in_past() { + let lease = ReadLease::new(); + let past = now_ms().saturating_sub(1_000); + lease.renew(1, past); + assert!( + !lease.is_valid(now_ms()), + "is_valid must return false when deadline is in the past" + ); +} + +#[test] +fn test_is_valid_returns_false_on_fresh_lease() { + let lease = ReadLease::new(); + assert!( + !lease.is_valid(now_ms()), + "fresh lease (deadline=0) must be invalid" + ); +} + +#[test] +fn test_is_valid_returns_false_after_revoke() { + let lease = ReadLease::new(); + lease.renew(1, now_ms() + 5_000); + lease.revoke(); + assert!( + !lease.is_valid(now_ms()), + "is_valid must return false after revoke" + ); +} + +#[test] +fn test_is_valid_ignores_term() { + // is_valid() only checks deadline, not term — any term works if deadline is in future + let lease = ReadLease::new(); + lease.renew(99, now_ms() + 5_000); + // is_valid does NOT require knowing the term + assert!( + lease.is_valid(now_ms()), + "is_valid must not care about term" + ); +} + +#[test] +fn test_is_valid_consistent_with_is_valid_for_leader() { + // When both term and deadline match, is_valid and is_valid_for_leader agree. + let lease = ReadLease::new(); + let deadline = now_ms() + 5_000; + lease.renew(7, deadline); + let now = now_ms(); + assert_eq!( + lease.is_valid(now), + lease.is_valid_for_leader(7, now), + "is_valid and is_valid_for_leader must agree when term matches" + ); +} + +// ── Arc sharing semantics ───────────────────────────────────────────────────── + +#[test] +fn test_arc_read_lease_visible_across_clones() { + let lease = Arc::new(ReadLease::new()); + let reader: Arc = Arc::clone(&lease); + + lease.renew(1, now_ms() + 5_000); + assert!( + reader.is_valid_for_leader(1, now_ms()), + "renew on original must be visible via clone" + ); + + lease.invalidate(2); + assert!( + !reader.is_valid_for_leader(1, now_ms()), + "invalidate on original must be visible via clone" + ); +} + +// ── concurrent safety (basic) ───────────────────────────────────────────────── + +#[test] +fn test_concurrent_renew_does_not_panic() { + let lease = Arc::new(ReadLease::new()); + let barrier = Arc::new(Barrier::new(4)); + let mut handles = Vec::new(); + + for term in 1u64..=3 { + let l: Arc = Arc::clone(&lease); + let b = Arc::clone(&barrier); + handles.push(thread::spawn(move || { + b.wait(); + let deadline = now_ms() + 5_000; + l.renew(term, deadline); + })); + } + // reader thread + { + let l: Arc = Arc::clone(&lease); + let b = Arc::clone(&barrier); + handles.push(thread::spawn(move || { + b.wait(); + let _ = l.is_valid_for_leader(1, now_ms()); + })); + } + for h in handles { + h.join().expect("thread panicked"); + } +} diff --git a/d-engine-core/src/read_actor.rs b/d-engine-core/src/read_actor.rs new file mode 100644 index 00000000..683c79fe --- /dev/null +++ b/d-engine-core/src/read_actor.rs @@ -0,0 +1,112 @@ +//! ReadActor — dedicated read task for Eventual and LeaseRead fast path. +//! +//! `run_read_actor` is the TiKV LocalReader equivalent: it owns `Arc` as sole +//! holder in the read path, checks `ReadLease` with a single atomic load, and serves +//! reads without entering the Raft loop. +//! +//! # Lifecycle guarantee +//! +//! The caller drops `read_tx` to signal shutdown. `run_read_actor` exits when +//! `read_rx` is drained and closed, at which point `Arc` is dropped and the +//! RocksDB LOCK is released — before `stop()` signals the Raft loop. + +use std::sync::Arc; + +use bytes::Bytes; +use tokio::sync::{mpsc, oneshot}; + +use crate::ReadLease; +use crate::StateMachine; +use crate::config::ReadConsistencyPolicy; +use crate::now_ms; + +/// A single read request sent from `EmbeddedClient` to the `ReadActor`. +/// +/// Only `EventualConsistency` and `LeaseRead` are valid here. +/// `LinearizableRead` must go through `cmd_tx` (Raft readIndex protocol). +pub struct ReadCmd { + pub key: Bytes, + pub consistency: ReadConsistencyPolicy, + pub reply: oneshot::Sender, ReadActorError>>, +} + +/// Error returned by the ReadActor to the caller. +/// +/// `LeaseInvalid` and `SmStopped` are recoverable: the caller should +/// fall back to `cmd_tx` for a Raft-backed read. +#[derive(Debug)] +pub enum ReadActorError { + /// Lease has been revoked or expired. Retry via cmd_tx. + LeaseInvalid, + /// State machine is not running (node is stopping). Retry via cmd_tx. + SmStopped, + /// SM returned an error. + SmError(String), +} + +/// Run the ReadActor loop until `read_rx` is closed. +/// +/// Designed to be spawned as an independent task: +/// ```ignore +/// let handle = tokio::spawn(run_read_actor(read_rx, lease, sm, max_drain)); +/// ``` +/// +/// `max_drain` caps how many commands are drained per wake-up (mirrors +/// `batching.max_batch_size` in the Raft loop). After the first `recv().await` +/// unblocks, the actor drains up to `max_drain` pending commands with +/// `try_recv()` before yielding back to the executor — amortizing the +/// task-switch cost across batches of requests. +/// +/// When the caller drops `read_tx`, the loop exits and `Arc` is released. +pub async fn run_read_actor( + mut read_rx: mpsc::Receiver, + lease: Arc, + sm: Arc, + max_drain: usize, +) where + SM: StateMachine, +{ + while let Some(cmd) = read_rx.recv().await { + // Process the command that woke us up. + let reply = serve_read(&cmd, &lease, &sm); + let _ = cmd.reply.send(reply); + + // Drain commands that arrived while processing, without going back to + // sleep — same pattern as Raft::drain_client_cmds(). + let mut count = 1; + while count < max_drain { + match read_rx.try_recv() { + Ok(cmd) => { + let reply = serve_read(&cmd, &lease, &sm); + let _ = cmd.reply.send(reply); + count += 1; + } + Err(_) => break, + } + } + } + // read_rx closed → sm drops here if this is the last Arc reference +} + +fn serve_read( + cmd: &ReadCmd, + lease: &Arc, + sm: &Arc, +) -> Result, ReadActorError> { + match cmd.consistency { + ReadConsistencyPolicy::EventualConsistency => { + if !sm.is_running() { + return Err(ReadActorError::SmStopped); + } + } + ReadConsistencyPolicy::LeaseRead => { + if !lease.is_valid(now_ms()) || !sm.is_running() { + return Err(ReadActorError::LeaseInvalid); + } + } + // LinearizableRead must not reach ReadActor — guard defensively + _ => return Err(ReadActorError::LeaseInvalid), + } + + sm.get(cmd.key.as_ref()).map_err(|e| ReadActorError::SmError(e.to_string())) +} diff --git a/d-engine-core/src/read_actor_test.rs b/d-engine-core/src/read_actor_test.rs new file mode 100644 index 00000000..f663e7a1 --- /dev/null +++ b/d-engine-core/src/read_actor_test.rs @@ -0,0 +1,240 @@ +use std::sync::Arc; + +use bytes::Bytes; +use tokio::sync::{mpsc, oneshot}; + +use crate::MockStateMachine; +use crate::ReadLease; +use crate::config::ReadConsistencyPolicy; +use crate::now_ms; +use crate::read_actor::{ReadActorError, ReadCmd, run_read_actor}; + +fn make_sm_running() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm +} + +fn make_sm_stopped() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| false); + sm +} + +fn valid_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.renew(1, now_ms() + 60_000); + lease +} + +fn revoked_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.revoke(); + lease +} + +fn send_read( + tx: &mpsc::Sender, + key: &[u8], + consistency: ReadConsistencyPolicy, +) -> oneshot::Receiver, ReadActorError>> { + let (reply_tx, reply_rx) = oneshot::channel(); + tx.try_send(ReadCmd { + key: Bytes::copy_from_slice(key), + consistency, + reply: reply_tx, + }) + .expect("channel should have capacity"); + reply_rx +} + +/// Eventual read succeeds when SM is running and key exists +#[tokio::test] +async fn test_read_actor_eventual_read_returns_value() { + let mut sm = make_sm_running(); + sm.expect_get() + .withf(|k| k == b"k1") + .returning(|_| Ok(Some(Bytes::from_static(b"v1")))); + + let lease = valid_lease(); + let (tx, rx) = mpsc::channel(8); + + let handle = tokio::spawn(run_read_actor(rx, lease, Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k1", ReadConsistencyPolicy::EventualConsistency); + drop(tx); + + let result = reply_rx.await.expect("reply sent"); + assert_eq!(result.unwrap(), Some(Bytes::from_static(b"v1"))); + handle.await.unwrap(); +} + +/// Eventual read returns None for missing key +#[tokio::test] +async fn test_read_actor_eventual_read_missing_key_returns_none() { + let mut sm = make_sm_running(); + sm.expect_get().returning(|_| Ok(None)); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"missing", ReadConsistencyPolicy::EventualConsistency); + drop(tx); + + assert!(reply_rx.await.unwrap().unwrap().is_none()); + handle.await.unwrap(); +} + +/// Eventual read fails when SM is stopped +#[tokio::test] +async fn test_read_actor_eventual_sm_stopped_returns_error() { + let sm = make_sm_stopped(); + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::EventualConsistency); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::SmStopped)); + handle.await.unwrap(); +} + +/// LeaseRead succeeds when lease is valid and SM is running +#[tokio::test] +async fn test_read_actor_lease_read_valid_lease_returns_value() { + let mut sm = make_sm_running(); + sm.expect_get().returning(|_| Ok(Some(Bytes::from_static(b"val")))); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LeaseRead); + drop(tx); + + assert!(reply_rx.await.unwrap().is_ok()); + handle.await.unwrap(); +} + +/// LeaseRead returns LeaseInvalid when lease is revoked +#[tokio::test] +async fn test_read_actor_lease_revoked_returns_lease_invalid() { + let sm = make_sm_running(); + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, revoked_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LeaseRead); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::LeaseInvalid)); + handle.await.unwrap(); +} + +/// LeaseRead returns LeaseInvalid when lease has expired (deadline in the past) +#[tokio::test] +async fn test_read_actor_lease_expired_returns_lease_invalid() { + let sm = make_sm_running(); + let lease = Arc::new(ReadLease::new()); + lease.renew(1, now_ms().saturating_sub(1)); // deadline already past + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, lease, Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LeaseRead); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::LeaseInvalid)); + handle.await.unwrap(); +} + +/// LeaseRead returns LeaseInvalid when SM is stopped (even if lease is valid) +#[tokio::test] +async fn test_read_actor_lease_valid_but_sm_stopped_returns_error() { + let sm = make_sm_stopped(); + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LeaseRead); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::LeaseInvalid)); + handle.await.unwrap(); +} + +/// ReadActor exits cleanly when all senders are dropped (lifecycle guarantee) +#[tokio::test] +async fn test_read_actor_exits_when_channel_closed() { + let sm = make_sm_running(); + let sm_arc = Arc::new(sm); + let sm_weak = Arc::downgrade(&sm_arc); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), sm_arc, 64)); + + drop(tx); // close sender → ReadActor loop exits + + handle.await.unwrap(); + + // After ReadActor exits, Arc count should be 0 (sole owner was ReadActor) + assert!( + sm_weak.upgrade().is_none(), + "Arc should be dropped when ReadActor exits" + ); +} + +/// sm.get() returning Err maps to ReadActorError::SmError (not swallowed) +#[tokio::test] +async fn test_read_actor_sm_get_error_returns_sm_error() { + let mut sm = make_sm_running(); + sm.expect_get().returning(|_| Err(crate::Error::Fatal("disk failure".into()))); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::EventualConsistency); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::SmError(_))); + handle.await.unwrap(); +} + +/// LinearizableRead must never reach ReadActor — defensive guard returns LeaseInvalid. +/// If get() were called, mockall would panic (no expectation set) — implicit safety net. +#[tokio::test] +async fn test_read_actor_linearizable_read_returns_lease_invalid() { + let sm = make_sm_running(); // no expect_get() — any get() call panics + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LinearizableRead); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::LeaseInvalid)); + handle.await.unwrap(); +} + +/// revoke() immediately invalidates an in-flight lease +#[tokio::test] +async fn test_read_actor_revoke_invalidates_in_flight_reads() { + let sm = make_sm_running(); + let lease = valid_lease(); + let lease_clone = Arc::clone(&lease); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, lease, Arc::new(sm), 64)); + + lease_clone.revoke(); // revoke before read is processed + + let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LeaseRead); + drop(tx); + + let err = reply_rx.await.unwrap().unwrap_err(); + assert!(matches!(err, ReadActorError::LeaseInvalid)); + handle.await.unwrap(); +} diff --git a/d-engine-server/benches/lease_performance.rs b/d-engine-server/benches/lease_performance.rs index fac06eac..bc07b70a 100644 --- a/d-engine-server/benches/lease_performance.rs +++ b/d-engine-server/benches/lease_performance.rs @@ -19,8 +19,8 @@ use criterion::black_box; use criterion::criterion_group; use criterion::criterion_main; use d_engine_core::{ApplyEntry, Command, StateMachine}; -use d_engine_server::storage::DefaultLease; use d_engine_server::storage::FileStateMachine; +use d_engine_server::storage::TtlLease; use tempfile::TempDir; /// Create FileStateMachine with Background strategy (lease enabled) @@ -35,7 +35,7 @@ async fn create_sm_background() -> (FileStateMachine, TempDir) { .await .expect("Failed to create state machine"); - let lease = Arc::new(DefaultLease::new(lease_config)); + let lease = Arc::new(TtlLease::new(lease_config)); sm.set_lease(lease); (sm, temp_dir) diff --git a/d-engine-server/benches/state_machine.rs b/d-engine-server/benches/state_machine.rs index f5836212..87d8a80c 100644 --- a/d-engine-server/benches/state_machine.rs +++ b/d-engine-server/benches/state_machine.rs @@ -40,7 +40,7 @@ async fn create_test_state_machine() -> (FileStateMachine, TempDir) { cleanup_interval_ms: 1000, max_cleanup_duration_ms: 1, }; - let lease = Arc::new(d_engine_server::storage::DefaultLease::new(lease_config)); + let lease = Arc::new(d_engine_server::storage::TtlLease::new(lease_config)); sm.set_lease(lease); (sm, temp_dir) diff --git a/d-engine-server/benches/ttl.rs b/d-engine-server/benches/ttl.rs index c01f9130..87a7ccdf 100644 --- a/d-engine-server/benches/ttl.rs +++ b/d-engine-server/benches/ttl.rs @@ -23,7 +23,7 @@ use tempfile::TempDir; /// Helper to create a temporary state machine for benchmarking async fn create_test_state_machine() -> (FileStateMachine, TempDir) { - use d_engine_server::storage::DefaultLease; + use d_engine_server::storage::TtlLease; let temp_dir = TempDir::new().expect("Failed to create temp dir"); // For TTL benchmarks, we need lease enabled @@ -37,7 +37,7 @@ async fn create_test_state_machine() -> (FileStateMachine, TempDir) { .expect("Failed to create state machine"); // Manually inject lease for benchmarking - let lease = std::sync::Arc::new(DefaultLease::new(lease_config)); + let lease = std::sync::Arc::new(TtlLease::new(lease_config)); sm.set_lease(lease); sm.load_lease_data().await.expect("Failed to load lease data"); @@ -80,7 +80,7 @@ fn create_noop_entry(index: u64) -> ApplyEntry { /// Target: < 1ms for typical workload (100 expired keys) /// This directly benchmarks lease.on_apply() to isolate cleanup overhead fn bench_piggyback_cleanup(c: &mut Criterion) { - use d_engine_server::storage::DefaultLease; + use d_engine_server::storage::TtlLease; let mut group = c.benchmark_group("piggyback_cleanup"); @@ -90,7 +90,7 @@ fn bench_piggyback_cleanup(c: &mut Criterion) { cleanup_interval_ms: 1000, max_cleanup_duration_ms: 1, }; - let lease = DefaultLease::new(lease_config); + let lease = TtlLease::new(lease_config); // Register keys with very short TTL for i in 0..*expired_count { @@ -121,13 +121,13 @@ fn bench_piggyback_cleanup(c: &mut Criterion) { /// Measures the cost of registering a TTL entry in the TTL manager /// Target: < 100ns per registration fn bench_ttl_registration(c: &mut Criterion) { - use d_engine_server::storage::DefaultLease; + use d_engine_server::storage::TtlLease; let lease_config = d_engine_core::config::LeaseConfig { cleanup_interval_ms: 1000, max_cleanup_duration_ms: 1, }; - let lease = DefaultLease::new(lease_config); + let lease = TtlLease::new(lease_config); c.bench_function("ttl_registration", |b| { let mut counter = 0u64; diff --git a/d-engine-server/benches/watch_overhead.rs b/d-engine-server/benches/watch_overhead.rs index b9fa7a59..ca69b4cc 100644 --- a/d-engine-server/benches/watch_overhead.rs +++ b/d-engine-server/benches/watch_overhead.rs @@ -22,7 +22,7 @@ use criterion::criterion_group; use criterion::criterion_main; use d_engine_core::{ApplyEntry, Command, StateMachine}; use d_engine_server::RocksDBUnifiedEngine; -use d_engine_server::api::EmbeddedEngine; +use d_engine_server::api::DefaultEmbeddedEngine; use tempfile::TempDir; use tokio::time::sleep; @@ -71,7 +71,8 @@ fn create_test_entries( } /// Create a temporary EmbeddedEngine for benchmarking -async fn create_embedded_engine() -> Result<(EmbeddedEngine, TempDir), Box> { +async fn create_embedded_engine() +-> Result<(DefaultEmbeddedEngine, TempDir), Box> { let temp_dir = TempDir::new()?; let db_path = temp_dir.path().join("db"); @@ -101,9 +102,12 @@ watcher_buffer_size = 100 let storage = Arc::new(storage); let state_machine = Arc::new(state_machine); - let engine = - EmbeddedEngine::start_custom(storage, state_machine, Some(config_path.to_str().unwrap())) - .await?; + let engine = DefaultEmbeddedEngine::start_custom( + storage, + state_machine, + Some(config_path.to_str().unwrap()), + ) + .await?; // Wait for ready engine.wait_ready(Duration::from_secs(5)).await?; diff --git a/d-engine-server/src/api/embedded.rs b/d-engine-server/src/api/embedded.rs index 2599d439..9f48c9cb 100644 --- a/d-engine-server/src/api/embedded.rs +++ b/d-engine-server/src/api/embedded.rs @@ -122,6 +122,7 @@ //! //! For auto-forwarding with gRPC overhead, use standalone mode with `GrpcClient`. +use super::embedded_client::EmbeddedClient; use crate::Result; #[cfg(feature = "rocksdb")] use crate::RocksDBStateMachine; @@ -131,24 +132,31 @@ use crate::RocksDBStorageEngine; use crate::RocksDBUnifiedEngine; use crate::StateMachine; use crate::StorageEngine; -use crate::api::EmbeddedClient; use crate::node::NodeBuilder; +use crate::node::RaftTypeConfig; +use d_engine_core::TypeConfig; +use d_engine_core::read_actor::run_read_actor; +use std::fmt::Debug; use std::sync::Arc; use std::time::Duration; use tokio::sync::Mutex; +use tokio::sync::mpsc; use tokio::sync::watch; use tokio::task::JoinHandle; use tracing::error; use tracing::info; -struct Inner { +struct Inner { node_handle: Mutex>>>, shutdown_tx: watch::Sender<()>, - client: Arc, + client: Arc>, leader_elected_rx: watch::Receiver>, membership_rx: watch::Receiver, is_stopped: Mutex, node_id: u32, + /// ReadActor task handle. Aborted during stop() before the Raft node shuts down, + /// ensuring Arc (and the RocksDB LOCK) is released before stop() returns. + read_actor_handle: Mutex>>, } /// Embedded d-engine with automatic lifecycle management. @@ -175,12 +183,22 @@ struct Inner { /// /// engine.stop().await?; /// ``` -#[derive(Clone)] -pub struct EmbeddedEngine { - inner: Arc, +pub struct EmbeddedEngine { + inner: Arc>, } -impl EmbeddedEngine { +impl Clone for EmbeddedEngine { + fn clone(&self) -> Self { + Self { + inner: Arc::clone(&self.inner), + } + } +} + +// ─── RocksDB default start ─────────────────────────────────────────────────── + +#[cfg(feature = "rocksdb")] +impl EmbeddedEngine> { /// Start engine with an explicit data directory. /// /// `data_dir` has highest priority and always overrides `cluster.db_root_dir` from @@ -199,7 +217,6 @@ impl EmbeddedEngine { /// // Works with any AsRef /// let engine = EmbeddedEngine::start(std::path::Path::new("/var/lib/my-app")).await?; /// ``` - #[cfg(feature = "rocksdb")] pub async fn start(data_dir: impl AsRef) -> Result { let mut config = d_engine_core::RaftNodeConfig::new()?; config.cluster.db_root_dir = data_dir.as_ref().to_path_buf(); @@ -227,7 +244,7 @@ impl EmbeddedEngine { (storage, sm) }; - let lease = Arc::new(crate::storage::DefaultLease::new( + let lease = Arc::new(crate::storage::TtlLease::new( config.raft.state_machine.lease.clone(), )); sm.set_lease(lease); @@ -248,7 +265,6 @@ impl EmbeddedEngine { /// let engine = EmbeddedEngine::start_with("config/node1.toml").await?; /// engine.wait_ready(Duration::from_secs(5)).await?; /// ``` - #[cfg(feature = "rocksdb")] pub async fn start_with(config_path: &str) -> Result { let config = d_engine_core::RaftNodeConfig::new()? .with_override_config(config_path)? @@ -276,14 +292,22 @@ impl EmbeddedEngine { (storage, sm) }; - let lease = Arc::new(crate::storage::DefaultLease::new( + let lease = Arc::new(crate::storage::TtlLease::new( config.raft.state_machine.lease.clone(), )); sm.set_lease(lease); Self::start_custom(Arc::new(storage), Arc::new(sm), Some(config_path)).await } +} +// ─── Custom SE/SM: start_custom + start_node ───────────────────────────────── + +impl EmbeddedEngine> +where + SE: StorageEngine + Debug + 'static, + SM: StateMachine + Debug + 'static, +{ /// Start engine with custom storage and state machine. /// /// Advanced API for users providing custom storage implementations. @@ -299,15 +323,11 @@ impl EmbeddedEngine { /// let sm = Arc::new(MyCustomStateMachine::new()?); /// let engine = EmbeddedEngine::start_custom(storage, sm, None).await?; /// ``` - pub async fn start_custom( + pub async fn start_custom( storage_engine: Arc, state_machine: Arc, config_path: Option<&str>, - ) -> Result - where - SE: StorageEngine + std::fmt::Debug + 'static, - SM: StateMachine + std::fmt::Debug + 'static, - { + ) -> Result { let node_config = if let Some(path) = config_path { d_engine_core::RaftNodeConfig::default() .with_override_config(path)? @@ -320,49 +340,55 @@ impl EmbeddedEngine { } /// Build and launch the node from a validated config and pre-built storage. - async fn start_node( + async fn start_node( node_config: d_engine_core::RaftNodeConfig, storage_engine: Arc, state_machine: Arc, - ) -> Result - where - SE: StorageEngine + std::fmt::Debug + 'static, - SM: StateMachine + std::fmt::Debug + 'static, - { + ) -> Result { info!("Starting embedded d-engine"); + d_engine_core::init_clock(); let (shutdown_tx, shutdown_rx) = watch::channel(()); let node = NodeBuilder::init(node_config, shutdown_rx) .storage_engine(storage_engine) - .state_machine(state_machine) + .state_machine(state_machine.clone()) .start() .await?; let leader_elected_rx = node.leader_change_notifier(); let membership_rx = node.membership_change_notifier(); - - #[cfg(not(feature = "watch"))] - let client = Arc::new(EmbeddedClient::new_internal( - node.event_tx.clone(), - node.cmd_tx.clone(), - node.node_id, - Duration::from_millis(node.node_config.raft.general_raft_timeout_duration_in_ms), + let read_lease = node.read_lease(); + + // Start ReadActor: sole owner of Arc on the read path. + let (read_tx, read_rx) = mpsc::channel(node.node_config.raft.read_actor.channel_capacity); + let max_drain = node.node_config.raft.read_actor.max_drain; + let read_actor_handle = tokio::spawn(run_read_actor( + read_rx, + read_lease, + state_machine, + max_drain, )); - #[cfg(feature = "watch")] let client = { - let watch_registry = node.watch_registry.clone(); - let mut client = EmbeddedClient::new_internal( + let base = EmbeddedClient::new_internal( node.event_tx.clone(), node.cmd_tx.clone(), node.node_id, Duration::from_millis(node.node_config.raft.general_raft_timeout_duration_in_ms), - ); - if let Some(registry) = &watch_registry { - client = client.with_watch_registry(registry.clone()); - } - Arc::new(client) + ) + .with_read_actor(read_tx); + + #[cfg(feature = "watch")] + let base = { + let mut c = base; + if let Some(registry) = &node.watch_registry { + c = c.with_watch_registry(registry.clone()); + } + c + }; + + Arc::new(base) }; let node_id = node.node_id(); @@ -387,10 +413,15 @@ impl EmbeddedEngine { membership_rx, is_stopped: Mutex::new(false), node_id, + read_actor_handle: Mutex::new(Some(read_actor_handle)), }), }) } +} + +// ─── General API (all TypeConfig) ──────────────────────────────────────────── +impl EmbeddedEngine { /// Wait until the cluster is ready to serve requests. /// /// Blocks until a leader has been elected **and** its no-op entry is committed @@ -590,7 +621,7 @@ impl EmbeddedEngine { /// let client = engine.client(); /// client.put(b"key", b"value").await?; /// ``` - pub fn client(&self) -> Arc { + pub fn client(&self) -> Arc> { Arc::clone(&self.inner.client) } @@ -619,7 +650,17 @@ impl EmbeddedEngine { info!("Stopping embedded d-engine"); - // Send shutdown signal + // Abort ReadActor first so Arc drops and RocksDB LOCK is released + // before the Raft node exits. Any in-flight reads will get a channel-closed + // error, which is acceptable during shutdown. + let mut ra_handle = self.inner.read_actor_handle.lock().await; + if let Some(handle) = ra_handle.take() { + handle.abort(); + let _ = handle.await; // expect JoinError::Cancelled + } + drop(ra_handle); + + // Send shutdown signal to Raft node let _ = self.inner.shutdown_tx.send(()); // Wait for node task to complete @@ -661,7 +702,7 @@ impl EmbeddedEngine { } } -impl Drop for EmbeddedEngine { +impl Drop for EmbeddedEngine { fn drop(&mut self) { // Warn if stop() was not called if let Ok(handle) = self.inner.node_handle.try_lock() diff --git a/d-engine-server/src/api/embedded_client.rs b/d-engine-server/src/api/embedded_client.rs index c00ac7e9..0c5ff671 100644 --- a/d-engine-server/src/api/embedded_client.rs +++ b/d-engine-server/src/api/embedded_client.rs @@ -15,22 +15,25 @@ //! client.put(b"key", b"value").await?; //! ``` -use std::time::Duration; - +use std::marker::PhantomData; #[cfg(feature = "watch")] use std::sync::Arc; +use std::time::Duration; use bytes::Bytes; use d_engine_core::MaybeCloneOneshot; use d_engine_core::RaftEvent; use d_engine_core::RaftOneshot; use d_engine_core::ScanResult; +use d_engine_core::TypeConfig; use d_engine_core::client::{ ClientApi, ClientApiError, ClientApiResult, ClientReadRequest, ClientResponsePayload, ClientWriteRequest, ErrorCode, LeaderHint, ReadResults, WriteOperation, }; use d_engine_core::config::ReadConsistencyPolicy; +use d_engine_core::read_actor::{ReadActorError, ReadCmd}; use tokio::sync::mpsc; +use tokio::sync::oneshot; #[cfg(feature = "watch")] use d_engine_core::watch::WatchRegistry; @@ -92,6 +95,24 @@ fn server_error(msg: String) -> ClientApiError { } } +fn map_error_response( + error: ErrorCode, + leader_hint: Option, + retry_after_ms: Option, +) -> ClientApiError { + match error { + ErrorCode::NotLeader => { + let (leader_id, leader_address) = if let Some(hint) = leader_hint { + (Some(hint.leader_id.to_string()), Some(hint.address)) + } else { + (None, None) + }; + not_leader_error(leader_id, leader_address, retry_after_ms) + } + _ => server_error(format!("Error code: {error:?}")), + } +} + /// Unwrap a `ClientResponsePayload` as a `ReadResults`, returning a /// `Protocol { InvalidResponse }` error for any other variant. /// @@ -116,18 +137,39 @@ fn extract_read_payload(result: Option) -> ClientApiResul /// Zero-overhead KV client for embedded mode. Obtained via `EmbeddedEngine::client()`. /// +/// `T` is the [`TypeConfig`] that carries the concrete `StateMachine` type, enabling +/// direct monomorphized calls to `T::SM::get()` on the fast path — no vtable dispatch. +/// /// For standalone/gRPC mode use `GrpcClient` instead. Both implement `ClientApi`. -#[derive(Clone)] -pub struct EmbeddedClient { +pub struct EmbeddedClient { event_tx: mpsc::Sender, cmd_tx: mpsc::Sender, client_id: u32, timeout: Duration, + /// ReadActor sender for `EventualConsistency` and `LeaseRead` fast path. + /// `None` if fast path is unavailable (e.g. during shutdown). + read_tx: Option>, #[cfg(feature = "watch")] watch_registry: Option>, + _phantom: PhantomData T>, } -impl EmbeddedClient { +impl Clone for EmbeddedClient { + fn clone(&self) -> Self { + Self { + event_tx: self.event_tx.clone(), + cmd_tx: self.cmd_tx.clone(), + client_id: self.client_id, + timeout: self.timeout, + read_tx: self.read_tx.clone(), + #[cfg(feature = "watch")] + watch_registry: self.watch_registry.clone(), + _phantom: PhantomData, + } + } +} + +impl EmbeddedClient { /// Internal constructor (used by EmbeddedEngine) pub(crate) fn new_internal( event_tx: mpsc::Sender, @@ -140,11 +182,22 @@ impl EmbeddedClient { cmd_tx, client_id, timeout, + read_tx: None, #[cfg(feature = "watch")] watch_registry: None, + _phantom: PhantomData, } } + /// Wire the ReadActor sender into the client. Called by EmbeddedEngine after node start. + pub(crate) fn with_read_actor( + mut self, + read_tx: mpsc::Sender, + ) -> Self { + self.read_tx = Some(read_tx); + self + } + /// Set watch registry for watch operations #[cfg(feature = "watch")] pub(crate) fn with_watch_registry( @@ -155,24 +208,6 @@ impl EmbeddedClient { self } - fn map_error_response( - error: ErrorCode, - leader_hint: Option, - retry_after_ms: Option, - ) -> ClientApiError { - match error { - ErrorCode::NotLeader => { - let (leader_id, leader_address) = if let Some(hint) = leader_hint { - (Some(hint.leader_id.to_string()), Some(hint.address)) - } else { - (None, None) - }; - not_leader_error(leader_id, leader_address, retry_after_ms) - } - _ => server_error(format!("Error code: {error:?}")), - } - } - /// Store a key-value pair with strong consistency. /// /// # Errors @@ -208,7 +243,7 @@ impl EmbeddedClient { result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; if response.error != ErrorCode::Success { - return Err(Self::map_error_response( + return Err(map_error_response( response.error, response.leader_hint, response.retry_after_ms, @@ -291,6 +326,36 @@ impl EmbeddedClient { key: impl AsRef<[u8]>, consistency: ReadConsistencyPolicy, ) -> ClientApiResult> { + // Fast path: EventualConsistency and LeaseRead bypass cmd_tx via ReadActor. + if let Some(read_tx) = &self.read_tx { + let fast_path = matches!( + consistency, + ReadConsistencyPolicy::EventualConsistency | ReadConsistencyPolicy::LeaseRead + ); + if fast_path { + let (reply_tx, reply_rx) = oneshot::channel(); + if read_tx + .send(ReadCmd { + key: Bytes::copy_from_slice(key.as_ref()), + consistency: consistency.clone(), + reply: reply_tx, + }) + .await + .is_ok() + { + match reply_rx.await { + Ok(Ok(value)) => return Ok(value), + Ok(Err(ReadActorError::SmError(e))) => return Err(server_error(e)), + // LeaseInvalid / SmStopped → fall through to cmd_tx + Ok(Err(ReadActorError::LeaseInvalid | ReadActorError::SmStopped)) => {} + // ReadActor exited without replying (engine stopping) → fall through + Err(_) => {} + } + } + // Channel closed (engine stopping) → fall through to cmd_tx + } + } + let request = ClientReadRequest { client_id: self.client_id, keys: vec![Bytes::copy_from_slice(key.as_ref())], @@ -313,7 +378,7 @@ impl EmbeddedClient { result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; if response.error != ErrorCode::Success { - return Err(Self::map_error_response( + return Err(map_error_response( response.error, response.leader_hint, response.retry_after_ms, @@ -386,7 +451,7 @@ impl EmbeddedClient { result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; if response.error != ErrorCode::Success { - return Err(Self::map_error_response( + return Err(map_error_response( response.error, response.leader_hint, response.retry_after_ms, @@ -434,7 +499,7 @@ impl EmbeddedClient { result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; if response.error != ErrorCode::Success { - return Err(Self::map_error_response( + return Err(map_error_response( response.error, response.leader_hint, response.retry_after_ms, @@ -674,7 +739,7 @@ impl EmbeddedClient { } } -impl std::fmt::Debug for EmbeddedClient { +impl std::fmt::Debug for EmbeddedClient { fn fmt( &self, f: &mut std::fmt::Formatter<'_>, @@ -688,7 +753,7 @@ impl std::fmt::Debug for EmbeddedClient { // Implement ClientApi trait #[async_trait::async_trait] -impl ClientApi for EmbeddedClient { +impl ClientApi for EmbeddedClient { async fn put( &self, key: impl AsRef<[u8]> + Send, @@ -728,7 +793,7 @@ impl ClientApi for EmbeddedClient { result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; if response.error != ErrorCode::Success { - return Err(Self::map_error_response( + return Err(map_error_response( response.error, response.leader_hint, response.retry_after_ms, @@ -790,7 +855,7 @@ impl ClientApi for EmbeddedClient { result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; if response.error != ErrorCode::Success { - return Err(Self::map_error_response( + return Err(map_error_response( response.error, response.leader_hint, response.retry_after_ms, @@ -907,7 +972,7 @@ mod error_helper_tests { #[test] fn test_map_error_response_not_leader_forwards_retry_after_ms() { - let err = EmbeddedClient::map_error_response( + let err = map_error_response( ErrorCode::NotLeader, Some(LeaderHint { leader_id: 2, @@ -933,7 +998,7 @@ mod error_helper_tests { #[test] fn test_map_error_response_not_leader_falls_back_to_100ms_when_none() { - let err = EmbeddedClient::map_error_response(ErrorCode::NotLeader, None, None); + let err = map_error_response(ErrorCode::NotLeader, None, None); match err { ClientApiError::Network { retry_after_ms, .. } => { assert_eq!(retry_after_ms, Some(100)); diff --git a/d-engine-server/src/api/embedded_client_fast_path_test.rs b/d-engine-server/src/api/embedded_client_fast_path_test.rs new file mode 100644 index 00000000..f86767c3 --- /dev/null +++ b/d-engine-server/src/api/embedded_client_fast_path_test.rs @@ -0,0 +1,293 @@ +/// Fast-path tests for EmbeddedClient via ReadActor. +/// +/// These tests verify that EventualConsistency and LeaseRead requests are +/// routed to the ReadActor (bypassing cmd_tx), and fall back to cmd_tx when +/// the ReadActor returns LeaseInvalid, SmStopped, or its channel is closed. +/// +/// Proof technique: cmd_rx is dropped so any fallback to cmd_tx returns a +/// channel-closed error — success proves the fast path was taken; error proves +/// the fallback triggered. +#[cfg(test)] +mod fast_path_tests { + use std::sync::Arc; + use std::time::Duration; + + use bytes::Bytes; + use d_engine_core::MockTypeConfig; + use d_engine_core::config::ReadConsistencyPolicy; + use d_engine_core::read_actor::run_read_actor; + use d_engine_core::{MockStateMachine, ReadLease, now_ms}; + use tokio::sync::mpsc; + use tokio::task::JoinHandle; + + use super::super::embedded_client::EmbeddedClient; + + // ── Helpers ─────────────────────────────────────────────────────────────── + + fn make_event_tx() -> mpsc::Sender { + let (tx, _rx) = mpsc::channel(1); + tx + } + + /// Builds a client wired to a live ReadActor. + /// + /// `drop_cmd_rx=true` closes the receiving end — any fallback to cmd_tx + /// will fail with a channel-closed error, proving the fast path was NOT taken. + async fn client_with_read_actor( + sm: MockStateMachine, + lease: Arc, + drop_cmd_rx: bool, + ) -> (EmbeddedClient, JoinHandle<()>) { + let (read_tx, read_rx) = mpsc::channel(8); + let (cmd_tx, cmd_rx) = mpsc::channel(1); + if drop_cmd_rx { + drop(cmd_rx); + } + + let ra_handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); + let client = + EmbeddedClient::new_internal(make_event_tx(), cmd_tx, 1, Duration::from_millis(100)) + .with_read_actor(read_tx); + (client, ra_handle) + } + + fn valid_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.renew(1, now_ms() + 60_000); + lease + } + + fn revoked_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.revoke(); + lease + } + + fn expired_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.renew(1, now_ms().saturating_sub(1)); + lease + } + + fn sm_running_with_value(value: Bytes) -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get().returning(move |_| Ok(Some(value.clone()))); + sm + } + + fn sm_running_missing_key() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get().returning(|_| Ok(None)); + sm + } + + fn sm_stopped() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| false); + sm + } + + // ── LeaseRead fast path ─────────────────────────────────────────────────── + + /// LeaseRead with valid lease and running SM → ReadActor returns value. + /// cmd_tx is closed: success proves the fast path was taken. + #[tokio::test] + async fn test_get_lease_bypasses_cmd_tx_when_lease_valid() { + let sm = sm_running_with_value(Bytes::from("fast_value")); + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + + let result = client.get_with_consistency(b"key1", ReadConsistencyPolicy::LeaseRead).await; + assert_eq!(result.unwrap(), Some(Bytes::from("fast_value"))); + + drop(client); // drop read_tx so ReadActor exits + handle.await.unwrap(); + } + + /// LeaseRead with valid lease and missing key → ReadActor returns None. + #[tokio::test] + async fn test_get_lease_returns_none_for_missing_key() { + let sm = sm_running_missing_key(); + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + + let result = + client.get_with_consistency(b"missing", ReadConsistencyPolicy::LeaseRead).await; + assert_eq!(result.unwrap(), None); + + drop(client); + handle.await.unwrap(); + } + + /// LeaseRead with revoked lease → ReadActor returns LeaseInvalid → fallback to cmd_tx. + /// cmd_tx closed → error proves fallback was triggered. + #[tokio::test] + async fn test_get_lease_fallback_when_lease_revoked() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + // get() must not be called — ReadActor short-circuits on LeaseInvalid + sm.expect_get().never(); + + let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; + let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; + assert!(result.is_err(), "revoked lease must fall back to cmd_tx"); + + drop(client); + handle.await.unwrap(); + } + + /// LeaseRead with expired deadline → ReadActor returns LeaseInvalid → fallback. + #[tokio::test] + async fn test_get_lease_fallback_when_lease_expired() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get().never(); + + let (client, handle) = client_with_read_actor(sm, expired_lease(), true).await; + let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; + assert!(result.is_err(), "expired lease must fall back to cmd_tx"); + + drop(client); + handle.await.unwrap(); + } + + /// LeaseRead with SM stopped → ReadActor returns LeaseInvalid → fallback. + #[tokio::test] + async fn test_get_lease_fallback_when_sm_not_running() { + let sm = sm_stopped(); + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; + assert!(result.is_err(), "non-running SM must fall back to cmd_tx"); + + drop(client); + handle.await.unwrap(); + } + + // ── EventualConsistency fast path ───────────────────────────────────────── + + /// EventualConsistency with running SM → fast path via ReadActor. + /// Lease is irrelevant for Eventual reads. + #[tokio::test] + async fn test_get_eventual_bypasses_cmd_tx_when_sm_running() { + let sm = sm_running_with_value(Bytes::from("stale_but_fast")); + // Eventual does not check lease — use a revoked/empty lease to confirm + let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; + + let result = client + .get_with_consistency(b"key1", ReadConsistencyPolicy::EventualConsistency) + .await; + assert_eq!(result.unwrap(), Some(Bytes::from("stale_but_fast"))); + + drop(client); + handle.await.unwrap(); + } + + /// EventualConsistency with SM stopped → ReadActor returns SmStopped → fallback. + #[tokio::test] + async fn test_get_eventual_fallback_when_sm_not_running() { + let sm = sm_stopped(); + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + let result = client + .get_with_consistency(b"k", ReadConsistencyPolicy::EventualConsistency) + .await; + assert!(result.is_err(), "non-running SM must fall back to cmd_tx"); + + drop(client); + handle.await.unwrap(); + } + + // ── No fast path without read_tx ────────────────────────────────────────── + + /// Client without with_read_actor() always routes through cmd_tx. + #[tokio::test] + async fn test_no_fast_path_without_with_read_actor_call() { + let (cmd_tx, cmd_rx) = mpsc::channel(1); + drop(cmd_rx); + let client: EmbeddedClient = + EmbeddedClient::new_internal(make_event_tx(), cmd_tx, 1, Duration::from_millis(100)); + + let r1 = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; + assert!( + r1.is_err(), + "without read_tx, must go through (closed) cmd_tx" + ); + + let r2 = client + .get_with_consistency(b"k", ReadConsistencyPolicy::EventualConsistency) + .await; + assert!( + r2.is_err(), + "without read_tx, must go through (closed) cmd_tx" + ); + } + + /// LinearizableRead always routes through cmd_tx, never ReadActor. + #[tokio::test] + async fn test_linearizable_always_routes_through_cmd_tx() { + // ReadActor is running with a valid lease and SM — but Linearizable must NOT use it. + let sm = sm_running_with_value(Bytes::from("should_not_see_this")); + // cmd_tx closed → error proves Linearizable hit cmd_tx, not ReadActor + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + + let result = + client.get_with_consistency(b"k", ReadConsistencyPolicy::LinearizableRead).await; + assert!(result.is_err(), "LinearizableRead must always use cmd_tx"); + + drop(client); + handle.await.unwrap(); + } + + /// sm.get() returning Err is surfaced directly as ClientApiError::Business — + /// SmError causes an immediate return without falling back to cmd_tx. + /// + /// Proof: cmd_rx is dropped (cmd_tx closed). A cmd_tx fallback would produce + /// ClientApiError::Network (channel-closed); SmError produces ClientApiError::Business. + /// The error variant is the discriminant. + #[tokio::test] + async fn test_sm_error_returned_directly_without_cmd_tx_fallback() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get() + .returning(|_| Err(d_engine_core::Error::Fatal("disk I/O failure".into()))); + + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + let result = client + .get_with_consistency(b"k", ReadConsistencyPolicy::EventualConsistency) + .await; + + assert!( + matches!(result, Err(d_engine_core::ClientApiError::Business { .. })), + "SmError must produce Business error (direct return), not Network (cmd_tx fallback): {:?}", + result + ); + + drop(client); + handle.await.unwrap(); + } + + /// ReadActor channel closed (engine stopping) → fallback to cmd_tx. + #[tokio::test] + async fn test_fast_path_fallback_when_read_actor_channel_closed() { + let sm = sm_running_with_value(Bytes::from("v")); + let (read_tx, read_rx) = mpsc::channel::(1); + let (cmd_tx, cmd_rx) = mpsc::channel(1); + drop(cmd_rx); // cmd_tx closed for fallback verification + + // Drop read_rx immediately → channel is closed from the receiver side. + drop(read_rx); + + let client: EmbeddedClient = + EmbeddedClient::new_internal(make_event_tx(), cmd_tx, 1, Duration::from_millis(100)) + .with_read_actor(read_tx); + + // Send to a closed channel → is_ok() == false → falls through to cmd_tx → error + let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; + assert!( + result.is_err(), + "closed read_tx must fall back to (closed) cmd_tx" + ); + + // Suppress unused SM warning + drop(sm); + } +} diff --git a/d-engine-server/src/api/embedded_client_test.rs b/d-engine-server/src/api/embedded_client_test.rs index f82d9e6d..696af75d 100644 --- a/d-engine-server/src/api/embedded_client_test.rs +++ b/d-engine-server/src/api/embedded_client_test.rs @@ -113,10 +113,10 @@ mod integration_tests { use d_engine_core::ClientApi; use tempfile::TempDir; - use crate::api::EmbeddedEngine; + use crate::api::DefaultEmbeddedEngine; /// Helper to create a test EmbeddedEngine - async fn create_test_engine() -> (EmbeddedEngine, TempDir) { + async fn create_test_engine() -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = TempDir::new().expect("Failed to create temp dir"); let db_path = temp_dir.path().join("db"); @@ -145,7 +145,7 @@ max_batch_size = 1 ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); diff --git a/d-engine-server/src/api/embedded_test.rs b/d-engine-server/src/api/embedded_test.rs index 8324be3d..290ccb8a 100644 --- a/d-engine-server/src/api/embedded_test.rs +++ b/d-engine-server/src/api/embedded_test.rs @@ -9,6 +9,8 @@ mod embedded_engine_tests { use crate::storage::FileStateMachine; use crate::storage::FileStorageEngine; + type TestEngine = EmbeddedEngine; + async fn create_test_storage_and_sm() -> ( Arc, Arc, @@ -39,7 +41,7 @@ mod embedded_engine_tests { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; // Start embedded engine (single node) - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -65,7 +67,7 @@ mod embedded_engine_tests { async fn test_wait_ready_timeout() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -85,7 +87,7 @@ mod embedded_engine_tests { async fn test_leader_change_notifier_basic() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -119,7 +121,7 @@ mod embedded_engine_tests { async fn test_ready_and_wait_ready_sequence() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -148,7 +150,7 @@ mod embedded_engine_tests { async fn test_client_available_after_wait_ready() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -174,7 +176,7 @@ mod embedded_engine_tests { async fn test_multiple_leader_change_notifier_subscribers() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -211,7 +213,7 @@ mod embedded_engine_tests { async fn test_engine_stop_cleans_up() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -224,7 +226,7 @@ mod embedded_engine_tests { async fn test_wait_ready_race_condition_already_elected() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -259,7 +261,7 @@ mod embedded_engine_tests { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; let engine = Arc::new( - EmbeddedEngine::start_custom(storage, sm, None) + TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"), ); @@ -305,7 +307,7 @@ mod embedded_engine_tests { async fn test_wait_ready_check_current_value_first() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -513,7 +515,7 @@ listen_addr = "127.0.0.1:0" async fn test_drop_without_stop_warning() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -535,7 +537,7 @@ listen_addr = "127.0.0.1:0" async fn test_watch_registers_successfully() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -612,7 +614,7 @@ listen_addr = "127.0.0.1:0" // temp_dir dropped here — underlying paths are now invalid }; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -677,10 +679,9 @@ listen_addr = "127.0.0.1:0" ) .unwrap(); - let engine = - EmbeddedEngine::start_custom(storage, sm, Some(config_path.to_str().unwrap())) - .await - .expect("Failed to start engine"); + let engine = TestEngine::start_custom(storage, sm, Some(config_path.to_str().unwrap())) + .await + .expect("Failed to start engine"); engine .wait_ready(Duration::from_secs(5)) @@ -751,7 +752,7 @@ listen_addr = "127.0.0.1:0" async fn test_is_leader_single_node() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -791,7 +792,7 @@ listen_addr = "127.0.0.1:0" async fn test_leader_info_before_election() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); @@ -842,7 +843,7 @@ listen_addr = "127.0.0.1:0" let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; let engine = Arc::new( - EmbeddedEngine::start_custom(storage, sm, None) + TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"), ); @@ -925,7 +926,7 @@ listen_addr = "127.0.0.1:0" async fn test_leader_info_consistency() { let (storage, sm, _temp_dir) = create_test_storage_and_sm().await; - let engine = EmbeddedEngine::start_custom(storage, sm, None) + let engine = TestEngine::start_custom(storage, sm, None) .await .expect("Failed to start engine"); diff --git a/d-engine-server/src/api/mod.rs b/d-engine-server/src/api/mod.rs index dc9166ec..0ff5da89 100644 --- a/d-engine-server/src/api/mod.rs +++ b/d-engine-server/src/api/mod.rs @@ -4,13 +4,31 @@ mod embedded; mod embedded_client; mod standalone; -pub use embedded::EmbeddedEngine; -pub use embedded_client::EmbeddedClient; pub use standalone::StandaloneEngine; +/// Embedded engine generic over any `(SE, SM)` pair. +pub type EmbeddedEngine = embedded::EmbeddedEngine>; + +/// Embedded client generic over any `(SE, SM)` pair. +pub type EmbeddedClient = + embedded_client::EmbeddedClient>; + +/// Zero-param embedded engine alias using the default RocksDB backend. +#[cfg(feature = "rocksdb")] +pub type DefaultEmbeddedEngine = + EmbeddedEngine; + +/// Zero-param embedded client alias using the default RocksDB backend. +#[cfg(feature = "rocksdb")] +pub type DefaultEmbeddedClient = + EmbeddedClient; + #[cfg(test)] mod embedded_client_test; +#[cfg(test)] +mod embedded_client_fast_path_test; + #[cfg(test)] mod embedded_test; diff --git a/d-engine-server/src/api/standalone.rs b/d-engine-server/src/api/standalone.rs index f01958f2..59f3ee41 100644 --- a/d-engine-server/src/api/standalone.rs +++ b/d-engine-server/src/api/standalone.rs @@ -68,7 +68,7 @@ impl StandaloneEngine { (storage, sm) }; - let lease = Arc::new(crate::storage::DefaultLease::new( + let lease = Arc::new(crate::storage::TtlLease::new( config.raft.state_machine.lease.clone(), )); sm.set_lease(lease); @@ -122,7 +122,7 @@ impl StandaloneEngine { (storage, sm) }; - let lease = Arc::new(crate::storage::DefaultLease::new( + let lease = Arc::new(crate::storage::TtlLease::new( config.raft.state_machine.lease.clone(), )); sm.set_lease(lease); diff --git a/d-engine-server/src/lib.rs b/d-engine-server/src/lib.rs index 2e14bf30..b5d361e7 100644 --- a/d-engine-server/src/lib.rs +++ b/d-engine-server/src/lib.rs @@ -117,6 +117,10 @@ pub use d_engine_core::LeaderInfo; pub mod storage; // -------------------- Primary Entry Points -------------------- +#[cfg(feature = "rocksdb")] +pub use api::DefaultEmbeddedClient; +#[cfg(feature = "rocksdb")] +pub use api::DefaultEmbeddedEngine; pub use api::EmbeddedEngine; pub use api::StandaloneEngine; pub use membership::MembershipSnapshot; diff --git a/d-engine-server/src/node/builder.rs b/d-engine-server/src/node/builder.rs index 2a35ce8e..d35397ab 100644 --- a/d-engine-server/src/node/builder.rs +++ b/d-engine-server/src/node/builder.rs @@ -566,6 +566,7 @@ where let commit_handler_handle = Self::spawn_state_machine_commit_listener(commit_handler); let event_tx = raft_core.event_sender(); + let read_lease = raft_core.read_lease(); let (rpc_ready_tx, _rpc_ready_rx) = watch::channel(false); let node = Node::> { @@ -587,6 +588,7 @@ where _commit_handler_handle: Some(commit_handler_handle), _lease_cleanup_handle: lease_cleanup_handle, shutdown_signal: self.shutdown_signal.clone(), + read_lease, }; self.node = Some(Arc::new(node)); diff --git a/d-engine-server/src/node/mod.rs b/d-engine-server/src/node/mod.rs index d09cbe26..b5ca19a9 100644 --- a/d-engine-server/src/node/mod.rs +++ b/d-engine-server/src/node/mod.rs @@ -46,6 +46,7 @@ use d_engine_core::Membership; use d_engine_core::Raft; use d_engine_core::RaftEvent; use d_engine_core::RaftNodeConfig; +use d_engine_core::ReadLease; use d_engine_core::Result; use d_engine_core::TypeConfig; use d_engine_core::alias::MOF; @@ -121,6 +122,9 @@ where /// Shutdown signal for graceful termination pub(crate) shutdown_signal: watch::Receiver<()>, + + /// Read lease — same Arc as the one inside SharedState, exposed for EmbeddedClient. + pub(crate) read_lease: Arc, } impl Debug for Node @@ -327,4 +331,19 @@ where pub fn node_id(&self) -> u32 { self.node_id } + + /// Returns a clone of the read lease handle. + /// + /// The returned `Arc` is the same object held inside the Raft loop's + /// `SharedState`. EmbeddedClient uses it to check lease validity without going + /// through `cmd_tx`. + pub fn read_lease(&self) -> Arc { + Arc::clone(&self.read_lease) + } + + /// Returns the current Raft term from the hard state. + /// Used to seed `EmbeddedClient::known_term` at startup. + pub async fn current_term(&self) -> u64 { + self.raft_core.lock().await.current_term() + } } diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs index 9b4952c3..2e00237b 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs @@ -115,7 +115,7 @@ use tracing::error; use tracing::info; use tracing::warn; -use crate::storage::DefaultLease; +use crate::storage::TtlLease; type FileStateMachineDataType = RwLock>; @@ -242,9 +242,9 @@ pub struct FileStateMachine { data: FileStateMachineDataType, // (value, term) // Lease management for automatic key expiration - // DefaultLease is thread-safe internally (uses DashMap + Mutex) + // TtlLease is thread-safe internally (uses DashMap + Mutex) // Injected by NodeBuilder after construction - lease: Option>, + lease: Option>, // Raft state with disk persistence last_applied_index: AtomicU64, @@ -305,7 +305,7 @@ impl FileStateMachine { /// Also available for testing and benchmarks. pub fn set_lease( &mut self, - lease: Arc, + lease: Arc, ) { self.lease = Some(lease); } diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs index 72975850..319fb4d5 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs @@ -40,7 +40,7 @@ use tracing::info; use tracing::instrument; use tracing::warn; -use crate::storage::DefaultLease; +use crate::storage::TtlLease; use super::STATE_MACHINE_CF; use super::STATE_MACHINE_META_CF; @@ -83,9 +83,9 @@ pub struct RocksDBStateMachine { last_snapshot_metadata: RwLock>, // Lease management for automatic key expiration - // DefaultLease is thread-safe internally (uses DashMap + Mutex) + // TtlLease is thread-safe internally (uses DashMap + Mutex) // Injected by NodeBuilder after construction - lease: Option>, + lease: Option>, } /// Returns the lexicographic successor of `prefix` for use as an iterator upper bound. @@ -164,7 +164,7 @@ impl RocksDBStateMachine { /// Also available for testing and benchmarks. pub fn set_lease( &mut self, - lease: Arc, + lease: Arc, ) { self.lease = Some(lease); } diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs index d38d60d6..2f7332e0 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs @@ -15,7 +15,7 @@ use super::RocksDBStateMachine; use super::RocksDBStorageEngine; use super::RocksDBUnifiedEngine; use crate::StateMachine; -use crate::storage::DefaultLease; +use crate::storage::TtlLease; // Both test suites call build() twice within a single persistence test (write data → drop → // build() again → verify data survived). Both builders therefore: @@ -169,8 +169,8 @@ fn test_concurrent_open_same_path_fails() { // ── Lease round-trip tests ──────────────────────────────────────────────────── -fn make_lease() -> Arc { - Arc::new(DefaultLease::new(LeaseConfig { +fn make_lease() -> Arc { + Arc::new(TtlLease::new(LeaseConfig { cleanup_interval_ms: 1000, max_cleanup_duration_ms: 10, })) diff --git a/d-engine-server/src/storage/lease.rs b/d-engine-server/src/storage/lease.rs index 459afb6b..0fbd5f4e 100644 --- a/d-engine-server/src/storage/lease.rs +++ b/d-engine-server/src/storage/lease.rs @@ -55,7 +55,7 @@ use crate::Result; /// - Per-key overhead: ~50 bytes (single DashMap entry) /// - Expired keys are removed automatically during cleanup #[derive(Debug)] -pub struct DefaultLease { +pub struct TtlLease { /// Lease cleanup configuration (immutable after creation) config: d_engine_core::config::LeaseConfig, @@ -72,7 +72,7 @@ pub struct DefaultLease { has_keys: AtomicBool, } -impl DefaultLease { +impl TtlLease { /// Creates a new default lease manager with the given configuration. /// /// # Arguments @@ -179,7 +179,7 @@ impl DefaultLease { } } -impl Lease for DefaultLease { +impl Lease for TtlLease { /// Register a key with TTL (Time-To-Live). /// /// # TTL Semantics diff --git a/d-engine-server/src/storage/lease_integration_test.rs b/d-engine-server/src/storage/lease_integration_test.rs index bb5e1cd8..3730276c 100644 --- a/d-engine-server/src/storage/lease_integration_test.rs +++ b/d-engine-server/src/storage/lease_integration_test.rs @@ -4,7 +4,7 @@ //! Integration tests for Lease functionality across the full stack //! //! This module contains comprehensive tests for: -//! - DefaultLease unit tests (moved from ttl_manager.rs) +//! - TtlLease unit tests (moved from ttl_manager.rs) //! - FileStateMachine Lease integration tests //! - RocksDBStateMachine Lease integration tests @@ -15,12 +15,12 @@ mod lease_tests { use bytes::Bytes; use d_engine_core::Lease; - use crate::storage::DefaultLease; + use crate::storage::TtlLease; #[test] fn test_register_and_get_expired() { let config = d_engine_core::config::LeaseConfig::default(); - let manager = DefaultLease::new(config); + let manager = TtlLease::new(config); // Register keys with 1 second TTL manager.register(Bytes::from("key1"), 1); @@ -43,7 +43,7 @@ mod lease_tests { #[test] fn test_unregister() { let config = d_engine_core::config::LeaseConfig::default(); - let manager = DefaultLease::new(config); + let manager = TtlLease::new(config); manager.register(Bytes::from("key1"), 10); assert_eq!(manager.len(), 1); @@ -55,7 +55,7 @@ mod lease_tests { #[test] fn test_update_ttl() { let config = d_engine_core::config::LeaseConfig::default(); - let manager = DefaultLease::new(config); + let manager = TtlLease::new(config); // Register with 10 seconds manager.register(Bytes::from("key1"), 10); @@ -70,13 +70,13 @@ mod lease_tests { #[test] fn test_snapshot_roundtrip() { let config = d_engine_core::config::LeaseConfig::default(); - let manager = DefaultLease::new(config.clone()); + let manager = TtlLease::new(config.clone()); manager.register(Bytes::from("key1"), 3600); manager.register(Bytes::from("key2"), 7200); let snapshot = manager.to_snapshot(); - let restored = DefaultLease::from_snapshot(&snapshot, config); + let restored = TtlLease::from_snapshot(&snapshot, config); assert_eq!(restored.len(), 2); } @@ -84,7 +84,7 @@ mod lease_tests { #[test] fn test_snapshot_filters_expired() { let config = d_engine_core::config::LeaseConfig::default(); - let manager = DefaultLease::new(config.clone()); + let manager = TtlLease::new(config.clone()); // Register key with 1 second TTL manager.register(Bytes::from("key1"), 1); @@ -93,7 +93,7 @@ mod lease_tests { sleep(Duration::from_secs(2)); let snapshot = manager.to_snapshot(); - let restored = DefaultLease::from_snapshot(&snapshot, config); + let restored = TtlLease::from_snapshot(&snapshot, config); // Only key2 should be restored assert_eq!(restored.len(), 1); @@ -108,8 +108,8 @@ mod file_state_machine_tests { use tempfile::TempDir; use tokio::time::sleep; - use crate::storage::DefaultLease; use crate::storage::FileStateMachine; + use crate::storage::TtlLease; /// Helper to create a FileStateMachine with lease injected for testing async fn create_file_state_machine_with_lease( @@ -117,7 +117,7 @@ mod file_state_machine_tests { lease_config: d_engine_core::config::LeaseConfig, ) -> FileStateMachine { let mut sm = FileStateMachine::new(path).await.unwrap(); - let lease = std::sync::Arc::new(DefaultLease::new(lease_config)); + let lease = std::sync::Arc::new(TtlLease::new(lease_config)); sm.set_lease(lease); sm.load_lease_data().await.unwrap(); sm @@ -779,7 +779,7 @@ mod rocksdb_state_machine_tests { lease_config: d_engine_core::config::LeaseConfig, ) -> (RocksDBStorageEngine, RocksDBStateMachine) { let (storage, mut sm) = RocksDBUnifiedEngine::open(&path).unwrap(); - let lease = std::sync::Arc::new(crate::storage::DefaultLease::new(lease_config)); + let lease = std::sync::Arc::new(crate::storage::TtlLease::new(lease_config)); sm.set_lease(lease); sm.load_lease_data().await.unwrap(); (storage, sm) diff --git a/d-engine-server/src/storage/lease_unit_test.rs b/d-engine-server/src/storage/lease_unit_test.rs index e83469b2..550ea720 100644 --- a/d-engine-server/src/storage/lease_unit_test.rs +++ b/d-engine-server/src/storage/lease_unit_test.rs @@ -1,4 +1,4 @@ -//! Comprehensive unit tests for DefaultLease implementation +//! Comprehensive unit tests for TtlLease implementation //! //! Tests cover: //! - Basic registration, expiration, and cleanup @@ -14,7 +14,7 @@ use std::time::SystemTime; use bytes::Bytes; use d_engine_core::Lease; -use crate::storage::lease::DefaultLease; +use crate::storage::lease::TtlLease; fn default_config() -> d_engine_core::config::LeaseConfig { d_engine_core::config::LeaseConfig { @@ -29,7 +29,7 @@ fn default_config() -> d_engine_core::config::LeaseConfig { #[test] fn test_register_and_is_expired() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 1); assert!(!lease.is_expired(b"key1")); @@ -40,7 +40,7 @@ fn test_register_and_is_expired() { #[test] fn test_unregister() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 10); assert_eq!(lease.len(), 1); @@ -52,7 +52,7 @@ fn test_unregister() { #[test] fn test_unregister_nonexistent_key() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); // Should not panic on unregistering non-existent key lease.unregister(b"nonexistent"); @@ -61,7 +61,7 @@ fn test_unregister_nonexistent_key() { #[test] fn test_get_expired_keys() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 1); lease.register(Bytes::from("key2"), 1); @@ -75,7 +75,7 @@ fn test_get_expired_keys() { #[test] fn test_is_empty() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); assert!(lease.is_empty()); lease.register(Bytes::from("key1"), 10); @@ -91,7 +91,7 @@ fn test_is_empty() { #[test] fn test_has_lease_keys() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); assert!(!lease.has_lease_keys()); lease.register(Bytes::from("key1"), 10); @@ -103,7 +103,7 @@ fn test_has_lease_keys() { #[test] fn test_may_have_expired_keys_false_when_no_keys() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); // No keys registered, should return false immediately assert!(!lease.may_have_expired_keys(SystemTime::now())); @@ -111,7 +111,7 @@ fn test_may_have_expired_keys_false_when_no_keys() { #[test] fn test_may_have_expired_keys_false_when_all_valid() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 3600); lease.register(Bytes::from("key2"), 7200); @@ -122,7 +122,7 @@ fn test_may_have_expired_keys_false_when_all_valid() { #[test] fn test_may_have_expired_keys_true_when_has_expired() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 1); sleep(Duration::from_secs(2)); @@ -137,7 +137,7 @@ fn test_may_have_expired_keys_true_when_has_expired() { #[test] fn test_get_expiration() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 3600); @@ -148,7 +148,7 @@ fn test_get_expiration() { #[test] fn test_get_expiration_not_found() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); let expiration = lease.get_expiration(b"nonexistent"); assert!(expiration.is_none()); @@ -160,7 +160,7 @@ fn test_get_expiration_not_found() { #[test] fn test_register_updates_existing_key() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); // Register with 10s TTL lease.register(Bytes::from("key1"), 10); @@ -181,7 +181,7 @@ fn test_register_updates_existing_key() { #[test] fn test_multiple_keys_same_expiration() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); let ttl = 5u64; lease.register(Bytes::from("key1"), ttl); @@ -199,7 +199,7 @@ fn test_multiple_keys_same_expiration() { #[test] fn test_mixed_expired_and_valid_keys() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("expire_soon"), 1); lease.register(Bytes::from("expire_later"), 3600); @@ -222,13 +222,13 @@ fn test_mixed_expired_and_valid_keys() { #[test] fn test_snapshot_roundtrip() { let config = default_config(); - let lease1 = DefaultLease::new(config.clone()); + let lease1 = TtlLease::new(config.clone()); lease1.register(Bytes::from("key1"), 3600); lease1.register(Bytes::from("key2"), 7200); let snapshot = lease1.to_snapshot(); - let lease2 = DefaultLease::from_snapshot(&snapshot, config); + let lease2 = TtlLease::from_snapshot(&snapshot, config); assert_eq!(lease2.len(), 2); assert!(!lease2.is_expired(b"key1")); @@ -238,7 +238,7 @@ fn test_snapshot_roundtrip() { #[test] fn test_snapshot_roundtrip_filters_expired_keys() { let config = default_config(); - let lease1 = DefaultLease::new(config.clone()); + let lease1 = TtlLease::new(config.clone()); lease1.register(Bytes::from("valid_key"), 3600); lease1.register(Bytes::from("expired_key"), 1); @@ -248,7 +248,7 @@ fn test_snapshot_roundtrip_filters_expired_keys() { let snapshot = lease1.to_snapshot(); // from_snapshot should filter out expired keys - let lease2 = DefaultLease::from_snapshot(&snapshot, config); + let lease2 = TtlLease::from_snapshot(&snapshot, config); // Only valid_key should remain assert_eq!(lease2.len(), 1); @@ -260,14 +260,14 @@ fn test_from_snapshot_with_invalid_data() { let config = default_config(); // from_snapshot with invalid data should return empty lease - let lease = DefaultLease::from_snapshot(&[0xFF, 0xFE], config); + let lease = TtlLease::from_snapshot(&[0xFF, 0xFE], config); assert_eq!(lease.len(), 0); assert!(!lease.has_lease_keys()); } #[test] fn test_reload() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 3600); let snapshot = lease.to_snapshot(); @@ -283,7 +283,7 @@ fn test_reload() { #[test] fn test_reload_invalid_data() { - let lease = DefaultLease::new(default_config()); + let lease = TtlLease::new(default_config()); lease.register(Bytes::from("key1"), 3600); assert_eq!(lease.len(), 1); @@ -306,7 +306,7 @@ fn test_reload_clears_apply_counter() { max_cleanup_duration_ms: 1, }; - let lease = DefaultLease::new(config.clone()); + let lease = TtlLease::new(config.clone()); lease.register(Bytes::from("key1"), 3600); @@ -333,7 +333,7 @@ fn test_reload_clears_apply_counter() { fn test_on_apply_piggyback_removed() { let config = default_config(); - let lease = DefaultLease::new(config); + let lease = TtlLease::new(config); lease.register(Bytes::from("key1"), 1); sleep(Duration::from_secs(2)); @@ -354,6 +354,6 @@ fn test_custom_cleanup_interval() { max_cleanup_duration_ms: 1, }; - let lease = DefaultLease::new(config); + let lease = TtlLease::new(config); assert_eq!(lease.config().cleanup_interval_ms, 5000); } diff --git a/d-engine-server/src/storage/mod.rs b/d-engine-server/src/storage/mod.rs index ba98c842..432eb9e1 100644 --- a/d-engine-server/src/storage/mod.rs +++ b/d-engine-server/src/storage/mod.rs @@ -26,7 +26,7 @@ pub use adaptors::*; pub use buffered::*; // Re-export Lease trait from core for convenience pub use d_engine_core::Lease; -pub use lease::DefaultLease; +pub use lease::TtlLease; #[cfg(test)] mod lease_integration_test; diff --git a/d-engine-server/src/test_utils/mock/mock_node_builder.rs b/d-engine-server/src/test_utils/mock/mock_node_builder.rs index aeeb550d..1e0350ac 100644 --- a/d-engine-server/src/test_utils/mock/mock_node_builder.rs +++ b/d-engine-server/src/test_utils/mock/mock_node_builder.rs @@ -316,6 +316,7 @@ impl MockBuilder { let cmd_tx = raft.cmd_sender(); let node_config = raft.ctx.node_config.clone(); let membership = raft.ctx.membership.clone(); + let read_lease = raft.read_lease(); let (rpc_ready_tx, _rpc_ready_rx) = watch::channel(false); let leader_notifier = LeaderNotifier::new(); let (_membership_tx, membership_rx) = watch::channel(MembershipSnapshot::default()); @@ -339,6 +340,7 @@ impl MockBuilder { _commit_handler_handle: None, _lease_cleanup_handle: None, shutdown_signal, + read_lease, } } @@ -360,6 +362,7 @@ impl MockBuilder { .expect("Should succeed to validate RaftNodeConfig") }); let membership = raft.ctx.membership.clone(); + let read_lease = raft.read_lease(); trace!( node_config.raft.election.election_timeout_min, "build_node_with_rpc_server" @@ -388,6 +391,7 @@ impl MockBuilder { _commit_handler_handle: None, _lease_cleanup_handle: None, shutdown_signal: shutdown.clone(), + read_lease, }); let node_clone = node.clone(); let listen_address = node_config_arc.cluster.listen_address; diff --git a/d-engine-server/tests/cas_operations/bank_transfer_invariant_embedded.rs b/d-engine-server/tests/cas_operations/bank_transfer_invariant_embedded.rs index d7e66711..838b3e77 100644 --- a/d-engine-server/tests/cas_operations/bank_transfer_invariant_embedded.rs +++ b/d-engine-server/tests/cas_operations/bank_transfer_invariant_embedded.rs @@ -3,7 +3,7 @@ use d_engine_core::ClientApi; use d_engine_core::ClientApiError; use d_engine_server::RocksDBUnifiedEngine; -use d_engine_server::api::EmbeddedEngine; +use d_engine_server::api::DefaultEmbeddedEngine; use serial_test::serial; use std::sync::Arc; use std::time::Duration; @@ -81,7 +81,7 @@ async fn test_concurrent_transfers_preserve_bank_invariant() let config_path = format!("/tmp/d-engine-bank-node{node_id}.toml"); tokio::fs::write(&config_path, &config_str).await?; - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(&config_path), diff --git a/d-engine-server/tests/cas_operations/distributed_lock_embedded.rs b/d-engine-server/tests/cas_operations/distributed_lock_embedded.rs index 02fee19e..217729ca 100644 --- a/d-engine-server/tests/cas_operations/distributed_lock_embedded.rs +++ b/d-engine-server/tests/cas_operations/distributed_lock_embedded.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use std::time::Duration; use d_engine_core::ClientApi; -use d_engine_server::api::EmbeddedEngine; +use d_engine_server::api::DefaultEmbeddedEngine; use tracing::info; use tracing_test::traced_test; @@ -58,7 +58,7 @@ async fn test_distributed_lock_embedded() -> Result<(), Box Result<(), Box Result<(), Box Result<(), Box Result<(), Box> { let temp_dir = tempfile::tempdir()?; @@ -16,7 +16,7 @@ async fn test_single_node_lifecycle() -> Result<(), Box> } // Start embedded engine — data_dir takes highest priority - let engine = EmbeddedEngine::start(&data_dir).await?; + let engine = DefaultEmbeddedEngine::start(&data_dir).await?; // Clean up environment variables immediately unsafe { @@ -80,7 +80,7 @@ async fn test_leader_notification() -> Result<(), Box> { std::env::set_var("RAFT__CLUSTER__LISTEN_ADDRESS", "127.0.0.1:9002"); } - let engine = EmbeddedEngine::start(&data_dir).await?; + let engine = DefaultEmbeddedEngine::start(&data_dir).await?; unsafe { std::env::remove_var("RAFT__CLUSTER__NODE_ID"); @@ -112,7 +112,7 @@ async fn test_leader_notification() -> Result<(), Box> { async fn test_data_persistence() -> Result<(), Box> { use std::time::Duration; - use d_engine_server::EmbeddedEngine; + use d_engine_server::DefaultEmbeddedEngine; let temp_dir = tempfile::tempdir()?; let data_dir = temp_dir.path().join("db"); @@ -125,7 +125,7 @@ async fn test_data_persistence() -> Result<(), Box> { // First session: write data { - let engine = EmbeddedEngine::start(&data_dir).await?; + let engine = DefaultEmbeddedEngine::start(&data_dir).await?; engine.wait_ready(Duration::from_secs(5)).await?; engine.client().put(b"persist-key".to_vec(), b"persist-value".to_vec()).await?; @@ -138,7 +138,7 @@ async fn test_data_persistence() -> Result<(), Box> { // Second session: verify data still exists { - let engine = EmbeddedEngine::start(&data_dir).await?; + let engine = DefaultEmbeddedEngine::start(&data_dir).await?; engine.wait_ready(Duration::from_secs(5)).await?; let value = engine.client().get_linearizable(b"persist-key".to_vec()).await?; diff --git a/d-engine-server/tests/cluster_state_and_metadata/cluster_state_consensus_embedded.rs b/d-engine-server/tests/cluster_state_and_metadata/cluster_state_consensus_embedded.rs index 3999243e..40d9c416 100644 --- a/d-engine-server/tests/cluster_state_and_metadata/cluster_state_consensus_embedded.rs +++ b/d-engine-server/tests/cluster_state_and_metadata/cluster_state_consensus_embedded.rs @@ -1,4 +1,4 @@ -//! Integration tests for EmbeddedEngine cluster state APIs (Ticket #234) +//! Integration tests for DefaultEmbeddedEngine cluster state APIs (Ticket #234) //! //! These tests verify is_leader() and leader_info() behavior in multi-node scenarios: //! - Multi-node leader election @@ -7,7 +7,7 @@ use crate::common::get_available_ports; use crate::common::node_config; -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use std::sync::Arc; use std::time::Duration; use tracing::info; @@ -18,7 +18,7 @@ use d_engine_server::RocksDBUnifiedEngine; /// Test: 3-node cluster should elect exactly one leader /// /// Setup: -/// - Start 3 EmbeddedEngine instances as a cluster +/// - Start 3 DefaultEmbeddedEngine instances as a cluster /// - Wait for leader election /// /// Verification: @@ -105,25 +105,34 @@ listen_address = '127.0.0.1:{}' let db_path1 = config1.cluster.db_root_dir.join("node1/db"); tokio::fs::create_dir_all(&db_path1).await?; let (storage1, sm1) = RocksDBUnifiedEngine::open(&db_path1)?; - let engine1 = - EmbeddedEngine::start_custom(Arc::new(storage1), Arc::new(sm1), Some(node1_config_path)) - .await?; + let engine1 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage1), + Arc::new(sm1), + Some(node1_config_path), + ) + .await?; let config2 = node_config(&node2_config); let db_path2 = config2.cluster.db_root_dir.join("node2/db"); tokio::fs::create_dir_all(&db_path2).await?; let (storage2, sm2) = RocksDBUnifiedEngine::open(&db_path2)?; - let engine2 = - EmbeddedEngine::start_custom(Arc::new(storage2), Arc::new(sm2), Some(node2_config_path)) - .await?; + let engine2 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage2), + Arc::new(sm2), + Some(node2_config_path), + ) + .await?; let config3 = node_config(&node3_config); let db_path3 = config3.cluster.db_root_dir.join("node3/db"); tokio::fs::create_dir_all(&db_path3).await?; let (storage3, sm3) = RocksDBUnifiedEngine::open(&db_path3)?; - let engine3 = - EmbeddedEngine::start_custom(Arc::new(storage3), Arc::new(sm3), Some(node3_config_path)) - .await?; + let engine3 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage3), + Arc::new(sm3), + Some(node3_config_path), + ) + .await?; // Wait for leader election info!("Waiting for leader election..."); @@ -243,25 +252,34 @@ general_raft_timeout_duration_in_ms = 3000 let db_path1 = config1.cluster.db_root_dir.join("node1/db"); tokio::fs::create_dir_all(&db_path1).await?; let (storage1, sm1) = RocksDBUnifiedEngine::open(&db_path1)?; - let engine1 = - EmbeddedEngine::start_custom(Arc::new(storage1), Arc::new(sm1), Some(node1_config_path)) - .await?; + let engine1 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage1), + Arc::new(sm1), + Some(node1_config_path), + ) + .await?; let config2 = node_config(&node2_config); let db_path2 = config2.cluster.db_root_dir.join("node2/db"); tokio::fs::create_dir_all(&db_path2).await?; let (storage2, sm2) = RocksDBUnifiedEngine::open(&db_path2)?; - let engine2 = - EmbeddedEngine::start_custom(Arc::new(storage2), Arc::new(sm2), Some(node2_config_path)) - .await?; + let engine2 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage2), + Arc::new(sm2), + Some(node2_config_path), + ) + .await?; let config3 = node_config(&node3_config); let db_path3 = config3.cluster.db_root_dir.join("node3/db"); tokio::fs::create_dir_all(&db_path3).await?; let (storage3, sm3) = RocksDBUnifiedEngine::open(&db_path3)?; - let engine3 = - EmbeddedEngine::start_custom(Arc::new(storage3), Arc::new(sm3), Some(node3_config_path)) - .await?; + let engine3 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage3), + Arc::new(sm3), + Some(node3_config_path), + ) + .await?; // Wait for leader election info!("Waiting for leader election..."); @@ -413,25 +431,34 @@ general_raft_timeout_duration_in_ms = 3000 let db_path1 = config1.cluster.db_root_dir.join("node1/db"); tokio::fs::create_dir_all(&db_path1).await?; let (storage1, sm1) = RocksDBUnifiedEngine::open(&db_path1)?; - let engine1 = - EmbeddedEngine::start_custom(Arc::new(storage1), Arc::new(sm1), Some(node1_config_path)) - .await?; + let engine1 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage1), + Arc::new(sm1), + Some(node1_config_path), + ) + .await?; let config2 = node_config(&node2_config); let db_path2 = config2.cluster.db_root_dir.join("node2/db"); tokio::fs::create_dir_all(&db_path2).await?; let (storage2, sm2) = RocksDBUnifiedEngine::open(&db_path2)?; - let engine2 = - EmbeddedEngine::start_custom(Arc::new(storage2), Arc::new(sm2), Some(node2_config_path)) - .await?; + let engine2 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage2), + Arc::new(sm2), + Some(node2_config_path), + ) + .await?; let config3 = node_config(&node3_config); let db_path3 = config3.cluster.db_root_dir.join("node3/db"); tokio::fs::create_dir_all(&db_path3).await?; let (storage3, sm3) = RocksDBUnifiedEngine::open(&db_path3)?; - let engine3 = - EmbeddedEngine::start_custom(Arc::new(storage3), Arc::new(sm3), Some(node3_config_path)) - .await?; + let engine3 = DefaultEmbeddedEngine::start_custom( + Arc::new(storage3), + Arc::new(sm3), + Some(node3_config_path), + ) + .await?; // Wait for initial leader election tokio::time::sleep(Duration::from_secs(5)).await; diff --git a/d-engine-server/tests/consistent_reads/lease_read_embedded.rs b/d-engine-server/tests/consistent_reads/lease_read_embedded.rs index 1c70afa0..4ddb6cb2 100644 --- a/d-engine-server/tests/consistent_reads/lease_read_embedded.rs +++ b/d-engine-server/tests/consistent_reads/lease_read_embedded.rs @@ -9,14 +9,14 @@ use std::time::Duration; use d_engine_core::ClientApi; -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use tempfile::TempDir; use tracing_test::traced_test; use crate::common::get_available_ports; -/// Helper to create a test EmbeddedEngine with lease configuration -async fn create_test_engine_with_lease(test_name: &str) -> (EmbeddedEngine, TempDir) { +/// Helper to create a test DefaultEmbeddedEngine with lease configuration +async fn create_test_engine_with_lease(test_name: &str) -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); @@ -39,7 +39,7 @@ state_machine_sync_timeout_ms = 2000 ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); diff --git a/d-engine-server/tests/consistent_reads/linearizable_read_batching_embedded.rs b/d-engine-server/tests/consistent_reads/linearizable_read_batching_embedded.rs index 6dde2d23..411f338b 100644 --- a/d-engine-server/tests/consistent_reads/linearizable_read_batching_embedded.rs +++ b/d-engine-server/tests/consistent_reads/linearizable_read_batching_embedded.rs @@ -3,12 +3,12 @@ //! These tests verify that batching multiple linearizable read requests //! improves throughput by sharing a single verify_leadership() call. //! -//! Uses embedded mode with EmbeddedEngine for production-ready testing. +//! Uses embedded mode with DefaultEmbeddedEngine for production-ready testing. use std::time::Duration; use bytes::Bytes; -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use tempfile::TempDir; use tokio::time::Instant; @@ -16,11 +16,11 @@ use tracing_test::traced_test; use crate::common::get_available_ports; -/// Helper to create a test EmbeddedEngine with batching config +/// Helper to create a test DefaultEmbeddedEngine with batching config async fn create_engine_with_batching( test_name: &str, size_threshold: usize, -) -> (EmbeddedEngine, TempDir) { +) -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); @@ -47,7 +47,7 @@ size_threshold = {} ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); diff --git a/d-engine-server/tests/consistent_reads/linearizable_read_consistency_embedded.rs b/d-engine-server/tests/consistent_reads/linearizable_read_consistency_embedded.rs index 336a874b..6617fef3 100644 --- a/d-engine-server/tests/consistent_reads/linearizable_read_consistency_embedded.rs +++ b/d-engine-server/tests/consistent_reads/linearizable_read_consistency_embedded.rs @@ -3,10 +3,10 @@ //! These tests verify that linearizable reads use a fixed read_index calculated //! at request arrival time, preventing unnecessary waiting for concurrent writes. //! -//! Uses embedded mode with EmbeddedEngine for production-ready testing. +//! Uses embedded mode with DefaultEmbeddedEngine for production-ready testing. use crate::common::{create_node_config, get_available_ports, node_config}; -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use d_engine_server::RocksDBUnifiedEngine; use std::sync::Arc; use std::time::Duration; @@ -15,7 +15,7 @@ use tokio::time::Instant; use tracing_test::traced_test; /// Helper to create a test EmbeddedEngine -async fn create_test_engine(test_name: &str) -> (EmbeddedEngine, TempDir) { +async fn create_test_engine(test_name: &str) -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); @@ -38,7 +38,7 @@ state_machine_sync_timeout_ms = 2000 ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); @@ -330,7 +330,7 @@ async fn test_read_index_fixed_with_concurrent_writes_multi_node() let config_path = format!("/tmp/d-engine-test-linear-read-node{node_id}.toml"); tokio::fs::write(&config_path, &config_str).await?; - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(&config_path), diff --git a/d-engine-server/tests/drain_batching/select_fairness_embedded.rs b/d-engine-server/tests/drain_batching/select_fairness_embedded.rs index e2b9e295..8b928d83 100644 --- a/d-engine-server/tests/drain_batching/select_fairness_embedded.rs +++ b/d-engine-server/tests/drain_batching/select_fairness_embedded.rs @@ -11,7 +11,7 @@ use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; use std::time::Duration; -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use tempfile::TempDir; use tokio::sync::Semaphore; use tokio::time::Instant; @@ -19,7 +19,7 @@ use tokio::time::Instant; use crate::common::get_available_ports; /// Helper to create a single-node test engine with embedded mode -async fn create_test_engine(test_name: &str) -> (EmbeddedEngine, TempDir) { +async fn create_test_engine(test_name: &str) -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); @@ -43,7 +43,7 @@ max_batch_size = 100 ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); diff --git a/d-engine-server/tests/embedded_client/embedded_client_operations.rs b/d-engine-server/tests/embedded_client/embedded_client_operations.rs index 59a82b1f..83c02451 100644 --- a/d-engine-server/tests/embedded_client/embedded_client_operations.rs +++ b/d-engine-server/tests/embedded_client/embedded_client_operations.rs @@ -9,17 +9,17 @@ use std::time::Duration; use bytes::Bytes; use d_engine_core::ClientApi; -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use tempfile::TempDir; use crate::common::get_available_ports; -/// Helper to create a test EmbeddedEngine without any lease config section. +/// Helper to create a test DefaultEmbeddedEngine without any lease config section. /// /// Used by regression tests that must verify behaviour with default (zero-config) /// settings — notably #398 where omitting [raft.state_machine.lease] previously /// caused a fatal crash when put_with_ttl was called. -async fn create_test_engine_default_config(test_name: &str) -> (EmbeddedEngine, TempDir) { +async fn create_test_engine_default_config(test_name: &str) -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); let config_path = temp_dir.path().join("d-engine.toml"); @@ -37,7 +37,7 @@ single_node = true db_path.display() ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); engine.wait_ready(Duration::from_secs(5)).await.expect("Engine not ready"); @@ -45,7 +45,7 @@ single_node = true } /// Helper to create a test EmbeddedEngine -async fn create_test_engine(test_name: &str) -> (EmbeddedEngine, TempDir) { +async fn create_test_engine(test_name: &str) -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); @@ -65,7 +65,7 @@ single_node = true ); std::fs::write(&config_path, config_content).expect("Failed to write config"); - let engine = EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start engine"); @@ -709,14 +709,14 @@ async fn test_get_multi_linearizable_empty_keys() { // Watch operations (requires `watch` feature) // ============================================================================= -/// Helper: create an EmbeddedEngine with watch feature enabled. +/// Helper: create an DefaultEmbeddedEngine with watch feature enabled. /// /// Separate from create_test_engine because watch requires the /// `[raft.watch]` config section to activate the WatchRegistry. #[cfg(feature = "watch")] async fn create_watch_engine( test_name: &str -) -> (d_engine_server::EmbeddedEngine, tempfile::TempDir) { +) -> (d_engine_server::DefaultEmbeddedEngine, tempfile::TempDir) { let temp_dir = tempfile::tempdir().expect("Failed to create temp dir"); let db_path = temp_dir.path().join(test_name); @@ -752,7 +752,7 @@ watcher_buffer_size = 10 ); std::fs::write(&config_path, config_content).expect("Failed to write watch config"); - let engine = d_engine_server::EmbeddedEngine::start_with(config_path.to_str().unwrap()) + let engine = d_engine_server::DefaultEmbeddedEngine::start_with(config_path.to_str().unwrap()) .await .expect("Failed to start watch engine"); diff --git a/d-engine-server/tests/failover_and_recovery/leader_failover_embedded.rs b/d-engine-server/tests/failover_and_recovery/leader_failover_embedded.rs index da5eb3a0..6716b83c 100644 --- a/d-engine-server/tests/failover_and_recovery/leader_failover_embedded.rs +++ b/d-engine-server/tests/failover_and_recovery/leader_failover_embedded.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use std::time::Duration; use d_engine_server::RocksDBUnifiedEngine; -use d_engine_server::api::EmbeddedEngine; +use d_engine_server::api::DefaultEmbeddedEngine; use tracing::info; use tracing_test::traced_test; @@ -11,7 +11,7 @@ use crate::common::get_available_ports; use crate::common::node_config; use crate::common::wait_for_new_leader; -/// Test 3-node cluster leader failover with EmbeddedEngine API +/// Test 3-node cluster leader failover with DefaultEmbeddedEngine API /// /// Scenario: /// 1. Start 3-node cluster @@ -59,7 +59,7 @@ async fn test_embedded_leader_failover() -> Result<(), Box Result<(), Box> { configs.push((config_str, config_path)); - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(&configs[i].1), @@ -293,7 +293,7 @@ async fn test_embedded_node_rejoin() -> Result<(), Box> { opened.ok_or_else(|| last_err.unwrap())? }; - let restarted_engine = EmbeddedEngine::start_custom( + let restarted_engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(&killed_config.1), @@ -368,7 +368,7 @@ async fn test_minority_failure_blocks_writes() -> Result<(), Box Result<(EmbeddedEngine, TempDir), Box> { +/// Helper function to create a test DefaultEmbeddedEngine with RocksDB +async fn setup_engine() -> Result<(DefaultEmbeddedEngine, TempDir), Box> { let temp_dir = TempDir::new()?; let db_path = temp_dir.path().join("db"); @@ -37,7 +37,7 @@ watcher_buffer_size = 10 // Start engine with RocksDB storage let (storage, state_machine) = RocksDBUnifiedEngine::open(&db_path)?; - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(config_path.to_str().unwrap()), @@ -119,7 +119,7 @@ listen_address = "127.0.0.1:{port}" // Start engine with RocksDB storage let (storage, state_machine) = RocksDBUnifiedEngine::open(&db_path)?; - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(config_path.to_str().unwrap()), @@ -141,7 +141,7 @@ listen_address = "127.0.0.1:{port}" #[tokio::test] async fn test_watch_node_crash_embedded_mode() -> Result<(), Box> { // Scenario: - // 1. Node1: EmbeddedEngine.watch(key) + // 1. Node1: DefaultEmbeddedEngine.watch(key) // 2. Drop engine (simulate crash) // 3. Verify all watchers are automatically cleaned up // @@ -361,7 +361,7 @@ watcher_buffer_size = 10 // Start engine with RocksDB storage let (storage, state_machine) = RocksDBUnifiedEngine::open(&db_path)?; - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(config_path.to_str().unwrap()), diff --git a/d-engine-server/tests/watch_and_subscriptions/watch_membership_embedded.rs b/d-engine-server/tests/watch_and_subscriptions/watch_membership_embedded.rs index 6c66499e..ae1d3d84 100644 --- a/d-engine-server/tests/watch_and_subscriptions/watch_membership_embedded.rs +++ b/d-engine-server/tests/watch_and_subscriptions/watch_membership_embedded.rs @@ -1,4 +1,4 @@ -//! Integration tests for `EmbeddedEngine::watch_membership()` — Ticket #327 +//! Integration tests for `DefaultEmbeddedEngine::watch_membership()` — Ticket #327 //! //! Verifies in-process membership change notifications via `watch::Receiver`. //! @@ -49,7 +49,7 @@ use std::sync::Arc; use std::time::Duration; -use d_engine_server::{EmbeddedEngine, RocksDBUnifiedEngine}; +use d_engine_server::{DefaultEmbeddedEngine, RocksDBUnifiedEngine}; use tempfile::TempDir; use tokio::time::timeout; use tracing_test::traced_test; @@ -179,18 +179,21 @@ async fn wait_for_node_in_snapshot( .flatten() } -/// Start one `EmbeddedEngine` from a TOML string written to a temp file. +/// Start one `DefaultEmbeddedEngine` from a TOML string written to a temp file. async fn start_engine( toml: &str, node_id: u32, db_root: &std::path::Path, config_path: &str, -) -> Result> { +) -> Result> { tokio::fs::write(config_path, toml).await?; let db_path = db_root.join(format!("node{node_id}/db")); tokio::fs::create_dir_all(&db_path).await?; let (storage, sm) = RocksDBUnifiedEngine::open(&db_path)?; - Ok(EmbeddedEngine::start_custom(Arc::new(storage), Arc::new(sm), Some(config_path)).await?) + Ok( + DefaultEmbeddedEngine::start_custom(Arc::new(storage), Arc::new(sm), Some(config_path)) + .await?, + ) } // ── Tests ────────────────────────────────────────────────────────────────────── diff --git a/d-engine-server/tests/watch_and_subscriptions/watch_performance_gate_embedded.rs b/d-engine-server/tests/watch_and_subscriptions/watch_performance_gate_embedded.rs index 6bd04ccf..a58dfdc2 100644 --- a/d-engine-server/tests/watch_and_subscriptions/watch_performance_gate_embedded.rs +++ b/d-engine-server/tests/watch_and_subscriptions/watch_performance_gate_embedded.rs @@ -17,13 +17,13 @@ use std::sync::Arc; use std::time::Duration; use std::time::Instant; -use d_engine_server::api::EmbeddedEngine; +use d_engine_server::api::DefaultEmbeddedEngine; use tempfile::TempDir; use crate::common::get_available_ports; /// Helper: Create a test engine -async fn create_test_engine() -> (EmbeddedEngine, TempDir) { +async fn create_test_engine() -> (DefaultEmbeddedEngine, TempDir) { let temp_dir = TempDir::new().expect("Failed to create temp dir"); let db_path = temp_dir.path().join("db"); @@ -48,7 +48,7 @@ watcher_buffer_size = 100 let (storage, state_machine) = RocksDBUnifiedEngine::open(&db_path).expect("Failed to open unified DB"); - let engine = EmbeddedEngine::start_custom( + let engine = DefaultEmbeddedEngine::start_custom( Arc::new(storage), Arc::new(state_machine), Some(config_path.to_str().unwrap()), diff --git a/d-engine/src/lib.rs b/d-engine/src/lib.rs index 596803cd..079eb251 100644 --- a/d-engine/src/lib.rs +++ b/d-engine/src/lib.rs @@ -22,7 +22,9 @@ pub mod prelude { }; #[cfg(feature = "rocksdb")] - pub use d_engine_server::{RocksDBStateMachine, RocksDBStorageEngine}; + pub use d_engine_server::{ + DefaultEmbeddedClient, DefaultEmbeddedEngine, RocksDBStateMachine, RocksDBStorageEngine, + }; #[cfg(feature = "client")] pub use d_engine_client::{Client, ClientApi, ClientBuilder}; diff --git a/examples/quick-start-embedded/src/main.rs b/examples/quick-start-embedded/src/main.rs index 4e1c3191..9b8be264 100644 --- a/examples/quick-start-embedded/src/main.rs +++ b/examples/quick-start-embedded/src/main.rs @@ -22,7 +22,7 @@ async fn main() -> std::result::Result<(), Box> { // Start embedded engine with explicit config // Config file specifies data directory and other settings - let engine = EmbeddedEngine::start_with("d-engine.toml").await?; + let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // Wait for leader election (single-node: instant) let leader = engine.wait_ready(Duration::from_secs(5)).await?; @@ -47,7 +47,7 @@ async fn main() -> std::result::Result<(), Box> { Ok(()) } -async fn run_demo(client: Arc) -> std::result::Result<(), Box> { +async fn run_demo(client: Arc) -> std::result::Result<(), Box> { println!("=== Quick Start Demo ==="); // Store workflow state diff --git a/examples/service-discovery-embedded/server.rs b/examples/service-discovery-embedded/server.rs index 8f1adb3a..6c774308 100644 --- a/examples/service-discovery-embedded/server.rs +++ b/examples/service-discovery-embedded/server.rs @@ -12,7 +12,7 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex}; use std::time::Duration; -use d_engine::EmbeddedEngine; +use d_engine::DefaultEmbeddedEngine; use d_engine::WatchEventType; use tokio::signal; @@ -27,7 +27,7 @@ async fn main() -> Result<(), Box> { println!("Starting embedded d-engine for service discovery...\n"); - let engine = EmbeddedEngine::start_with("d-engine.toml").await?; + let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; let leader = engine.wait_ready(Duration::from_secs(5)).await?; println!( diff --git a/examples/three-nodes-embedded/src/main.rs b/examples/three-nodes-embedded/src/main.rs index 2e3ebeb0..81c07d24 100644 --- a/examples/three-nodes-embedded/src/main.rs +++ b/examples/three-nodes-embedded/src/main.rs @@ -8,7 +8,7 @@ use axum::{ http::StatusCode, routing::{get, post}, }; -use d_engine::{ClientApiError, EmbeddedEngine, ErrorCode}; +use d_engine::{ClientApiError, DefaultEmbeddedEngine, ErrorCode}; use serde::{Deserialize, Serialize}; use tokio::sync::watch; @@ -60,7 +60,7 @@ async fn main() { // d-engine Integration (Start & Wait for Leader Election) // ============================================================ let engine = Arc::new( - EmbeddedEngine::start_with(&cli.config_path) + DefaultEmbeddedEngine::start_with(&cli.config_path) .await .expect("Failed to start engine"), ); @@ -135,7 +135,7 @@ async fn main() { } async fn start_health_check_server( - engine: Arc, + engine: Arc, port: u16, mut shutdown_rx: watch::Receiver<()>, ) { @@ -158,7 +158,7 @@ async fn start_health_check_server( .expect("Health check server failed"); } -async fn health_primary(State(engine): State>) -> StatusCode { +async fn health_primary(State(engine): State>) -> StatusCode { if engine.is_leader() { StatusCode::OK } else { @@ -166,7 +166,7 @@ async fn health_primary(State(engine): State>) -> StatusCode } } -async fn health_replica(State(engine): State>) -> StatusCode { +async fn health_replica(State(engine): State>) -> StatusCode { if !engine.is_leader() { StatusCode::OK } else { @@ -175,7 +175,7 @@ async fn health_replica(State(engine): State>) -> StatusCode } async fn start_business_server( - engine: Arc, + engine: Arc, port: u16, mut shutdown_rx: watch::Receiver<()>, ) { @@ -203,7 +203,7 @@ fn is_not_leader(e: &ClientApiError) -> bool { } async fn handle_put( - State(engine): State>, + State(engine): State>, Json(req): Json, ) -> (StatusCode, Json) { match engine.client().put(req.key.into_bytes(), req.value.into_bytes()).await { @@ -223,7 +223,7 @@ async fn handle_put( } async fn handle_get( - State(engine): State>, + State(engine): State>, Path(key): Path, ) -> Result, StatusCode> { match engine.client().get_eventual(key.into_bytes()).await { diff --git a/examples/three-nodes-standalone/config/n1.toml b/examples/three-nodes-standalone/config/n1.toml index 0d47e2f5..54ec4a0a 100644 --- a/examples/three-nodes-standalone/config/n1.toml +++ b/examples/three-nodes-standalone/config/n1.toml @@ -15,7 +15,6 @@ general_raft_timeout_duration_in_ms = 100 cmd_channel_capacity = 1024 ordered_channel_capacity = 1024 - [raft.election] election_timeout_min = 1000 election_timeout_max = 2000 @@ -24,6 +23,10 @@ election_timeout_max = 2000 default_policy = "LeaseRead" lease_duration_ms = 500 +[raft.read_actor] +channel_capacity = 10240 +max_drain = 2000 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations max_batch_size = 200 diff --git a/examples/three-nodes-standalone/config/n2.toml b/examples/three-nodes-standalone/config/n2.toml index 83342a3d..3ce38ad5 100644 --- a/examples/three-nodes-standalone/config/n2.toml +++ b/examples/three-nodes-standalone/config/n2.toml @@ -23,6 +23,10 @@ election_timeout_max = 2000 default_policy = "LeaseRead" lease_duration_ms = 100 +[raft.read_actor] +channel_capacity = 10240 +max_drain = 2000 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations max_batch_size = 200 diff --git a/examples/three-nodes-standalone/config/n3.toml b/examples/three-nodes-standalone/config/n3.toml index a6f7c9ee..e71a9b42 100644 --- a/examples/three-nodes-standalone/config/n3.toml +++ b/examples/three-nodes-standalone/config/n3.toml @@ -23,6 +23,10 @@ election_timeout_max = 2000 default_policy = "LeaseRead" lease_duration_ms = 500 +[raft.read_actor] +channel_capacity = 10240 +max_drain = 2000 + [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations max_batch_size = 200 From fe6ae5af5dea854f961fb948dfa232f0e60a7514 Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Sat, 30 May 2026 22:20:03 +0800 Subject: [PATCH 02/12] fix(read) #392: fix sparse KvEntry misalignment in read_handle, add ReadActor fast path for Eventual/LeaseRead MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - read_handle.rs: positional alignment bug — sparse KvEntry from read_from_state_machine was not re-aligned to keys[i]; fix with HashMap to guarantee result[i] ↔ keys[i] regardless of SM response - Delete BatchRead trait (was pub(crate)); replace with StateMachine::get_multi (default sequential impl + RocksDB / FileStateMachine snapshot-isolated overrides) - Move ReadActor to d-engine-server with TypeConfig generic; wire ReadHandle for gRPC and EmbeddedClient multi-key fast path - Fix expect_get → expect_get_multi in 3 test files - Add 5 alignment tests + 11 gRPC fast path tests --- d-engine-core/src/lib.rs | 4 - .../leader_state_test/become_follower_test.rs | 161 +++++ d-engine-core/src/read_actor.rs | 112 ---- d-engine-core/src/storage/state_machine.rs | 40 ++ .../src/storage/state_machine_test.rs | 328 ++++++++++ d-engine-server/src/api/embedded.rs | 31 +- d-engine-server/src/api/embedded_client.rs | 249 ++------ .../src/api/embedded_client_fast_path_test.rs | 135 ++++- d-engine-server/src/api/embedded_test.rs | 23 + d-engine-server/src/api/mod.rs | 5 + d-engine-server/src/api/read_handle.rs | 236 ++++++++ d-engine-server/src/api/read_handle_test.rs | 570 ++++++++++++++++++ d-engine-server/src/lib.rs | 6 + .../src/membership/membership_snapshot.rs | 2 +- .../src/network/grpc/grpc_raft_service.rs | 42 +- .../grpc/grpc_raft_service_fast_path_test.rs | 357 +++++++++++ d-engine-server/src/network/grpc/mod.rs | 3 + d-engine-server/src/node/builder.rs | 14 + d-engine-server/src/node/mod.rs | 15 + d-engine-server/src/proto_convert.rs | 28 + d-engine-server/src/read_actor.rs | 131 ++++ .../src/read_actor_test.rs | 138 ++++- .../adaptors/file/file_state_machine.rs | 10 + .../adaptors/file/file_state_machine_test.rs | 100 +++ .../adaptors/rocksdb/rocksdb_state_machine.rs | 26 + .../rocksdb/rocksdb_state_machine_test.rs | 94 +++ .../src/test_utils/mock/mock_node_builder.rs | 4 + 27 files changed, 2461 insertions(+), 403 deletions(-) delete mode 100644 d-engine-core/src/read_actor.rs create mode 100644 d-engine-server/src/api/read_handle.rs create mode 100644 d-engine-server/src/api/read_handle_test.rs create mode 100644 d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs create mode 100644 d-engine-server/src/read_actor.rs rename {d-engine-core => d-engine-server}/src/read_actor_test.rs (60%) diff --git a/d-engine-core/src/lib.rs b/d-engine-core/src/lib.rs index 43d56cf7..ab15ce29 100644 --- a/d-engine-core/src/lib.rs +++ b/d-engine-core/src/lib.rs @@ -67,7 +67,6 @@ mod purge; mod raft; mod raft_context; mod raft_role; -pub mod read_actor; mod replication; mod state_machine_handler; mod timer; @@ -129,9 +128,6 @@ pub use utils::*; pub(crate) use timer::*; -#[cfg(test)] -mod read_actor_test; - #[cfg(test)] mod command_test; #[cfg(test)] diff --git a/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs b/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs index 3d50ae17..4240bcfa 100644 --- a/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs +++ b/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs @@ -3,14 +3,27 @@ //! Safety invariant: a stepped-down leader must not allow ReadActor to serve //! stale lease reads. The shared `Arc` must be invalid immediately //! after `become_follower()` returns so any concurrent ReadActor check fails. +//! +//! # Coverage +//! - Direct call: `become_follower()` revokes lease (unit pin) +//! - End-to-end: higher-term VoteRequest → BecomeFollower → become_follower() → lease invalid +//! - End-to-end: higher-term AppendEntries → BecomeFollower → become_follower() → lease invalid +//! - End-to-end: higher-term AppendResult → BecomeFollower → become_follower() → lease invalid use std::sync::Arc; +use tokio::sync::{mpsc, watch}; + use crate::RaftNodeConfig; +use crate::event::{RaftEvent, RoleEvent}; +use crate::maybe_clone_oneshot::{MaybeCloneOneshot, RaftOneshot}; use crate::now_ms; use crate::raft_role::leader_state::LeaderState; use crate::raft_role::role_state::RaftRoleState; +use crate::test_utils::MockBuilder; use crate::test_utils::mock::MockTypeConfig; +use d_engine_proto::server::election::VoteRequest; +use d_engine_proto::server::replication::{AppendEntriesRequest, AppendEntriesResponse}; /// become_follower() revokes the shared Arc so ReadActor immediately /// returns LeaseInvalid on the very next is_valid() check. @@ -45,3 +58,151 @@ async fn test_become_follower_revokes_read_lease() { "become_follower() must revoke the shared Arc" ); } + +/// Higher-term VoteRequest → BecomeFollower event → become_follower() → lease revoked. +/// +/// End-to-end pin for the path: +/// ReceiveVoteRequest(term > current) → send_become_follower_event() +/// → Raft loop calls become_follower() → lease.revoke() +/// +/// The ReadActor holds the same Arc. After this chain the fast path +/// must return LeaseInvalid on the very next is_valid() check. +#[tokio::test] +async fn test_receive_higher_term_vote_request_revokes_lease() { + let (_graceful_tx, graceful_rx) = watch::channel(()); + let context = MockBuilder::new(graceful_rx) + .with_db_path("/tmp/test_vote_request_revokes_lease") + .build_context(); + + let mut state = LeaderState::::new(1, context.node_config.clone()); + let lease = Arc::clone(&state.shared_state.lease); + + state.test_update_lease_timestamp(); + assert!( + lease.is_valid(now_ms()), + "precondition: lease must be valid" + ); + + let (resp_tx, _resp_rx) = >::new(); + let (role_tx, mut role_rx) = mpsc::unbounded_channel(); + let event = RaftEvent::ReceiveVoteRequest( + VoteRequest { + term: 999, + candidate_id: 2, + last_log_index: 0, + last_log_term: 0, + }, + resp_tx, + ); + state.handle_raft_event(event, &context, role_tx).await.ok(); + + assert!( + matches!(role_rx.try_recv(), Ok(RoleEvent::BecomeFollower(_))), + "higher-term VoteRequest must emit BecomeFollower" + ); + + // Simulate Raft loop processing BecomeFollower. + let _ = state.become_follower().expect("become_follower must succeed"); + + assert!( + !lease.is_valid(now_ms()), + "lease must be revoked after VoteRequest step-down — ReadActor must not serve stale reads" + ); +} + +/// Higher-term AppendEntries → BecomeFollower event → become_follower() → lease revoked. +/// +/// End-to-end pin for the path: +/// AppendEntries(term > current) → send_become_follower_event() +/// → Raft loop calls become_follower() → lease.revoke() +#[tokio::test] +async fn test_receive_higher_term_append_entries_revokes_lease() { + let (_graceful_tx, graceful_rx) = watch::channel(()); + let context = MockBuilder::new(graceful_rx) + .with_db_path("/tmp/test_append_entries_revokes_lease") + .build_context(); + + let mut state = LeaderState::::new(1, context.node_config.clone()); + state.update_current_term(10); + let lease = Arc::clone(&state.shared_state.lease); + + state.test_update_lease_timestamp(); + assert!( + lease.is_valid(now_ms()), + "precondition: lease must be valid" + ); + + let (resp_tx, _resp_rx) = >::new(); + let (role_tx, mut role_rx) = mpsc::unbounded_channel(); + let event = RaftEvent::AppendEntries( + AppendEntriesRequest { + term: 11, // higher than current term 10 + leader_id: 2, + prev_log_index: 0, + prev_log_term: 0, + entries: vec![], + leader_commit_index: 0, + }, + resp_tx, + ); + state.handle_raft_event(event, &context, role_tx).await.ok(); + + assert!( + matches!(role_rx.try_recv(), Ok(RoleEvent::BecomeFollower(_))), + "higher-term AppendEntries must emit BecomeFollower" + ); + + // Simulate Raft loop processing BecomeFollower. + let _ = state.become_follower().expect("become_follower must succeed"); + + assert!( + !lease.is_valid(now_ms()), + "lease must be revoked after AppendEntries step-down" + ); +} + +/// Higher-term AppendResult → BecomeFollower event → become_follower() → lease revoked. +/// +/// End-to-end pin for the path: +/// handle_append_result(response.term > current) → send_become_follower_event() +/// → Raft loop calls become_follower() → lease.revoke() +#[tokio::test] +async fn test_append_result_higher_term_revokes_lease() { + let (_graceful_tx, graceful_rx) = watch::channel(()); + let context = MockBuilder::new(graceful_rx) + .with_db_path("/tmp/test_append_result_revokes_lease") + .build_context(); + + let mut state = LeaderState::::new(1, context.node_config.clone()); + let lease = Arc::clone(&state.shared_state.lease); + + state.test_update_lease_timestamp(); + assert!( + lease.is_valid(now_ms()), + "precondition: lease must be valid" + ); + + let (role_tx, mut role_rx) = mpsc::unbounded_channel(); + let higher_term_response = AppendEntriesResponse { + node_id: 2, + term: 999, // higher than leader term=1 + result: None, + }; + let result = state + .handle_append_result(2, Ok(higher_term_response), &context, &role_tx) + .await; + + assert!(result.is_err(), "higher-term AppendResult must return Err"); + assert!( + matches!(role_rx.try_recv(), Ok(RoleEvent::BecomeFollower(_))), + "higher-term AppendResult must emit BecomeFollower" + ); + + // Simulate Raft loop processing BecomeFollower. + let _ = state.become_follower().expect("become_follower must succeed"); + + assert!( + !lease.is_valid(now_ms()), + "lease must be revoked after AppendResult step-down" + ); +} diff --git a/d-engine-core/src/read_actor.rs b/d-engine-core/src/read_actor.rs deleted file mode 100644 index 683c79fe..00000000 --- a/d-engine-core/src/read_actor.rs +++ /dev/null @@ -1,112 +0,0 @@ -//! ReadActor — dedicated read task for Eventual and LeaseRead fast path. -//! -//! `run_read_actor` is the TiKV LocalReader equivalent: it owns `Arc` as sole -//! holder in the read path, checks `ReadLease` with a single atomic load, and serves -//! reads without entering the Raft loop. -//! -//! # Lifecycle guarantee -//! -//! The caller drops `read_tx` to signal shutdown. `run_read_actor` exits when -//! `read_rx` is drained and closed, at which point `Arc` is dropped and the -//! RocksDB LOCK is released — before `stop()` signals the Raft loop. - -use std::sync::Arc; - -use bytes::Bytes; -use tokio::sync::{mpsc, oneshot}; - -use crate::ReadLease; -use crate::StateMachine; -use crate::config::ReadConsistencyPolicy; -use crate::now_ms; - -/// A single read request sent from `EmbeddedClient` to the `ReadActor`. -/// -/// Only `EventualConsistency` and `LeaseRead` are valid here. -/// `LinearizableRead` must go through `cmd_tx` (Raft readIndex protocol). -pub struct ReadCmd { - pub key: Bytes, - pub consistency: ReadConsistencyPolicy, - pub reply: oneshot::Sender, ReadActorError>>, -} - -/// Error returned by the ReadActor to the caller. -/// -/// `LeaseInvalid` and `SmStopped` are recoverable: the caller should -/// fall back to `cmd_tx` for a Raft-backed read. -#[derive(Debug)] -pub enum ReadActorError { - /// Lease has been revoked or expired. Retry via cmd_tx. - LeaseInvalid, - /// State machine is not running (node is stopping). Retry via cmd_tx. - SmStopped, - /// SM returned an error. - SmError(String), -} - -/// Run the ReadActor loop until `read_rx` is closed. -/// -/// Designed to be spawned as an independent task: -/// ```ignore -/// let handle = tokio::spawn(run_read_actor(read_rx, lease, sm, max_drain)); -/// ``` -/// -/// `max_drain` caps how many commands are drained per wake-up (mirrors -/// `batching.max_batch_size` in the Raft loop). After the first `recv().await` -/// unblocks, the actor drains up to `max_drain` pending commands with -/// `try_recv()` before yielding back to the executor — amortizing the -/// task-switch cost across batches of requests. -/// -/// When the caller drops `read_tx`, the loop exits and `Arc` is released. -pub async fn run_read_actor( - mut read_rx: mpsc::Receiver, - lease: Arc, - sm: Arc, - max_drain: usize, -) where - SM: StateMachine, -{ - while let Some(cmd) = read_rx.recv().await { - // Process the command that woke us up. - let reply = serve_read(&cmd, &lease, &sm); - let _ = cmd.reply.send(reply); - - // Drain commands that arrived while processing, without going back to - // sleep — same pattern as Raft::drain_client_cmds(). - let mut count = 1; - while count < max_drain { - match read_rx.try_recv() { - Ok(cmd) => { - let reply = serve_read(&cmd, &lease, &sm); - let _ = cmd.reply.send(reply); - count += 1; - } - Err(_) => break, - } - } - } - // read_rx closed → sm drops here if this is the last Arc reference -} - -fn serve_read( - cmd: &ReadCmd, - lease: &Arc, - sm: &Arc, -) -> Result, ReadActorError> { - match cmd.consistency { - ReadConsistencyPolicy::EventualConsistency => { - if !sm.is_running() { - return Err(ReadActorError::SmStopped); - } - } - ReadConsistencyPolicy::LeaseRead => { - if !lease.is_valid(now_ms()) || !sm.is_running() { - return Err(ReadActorError::LeaseInvalid); - } - } - // LinearizableRead must not reach ReadActor — guard defensively - _ => return Err(ReadActorError::LeaseInvalid), - } - - sm.get(cmd.key.as_ref()).map_err(|e| ReadActorError::SmError(e.to_string())) -} diff --git a/d-engine-core/src/storage/state_machine.rs b/d-engine-core/src/storage/state_machine.rs index 42613c4b..2a09721a 100644 --- a/d-engine-core/src/storage/state_machine.rs +++ b/d-engine-core/src/storage/state_machine.rs @@ -96,6 +96,46 @@ pub trait StateMachine: Send + Sync + 'static { key_buffer: &[u8], ) -> Result, Error>; + /// Retrieves multiple values by key from the state machine in a single call. + /// + /// # Why this belongs in the protocol layer + /// + /// `get()` is already part of the protocol interface because the ReadActor hot path + /// requires direct SM access. `get_multi` is its natural batch extension — the same + /// reasoning applies. An Iterator's `fold` has a default impl; `Vec` overrides it for + /// performance. Users don't need to know which path executes. + /// + /// # Read coherence requirement + /// + /// The consistency unit is the **request**, not the key. All returned values must + /// come from the same applied state. A torn read — key A from apply index 100, + /// key B from apply index 105 — is a correctness violation in coordinator workloads: + /// + /// - Service registry: addr=v2 + version=v2.2 routes traffic to the wrong instance + /// - Leader election: leader=node-3 + term=43 is a phantom state that never existed + /// - Quota management: used=850 with a reset window_start blocks valid requests + /// + /// etcd (Range + MVCC), TiKV RawKV (BatchGet + RocksDB snapshot), and Consul stale + /// reads all guarantee snapshot consistency even in eventual/stale modes. + /// + /// # Default implementation + /// + /// Calls `get()` sequentially. Correct when the caller holds no write locks, but + /// does not guarantee snapshot isolation under concurrent writes. Override in + /// implementations that support it (RocksDB `db.snapshot()`, FileStateMachine + /// read-lock held for the full batch). + /// + /// # Position contract + /// + /// `result[i]` corresponds to `keys[i]`. Missing keys produce `None` at their + /// position; the result length always equals `keys.len()`. + fn get_multi( + &self, + keys: &[Bytes], + ) -> Result>, Error> { + keys.iter().map(|k| self.get(k)).collect() + } + /// Returns the term of a specific log entry by its ID. /// Sync operation as it queries in-memory data. fn entry_term( diff --git a/d-engine-core/src/storage/state_machine_test.rs b/d-engine-core/src/storage/state_machine_test.rs index e51e8ee3..c265b1bc 100644 --- a/d-engine-core/src/storage/state_machine_test.rs +++ b/d-engine-core/src/storage/state_machine_test.rs @@ -48,6 +48,14 @@ impl StateMachineTestSuite { Self::test_ungraceful_shutdown_recovery(&builder).await?; Self::test_reset_operation(builder.build().await?).await?; + Self::test_get_multi_returns_values_in_key_order(builder.build().await?).await?; + Self::test_get_multi_absent_keys_return_none(builder.build().await?).await?; + Self::test_get_multi_empty_keys_returns_empty(builder.build().await?).await?; + Self::test_get_multi_partial_hit_some_keys_missing(builder.build().await?).await?; + Self::test_get_multi_service_registry_coherence(builder.build().await?).await?; + Self::test_get_multi_election_state_coherence(builder.build().await?).await?; + Self::test_get_multi_quota_management_coherence(builder.build().await?).await?; + builder.cleanup().await?; Ok(()) } @@ -834,6 +842,326 @@ impl StateMachineTestSuite { Ok(()) } + + // ── get_multi tests ─────────────────────────────────────────────────────── + + /// Verify that get_multi preserves input key order in its output. + /// + /// The caller maps result[i] back to keys[i] without a key lookup. + /// Any reordering silently breaks that mapping. + pub async fn test_get_multi_returns_values_in_key_order( + sm: Arc + ) -> Result<(), Error> { + sm.apply_chunk(&[ + create_insert_entry(1, Bytes::from("key_a"), Bytes::from("value_a")), + create_insert_entry(2, Bytes::from("key_b"), Bytes::from("value_b")), + create_insert_entry(3, Bytes::from("key_c"), Bytes::from("value_c")), + ]) + .await?; + + // Request in reverse alphabetical order to catch any accidental sorting. + let keys = vec![ + Bytes::from("key_c"), + Bytes::from("key_a"), + Bytes::from("key_b"), + ]; + let values = sm.get_multi(&keys)?; + + assert_eq!(values.len(), 3, "result length must match key count"); + assert_eq!( + values[0], + Some(Bytes::from("value_c")), + "position 0 = key_c" + ); + assert_eq!( + values[1], + Some(Bytes::from("value_a")), + "position 1 = key_a" + ); + assert_eq!( + values[2], + Some(Bytes::from("value_b")), + "position 2 = key_b" + ); + Ok(()) + } + + /// Verify that absent keys produce None entries, not errors or panics. + /// + /// Callers rely on None to distinguish "key not found" from a storage failure. + /// Returning Err for a missing key would force callers to treat a normal business + /// state (no registration yet) as an error. + pub async fn test_get_multi_absent_keys_return_none( + sm: Arc + ) -> Result<(), Error> { + let keys = vec![Bytes::from("ghost_1"), Bytes::from("ghost_2")]; + let values = sm.get_multi(&keys)?; + + assert_eq!(values.len(), 2); + assert!(values[0].is_none(), "absent key must return None, not Err"); + assert!(values[1].is_none(), "absent key must return None, not Err"); + Ok(()) + } + + /// Verify that an empty key slice returns an empty result without error. + /// + /// Callers may pass an empty slice when the coordinator has no keys to fetch + /// (e.g., an empty service namespace). The implementation must not panic or + /// return an error in this case. + pub async fn test_get_multi_empty_keys_returns_empty( + sm: Arc + ) -> Result<(), Error> { + let values = sm.get_multi(&[])?; + assert!( + values.is_empty(), + "empty key list must produce empty result" + ); + Ok(()) + } + + /// Verify that a mix of present and absent keys returns Some/None correctly. + /// + /// The position contract must hold even when some slots are None. + /// A naive implementation that skips missing keys and compacts the result + /// would shift positions, silently misrouting values to wrong fields. + pub async fn test_get_multi_partial_hit_some_keys_missing( + sm: Arc + ) -> Result<(), Error> { + sm.apply_chunk(&[create_insert_entry( + 1, + Bytes::from("present"), + Bytes::from("v"), + )]) + .await?; + + let keys = vec![ + Bytes::from("missing_before"), + Bytes::from("present"), + Bytes::from("missing_after"), + ]; + let values = sm.get_multi(&keys)?; + + assert_eq!( + values.len(), + 3, + "result length must equal key count even with gaps" + ); + assert!( + values[0].is_none(), + "missing_before must be None at position 0" + ); + assert_eq!( + values[1], + Some(Bytes::from("v")), + "present must have value at position 1" + ); + assert!( + values[2].is_none(), + "missing_after must be None at position 2" + ); + Ok(()) + } + + /// Service registry coordinator scenario: batch read must not produce a torn state. + /// + /// In distributed service routing, (addr, version, health) must all come from + /// the same applied state. A torn read — addr from apply index 100, version from + /// index 105 — would cause traffic to route to the old instance while the client + /// believes it runs the new version, breaking gray-release correctness. + /// + /// This test verifies that after a full v2 deployment, get_multi returns all three + /// fields from v2 with no v1 values mixed in. + pub async fn test_get_multi_service_registry_coherence( + sm: Arc + ) -> Result<(), Error> { + // v1: initial deployment + sm.apply_chunk(&[ + create_insert_entry( + 1, + Bytes::from("/service/payment/addr"), + Bytes::from("10.0.0.1:8080"), + ), + create_insert_entry( + 2, + Bytes::from("/service/payment/version"), + Bytes::from("v2.2"), + ), + create_insert_entry( + 3, + Bytes::from("/service/payment/health"), + Bytes::from("healthy"), + ), + ]) + .await?; + + // v2: new deployment — all three fields transition together + sm.apply_chunk(&[ + create_insert_entry( + 4, + Bytes::from("/service/payment/addr"), + Bytes::from("10.0.0.2:8080"), + ), + create_insert_entry( + 5, + Bytes::from("/service/payment/version"), + Bytes::from("v2.3"), + ), + create_insert_entry( + 6, + Bytes::from("/service/payment/health"), + Bytes::from("starting"), + ), + ]) + .await?; + + let keys = vec![ + Bytes::from("/service/payment/addr"), + Bytes::from("/service/payment/version"), + Bytes::from("/service/payment/health"), + ]; + let values = sm.get_multi(&keys)?; + + assert_eq!(values.len(), 3); + // All three must reflect the v2 state consistently. + // Any mix (e.g., addr=v2 + version=v2.2) is a torn read. + assert_eq!( + values[0], + Some(Bytes::from("10.0.0.2:8080")), + "addr must be v2.3 instance" + ); + assert_eq!(values[1], Some(Bytes::from("v2.3")), "version must be v2.3"); + assert_eq!( + values[2], + Some(Bytes::from("starting")), + "health must be v2.3 startup value" + ); + Ok(()) + } + + /// Leader election coordinator scenario: batch read must not produce a phantom state. + /// + /// (leader, term, lease_expire) must be internally consistent. A torn read can + /// produce a combination that never existed — e.g., leader=node-3 (old term) with + /// term=43 (new term). A coordinator observing this phantom state may incorrectly + /// conclude that node-3 holds a lease in term 43 and take split-brain actions. + /// + /// This test verifies that after a term transition, get_multi returns all three + /// fields from the new term with no old-term values mixed in. + pub async fn test_get_multi_election_state_coherence( + sm: Arc + ) -> Result<(), Error> { + // Term 42: node-3 is leader + sm.apply_chunk(&[ + create_insert_entry(1, Bytes::from("/election/leader"), Bytes::from("node-3")), + create_insert_entry(2, Bytes::from("/election/term"), Bytes::from("42")), + create_insert_entry( + 3, + Bytes::from("/election/lease_expire"), + Bytes::from("1748600000"), + ), + ]) + .await?; + + // Term 43: node-5 wins new election + sm.apply_chunk(&[ + create_insert_entry(4, Bytes::from("/election/leader"), Bytes::from("node-5")), + create_insert_entry(5, Bytes::from("/election/term"), Bytes::from("43")), + create_insert_entry( + 6, + Bytes::from("/election/lease_expire"), + Bytes::from("1748603600"), + ), + ]) + .await?; + + let keys = vec![ + Bytes::from("/election/leader"), + Bytes::from("/election/term"), + Bytes::from("/election/lease_expire"), + ]; + let values = sm.get_multi(&keys)?; + + assert_eq!(values.len(), 3); + // Must reflect term-43 state consistently. + // leader=node-3 + term=43 is a phantom state that never existed. + assert_eq!( + values[0], + Some(Bytes::from("node-5")), + "leader must be node-5 (term 43)" + ); + assert_eq!(values[1], Some(Bytes::from("43")), "term must be 43"); + assert_eq!( + values[2], + Some(Bytes::from("1748603600")), + "lease_expire must be term-43 value" + ); + Ok(()) + } + + /// Quota management coordinator scenario: batch read must return coherent counters. + /// + /// (limit, used, window_start) from different apply indexes produce incorrect + /// rate-limit calculations — a pure business correctness failure that is independent + /// of Linearizable semantics. Reading used=850 with a new window_start makes the + /// rate limiter reject requests that should be allowed in the new window. + /// + /// This test verifies that after a window reset, get_multi returns all three + /// counters from the new window with no old-window values mixed in. + pub async fn test_get_multi_quota_management_coherence( + sm: Arc + ) -> Result<(), Error> { + // Window 1: tenant-A has consumed 850 of their 1000 quota + sm.apply_chunk(&[ + create_insert_entry(1, Bytes::from("/quota/tenant-A/limit"), Bytes::from("1000")), + create_insert_entry(2, Bytes::from("/quota/tenant-A/used"), Bytes::from("850")), + create_insert_entry( + 3, + Bytes::from("/quota/tenant-A/window_start"), + Bytes::from("1748599900"), + ), + ]) + .await?; + + // Window 2: quota window resets — used counter goes back to 0 + sm.apply_chunk(&[ + create_insert_entry(4, Bytes::from("/quota/tenant-A/limit"), Bytes::from("1000")), + create_insert_entry(5, Bytes::from("/quota/tenant-A/used"), Bytes::from("0")), + create_insert_entry( + 6, + Bytes::from("/quota/tenant-A/window_start"), + Bytes::from("1748603500"), + ), + ]) + .await?; + + let keys = vec![ + Bytes::from("/quota/tenant-A/limit"), + Bytes::from("/quota/tenant-A/used"), + Bytes::from("/quota/tenant-A/window_start"), + ]; + let values = sm.get_multi(&keys)?; + + assert_eq!(values.len(), 3); + // Must read window-2 consistently. + // used=850 + window_start from window-2 is a torn read that wrongly + // blocks requests that should be free in the new window. + assert_eq!( + values[0], + Some(Bytes::from("1000")), + "limit is unchanged across windows" + ); + assert_eq!( + values[1], + Some(Bytes::from("0")), + "used must be 0 after window reset" + ); + assert_eq!( + values[2], + Some(Bytes::from("1748603500")), + "window_start must be from window-2" + ); + Ok(()) + } } /// Helper function to create an Insert ApplyEntry diff --git a/d-engine-server/src/api/embedded.rs b/d-engine-server/src/api/embedded.rs index 9f48c9cb..b0785fb3 100644 --- a/d-engine-server/src/api/embedded.rs +++ b/d-engine-server/src/api/embedded.rs @@ -135,12 +135,10 @@ use crate::StorageEngine; use crate::node::NodeBuilder; use crate::node::RaftTypeConfig; use d_engine_core::TypeConfig; -use d_engine_core::read_actor::run_read_actor; use std::fmt::Debug; use std::sync::Arc; use std::time::Duration; use tokio::sync::Mutex; -use tokio::sync::mpsc; use tokio::sync::watch; use tokio::task::JoinHandle; use tracing::error; @@ -154,9 +152,6 @@ struct Inner { membership_rx: watch::Receiver, is_stopped: Mutex, node_id: u32, - /// ReadActor task handle. Aborted during stop() before the Raft node shuts down, - /// ensuring Arc (and the RocksDB LOCK) is released before stop() returns. - read_actor_handle: Mutex>>, } /// Embedded d-engine with automatic lifecycle management. @@ -352,23 +347,12 @@ where let node = NodeBuilder::init(node_config, shutdown_rx) .storage_engine(storage_engine) - .state_machine(state_machine.clone()) + .state_machine(state_machine) .start() .await?; let leader_elected_rx = node.leader_change_notifier(); let membership_rx = node.membership_change_notifier(); - let read_lease = node.read_lease(); - - // Start ReadActor: sole owner of Arc on the read path. - let (read_tx, read_rx) = mpsc::channel(node.node_config.raft.read_actor.channel_capacity); - let max_drain = node.node_config.raft.read_actor.max_drain; - let read_actor_handle = tokio::spawn(run_read_actor( - read_rx, - read_lease, - state_machine, - max_drain, - )); let client = { let base = EmbeddedClient::new_internal( @@ -377,7 +361,7 @@ where node.node_id, Duration::from_millis(node.node_config.raft.general_raft_timeout_duration_in_ms), ) - .with_read_actor(read_tx); + .with_read_handle(node.read_handle.clone()); #[cfg(feature = "watch")] let base = { @@ -413,7 +397,6 @@ where membership_rx, is_stopped: Mutex::new(false), node_id, - read_actor_handle: Mutex::new(Some(read_actor_handle)), }), }) } @@ -650,16 +633,6 @@ impl EmbeddedEngine { info!("Stopping embedded d-engine"); - // Abort ReadActor first so Arc drops and RocksDB LOCK is released - // before the Raft node exits. Any in-flight reads will get a channel-closed - // error, which is acceptable during shutdown. - let mut ra_handle = self.inner.read_actor_handle.lock().await; - if let Some(handle) = ra_handle.take() { - handle.abort(); - let _ = handle.await; // expect JoinError::Cancelled - } - drop(ra_handle); - // Send shutdown signal to Raft node let _ = self.inner.shutdown_tx.send(()); diff --git a/d-engine-server/src/api/embedded_client.rs b/d-engine-server/src/api/embedded_client.rs index 0c5ff671..5e14f9c5 100644 --- a/d-engine-server/src/api/embedded_client.rs +++ b/d-engine-server/src/api/embedded_client.rs @@ -26,115 +26,23 @@ use d_engine_core::RaftEvent; use d_engine_core::RaftOneshot; use d_engine_core::ScanResult; use d_engine_core::TypeConfig; +#[cfg(feature = "watch")] +use d_engine_core::client::ClientApiError; use d_engine_core::client::{ - ClientApi, ClientApiError, ClientApiResult, ClientReadRequest, ClientResponsePayload, - ClientWriteRequest, ErrorCode, LeaderHint, ReadResults, WriteOperation, + ClientApi, ClientApiResult, ClientResponsePayload, ClientWriteRequest, ErrorCode, + WriteOperation, }; use d_engine_core::config::ReadConsistencyPolicy; -use d_engine_core::read_actor::{ReadActorError, ReadCmd}; use tokio::sync::mpsc; -use tokio::sync::oneshot; + +use super::read_handle::ReadHandle; +pub(crate) use super::read_handle::{ + channel_closed_error, map_error_response, server_error, timeout_error, +}; #[cfg(feature = "watch")] use d_engine_core::watch::WatchRegistry; -// ============================================================================ -// Error helpers - simplify ClientApiError construction for embedded client -// ============================================================================ - -fn channel_closed_error() -> ClientApiError { - ClientApiError::Network { - code: ErrorCode::ConnectionTimeout, - message: "Channel closed, node may be shutting down".to_string(), - retry_after_ms: None, - leader_hint: None, - } -} - -fn timeout_error(duration: Duration) -> ClientApiError { - ClientApiError::Network { - code: ErrorCode::ConnectionTimeout, - message: format!("Operation timed out after {duration:?}"), - retry_after_ms: Some(1000), - leader_hint: None, - } -} - -fn not_leader_error( - leader_id: Option, - leader_address: Option, - retry_after_ms: Option, -) -> ClientApiError { - let message = match (&leader_address, &leader_id) { - (Some(addr), _) => format!("Not leader, try leader at: {addr}"), - (None, Some(id)) => format!("Not leader, leader_id: {id}"), - (None, None) => "Not leader".to_string(), - }; - - let leader_hint = match (&leader_id, &leader_address) { - (Some(id_str), Some(addr)) => id_str.parse::().ok().map(|id| LeaderHint { - leader_id: id, - address: addr.clone(), - }), - _ => None, - }; - - ClientApiError::Network { - code: ErrorCode::NotLeader, - message, - retry_after_ms: retry_after_ms.or(Some(100)), - leader_hint, - } -} - -fn server_error(msg: String) -> ClientApiError { - ClientApiError::Business { - code: ErrorCode::Uncategorized, - message: msg, - required_action: None, - } -} - -fn map_error_response( - error: ErrorCode, - leader_hint: Option, - retry_after_ms: Option, -) -> ClientApiError { - match error { - ErrorCode::NotLeader => { - let (leader_id, leader_address) = if let Some(hint) = leader_hint { - (Some(hint.leader_id.to_string()), Some(hint.address)) - } else { - (None, None) - }; - not_leader_error(leader_id, leader_address, retry_after_ms) - } - _ => server_error(format!("Error code: {error:?}")), - } -} - -/// Unwrap a `ClientResponsePayload` as a `ReadResults`, returning a -/// `Protocol { InvalidResponse }` error for any other variant. -/// -/// Centralises the match so both `get_with_consistency` and -/// `get_multi_with_consistency` share identical error semantics, and so -/// the logic can be unit-tested without standing up a full Raft channel. -fn extract_read_payload(result: Option) -> ClientApiResult { - match result { - Some(ClientResponsePayload::Read(r)) => Ok(r), - Some(ClientResponsePayload::Write(_)) => Err(ClientApiError::Protocol { - code: ErrorCode::InvalidResponse, - message: "expected ReadData payload, got WriteResult".to_string(), - supported_versions: None, - }), - None => Err(ClientApiError::Protocol { - code: ErrorCode::InvalidResponse, - message: "expected ReadData payload, got None".to_string(), - supported_versions: None, - }), - } -} - /// Zero-overhead KV client for embedded mode. Obtained via `EmbeddedEngine::client()`. /// /// `T` is the [`TypeConfig`] that carries the concrete `StateMachine` type, enabling @@ -143,12 +51,9 @@ fn extract_read_payload(result: Option) -> ClientApiResul /// For standalone/gRPC mode use `GrpcClient` instead. Both implement `ClientApi`. pub struct EmbeddedClient { event_tx: mpsc::Sender, - cmd_tx: mpsc::Sender, + read_handle: ReadHandle, client_id: u32, timeout: Duration, - /// ReadActor sender for `EventualConsistency` and `LeaseRead` fast path. - /// `None` if fast path is unavailable (e.g. during shutdown). - read_tx: Option>, #[cfg(feature = "watch")] watch_registry: Option>, _phantom: PhantomData T>, @@ -158,10 +63,9 @@ impl Clone for EmbeddedClient { fn clone(&self) -> Self { Self { event_tx: self.event_tx.clone(), - cmd_tx: self.cmd_tx.clone(), + read_handle: self.read_handle.clone(), client_id: self.client_id, timeout: self.timeout, - read_tx: self.read_tx.clone(), #[cfg(feature = "watch")] watch_registry: self.watch_registry.clone(), _phantom: PhantomData, @@ -179,22 +83,21 @@ impl EmbeddedClient { ) -> Self { Self { event_tx, - cmd_tx, + read_handle: ReadHandle::new(None, cmd_tx), client_id, timeout, - read_tx: None, #[cfg(feature = "watch")] watch_registry: None, _phantom: PhantomData, } } - /// Wire the ReadActor sender into the client. Called by EmbeddedEngine after node start. - pub(crate) fn with_read_actor( + /// Wire the ReadHandle (fast path + cmd_tx) into the client. + pub(crate) fn with_read_handle( mut self, - read_tx: mpsc::Sender, + rh: ReadHandle, ) -> Self { - self.read_tx = Some(read_tx); + self.read_handle = rh; self } @@ -229,7 +132,8 @@ impl EmbeddedClient { let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - self.cmd_tx + self.read_handle + .cmd_tx .send(d_engine_core::ClientCmd::Propose(request, resp_tx)) .await .map_err(|_| channel_closed_error())?; @@ -326,67 +230,9 @@ impl EmbeddedClient { key: impl AsRef<[u8]>, consistency: ReadConsistencyPolicy, ) -> ClientApiResult> { - // Fast path: EventualConsistency and LeaseRead bypass cmd_tx via ReadActor. - if let Some(read_tx) = &self.read_tx { - let fast_path = matches!( - consistency, - ReadConsistencyPolicy::EventualConsistency | ReadConsistencyPolicy::LeaseRead - ); - if fast_path { - let (reply_tx, reply_rx) = oneshot::channel(); - if read_tx - .send(ReadCmd { - key: Bytes::copy_from_slice(key.as_ref()), - consistency: consistency.clone(), - reply: reply_tx, - }) - .await - .is_ok() - { - match reply_rx.await { - Ok(Ok(value)) => return Ok(value), - Ok(Err(ReadActorError::SmError(e))) => return Err(server_error(e)), - // LeaseInvalid / SmStopped → fall through to cmd_tx - Ok(Err(ReadActorError::LeaseInvalid | ReadActorError::SmStopped)) => {} - // ReadActor exited without replying (engine stopping) → fall through - Err(_) => {} - } - } - // Channel closed (engine stopping) → fall through to cmd_tx - } - } - - let request = ClientReadRequest { - client_id: self.client_id, - keys: vec![Bytes::copy_from_slice(key.as_ref())], - consistency_policy: Some(consistency), - }; - - let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - - self.cmd_tx - .send(d_engine_core::ClientCmd::Read(request, resp_tx)) + self.read_handle + .get(key.as_ref(), consistency, self.client_id, self.timeout) .await - .map_err(|_| channel_closed_error())?; - - let result = tokio::time::timeout(self.timeout, resp_rx) - .await - .map_err(|_| timeout_error(self.timeout))? - .map_err(|_| channel_closed_error())?; - - let response = - result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; - - if response.error != ErrorCode::Success { - return Err(map_error_response( - response.error, - response.leader_hint, - response.retry_after_ms, - )); - } - - let read_results = extract_read_payload(response.result)?; - Ok(read_results.entries.first().map(|e| e.value.clone())) } /// Get multiple keys with linearizable consistency. @@ -424,47 +270,17 @@ impl EmbeddedClient { } /// Advanced: Get multiple keys with explicit consistency policy. + /// + /// Eventual and LeaseRead policies use the ReadActor fast path (no Raft round-trip). + /// LinearizableRead always goes through the Raft readIndex protocol via cmd_tx. pub async fn get_multi_with_consistency( &self, keys: &[Bytes], consistency: ReadConsistencyPolicy, ) -> ClientApiResult>> { - let request = ClientReadRequest { - client_id: self.client_id, - keys: keys.to_vec(), - consistency_policy: Some(consistency), - }; - - let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - - self.cmd_tx - .send(d_engine_core::ClientCmd::Read(request, resp_tx)) + self.read_handle + .get_batch(keys, consistency, self.client_id, self.timeout) .await - .map_err(|_| channel_closed_error())?; - - let result = tokio::time::timeout(self.timeout, resp_rx) - .await - .map_err(|_| timeout_error(self.timeout))? - .map_err(|_| channel_closed_error())?; - - let response = - result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; - - if response.error != ErrorCode::Success { - return Err(map_error_response( - response.error, - response.leader_hint, - response.retry_after_ms, - )); - } - - let read_results = extract_read_payload(response.result)?; - // Reconstruct result vector in requested key order. - // Server only returns results for keys that exist, so we must - // map by key to preserve positional correspondence with input. - let results_by_key: std::collections::HashMap<_, _> = - read_results.entries.into_iter().map(|e| (e.key, e.value)).collect(); - Ok(keys.iter().map(|k| results_by_key.get(k).cloned()).collect()) } /// Delete a key-value pair with strong consistency. @@ -485,7 +301,8 @@ impl EmbeddedClient { let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - self.cmd_tx + self.read_handle + .cmd_tx .send(d_engine_core::ClientCmd::Propose(request, resp_tx)) .await .map_err(|_| channel_closed_error())?; @@ -701,7 +518,8 @@ impl EmbeddedClient { ) -> ClientApiResult { let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - self.cmd_tx + self.read_handle + .cmd_tx .send(d_engine_core::ClientCmd::Scan( Bytes::copy_from_slice(prefix.as_ref()), resp_tx, @@ -779,7 +597,8 @@ impl ClientApi for EmbeddedClient { let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - self.cmd_tx + self.read_handle + .cmd_tx .send(d_engine_core::ClientCmd::Propose(request, resp_tx)) .await .map_err(|_| channel_closed_error())?; @@ -841,7 +660,8 @@ impl ClientApi for EmbeddedClient { let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - self.cmd_tx + self.read_handle + .cmd_tx .send(d_engine_core::ClientCmd::Propose(request, resp_tx)) .await .map_err(|_| channel_closed_error())?; @@ -924,8 +744,9 @@ impl ClientApi for EmbeddedClient { #[cfg(test)] mod error_helper_tests { - use d_engine_core::client::KvEntry; + use d_engine_core::client::{KvEntry, LeaderHint, ReadResults}; + use super::super::read_handle::{extract_read_payload, not_leader_error}; use super::*; // ─── not_leader_error ──────────────────────────────────────────────────── diff --git a/d-engine-server/src/api/embedded_client_fast_path_test.rs b/d-engine-server/src/api/embedded_client_fast_path_test.rs index f86767c3..f95b0981 100644 --- a/d-engine-server/src/api/embedded_client_fast_path_test.rs +++ b/d-engine-server/src/api/embedded_client_fast_path_test.rs @@ -12,15 +12,16 @@ mod fast_path_tests { use std::sync::Arc; use std::time::Duration; + use crate::read_actor::run_read_actor; use bytes::Bytes; use d_engine_core::MockTypeConfig; use d_engine_core::config::ReadConsistencyPolicy; - use d_engine_core::read_actor::run_read_actor; use d_engine_core::{MockStateMachine, ReadLease, now_ms}; use tokio::sync::mpsc; use tokio::task::JoinHandle; use super::super::embedded_client::EmbeddedClient; + use super::super::read_handle::ReadHandle; // ── Helpers ─────────────────────────────────────────────────────────────── @@ -45,9 +46,13 @@ mod fast_path_tests { } let ra_handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); - let client = - EmbeddedClient::new_internal(make_event_tx(), cmd_tx, 1, Duration::from_millis(100)) - .with_read_actor(read_tx); + let client = EmbeddedClient::new_internal( + make_event_tx(), + cmd_tx.clone(), + 1, + Duration::from_millis(100), + ) + .with_read_handle(ReadHandle::new(Some(read_tx), cmd_tx)); (client, ra_handle) } @@ -72,14 +77,15 @@ mod fast_path_tests { fn sm_running_with_value(value: Bytes) -> MockStateMachine { let mut sm = MockStateMachine::new(); sm.expect_is_running().returning(|| true); - sm.expect_get().returning(move |_| Ok(Some(value.clone()))); + sm.expect_get_multi() + .returning(move |keys| Ok(keys.iter().map(|_| Some(value.clone())).collect())); sm } fn sm_running_missing_key() -> MockStateMachine { let mut sm = MockStateMachine::new(); sm.expect_is_running().returning(|| true); - sm.expect_get().returning(|_| Ok(None)); + sm.expect_get_multi().returning(|keys| Ok(keys.iter().map(|_| None).collect())); sm } @@ -125,8 +131,8 @@ mod fast_path_tests { async fn test_get_lease_fallback_when_lease_revoked() { let mut sm = MockStateMachine::new(); sm.expect_is_running().returning(|| true); - // get() must not be called — ReadActor short-circuits on LeaseInvalid - sm.expect_get().never(); + // get_multi() must not be called — ReadActor short-circuits on LeaseInvalid + sm.expect_get_multi().never(); let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; @@ -141,7 +147,7 @@ mod fast_path_tests { async fn test_get_lease_fallback_when_lease_expired() { let mut sm = MockStateMachine::new(); sm.expect_is_running().returning(|| true); - sm.expect_get().never(); + sm.expect_get_multi().never(); let (client, handle) = client_with_read_actor(sm, expired_lease(), true).await; let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; @@ -198,9 +204,9 @@ mod fast_path_tests { // ── No fast path without read_tx ────────────────────────────────────────── - /// Client without with_read_actor() always routes through cmd_tx. + /// Client without with_read_handle() (read_tx=None) always routes through cmd_tx. #[tokio::test] - async fn test_no_fast_path_without_with_read_actor_call() { + async fn test_no_fast_path_without_read_handle() { let (cmd_tx, cmd_rx) = mpsc::channel(1); drop(cmd_rx); let client: EmbeddedClient = @@ -247,7 +253,7 @@ mod fast_path_tests { async fn test_sm_error_returned_directly_without_cmd_tx_fallback() { let mut sm = MockStateMachine::new(); sm.expect_is_running().returning(|| true); - sm.expect_get() + sm.expect_get_multi() .returning(|_| Err(d_engine_core::Error::Fatal("disk I/O failure".into()))); let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; @@ -269,16 +275,20 @@ mod fast_path_tests { #[tokio::test] async fn test_fast_path_fallback_when_read_actor_channel_closed() { let sm = sm_running_with_value(Bytes::from("v")); - let (read_tx, read_rx) = mpsc::channel::(1); + let (read_tx, read_rx) = mpsc::channel::(1); let (cmd_tx, cmd_rx) = mpsc::channel(1); drop(cmd_rx); // cmd_tx closed for fallback verification // Drop read_rx immediately → channel is closed from the receiver side. drop(read_rx); - let client: EmbeddedClient = - EmbeddedClient::new_internal(make_event_tx(), cmd_tx, 1, Duration::from_millis(100)) - .with_read_actor(read_tx); + let client: EmbeddedClient = EmbeddedClient::new_internal( + make_event_tx(), + cmd_tx.clone(), + 1, + Duration::from_millis(100), + ) + .with_read_handle(ReadHandle::new(Some(read_tx), cmd_tx)); // Send to a closed channel → is_ok() == false → falls through to cmd_tx → error let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; @@ -290,4 +300,97 @@ mod fast_path_tests { // Suppress unused SM warning drop(sm); } + + // ── get_multi_with_consistency fast path ────────────────────────────────── + + fn sm_running_with_multi_values(vals: Vec<(&'static [u8], &'static [u8])>) -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi().returning(move |keys| { + Ok(keys + .iter() + .map(|k| { + for (key, val) in &vals { + if &k[..] == *key { + return Some(Bytes::from_static(val)); + } + } + None + }) + .collect()) + }); + sm + } + + /// get_multi_with_consistency Eventual with valid SM → ReadActor fast path. + /// cmd_rx dropped: Ok proves fast path was taken. + #[tokio::test] + async fn test_get_multi_eventual_fast_path_returns_values() { + let sm = sm_running_with_multi_values(vec![(b"k1", b"v1"), (b"k2", b"v2")]); + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = client + .get_multi_with_consistency(&keys, ReadConsistencyPolicy::EventualConsistency) + .await; + + let values = result.unwrap(); + assert_eq!(values.len(), 2); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(values[1], Some(Bytes::from_static(b"v2"))); + drop(client); + handle.await.unwrap(); + } + + /// get_multi_with_consistency LeaseRead with valid lease → fast path. + #[tokio::test] + async fn test_get_multi_lease_read_fast_path_returns_values() { + let sm = sm_running_with_multi_values(vec![(b"k1", b"v1")]); + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"missing")]; + let result = + client.get_multi_with_consistency(&keys, ReadConsistencyPolicy::LeaseRead).await; + + let values = result.unwrap(); + assert_eq!(values.len(), 2); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(values[1], None); + drop(client); + handle.await.unwrap(); + } + + /// get_multi_with_consistency LeaseRead revoked → fallback to cmd_tx. + #[tokio::test] + async fn test_get_multi_lease_revoked_falls_back_to_cmd_tx() { + let sm = sm_running_with_multi_values(vec![(b"k1", b"v1")]); + let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1")]; + let result = + client.get_multi_with_consistency(&keys, ReadConsistencyPolicy::LeaseRead).await; + + assert!(result.is_err(), "revoked lease must fall back to cmd_tx"); + drop(client); + handle.await.unwrap(); + } + + /// get_multi_with_consistency LinearizableRead always uses cmd_tx. + /// cmd_rx dropped: error proves cmd_tx was used (not ReadActor). + #[tokio::test] + async fn test_get_multi_linearizable_always_routes_through_cmd_tx() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + // no expect_get() — mockall panics if get() is called + let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = client + .get_multi_with_consistency(&keys, ReadConsistencyPolicy::LinearizableRead) + .await; + + assert!(result.is_err(), "LinearizableRead must always use cmd_tx"); + drop(client); + handle.await.unwrap(); + } } diff --git a/d-engine-server/src/api/embedded_test.rs b/d-engine-server/src/api/embedded_test.rs index 290ccb8a..60e498e5 100644 --- a/d-engine-server/src/api/embedded_test.rs +++ b/d-engine-server/src/api/embedded_test.rs @@ -524,6 +524,29 @@ listen_addr = "127.0.0.1:0" // verifies the code path doesn't panic drop(engine); } + + /// stop() must release the RocksDB LOCK before returning. + /// + /// If ReadActor still held Arc after stop(), RocksDB would refuse the + /// second open() with "lock file already held by process" — no sleep needed. + #[tokio::test] + #[serial(tmp_db)] + async fn test_stop_releases_sm_lock_immediately() { + let data_dir = std::path::PathBuf::from("/tmp/d-engine-lock-release-test"); + let _ = std::fs::remove_dir_all(&data_dir); + + let engine = + EmbeddedEngine::start(&data_dir).await.expect("First start should succeed"); + engine.stop().await.expect("stop() should succeed"); + + // Immediately reopen — no sleep. If the LOCK is still held this fails. + let engine2 = EmbeddedEngine::start(&data_dir).await.expect( + "Second start must succeed immediately after stop() — LOCK was not released", + ); + engine2.stop().await.ok(); + + let _ = std::fs::remove_dir_all(&data_dir); + } } #[cfg(feature = "watch")] diff --git a/d-engine-server/src/api/mod.rs b/d-engine-server/src/api/mod.rs index 0ff5da89..e4be4ebd 100644 --- a/d-engine-server/src/api/mod.rs +++ b/d-engine-server/src/api/mod.rs @@ -2,8 +2,10 @@ mod embedded; mod embedded_client; +mod read_handle; mod standalone; +pub use read_handle::ReadHandle; pub use standalone::StandaloneEngine; /// Embedded engine generic over any `(SE, SM)` pair. @@ -29,6 +31,9 @@ mod embedded_client_test; #[cfg(test)] mod embedded_client_fast_path_test; +#[cfg(test)] +mod read_handle_test; + #[cfg(test)] mod embedded_test; diff --git a/d-engine-server/src/api/read_handle.rs b/d-engine-server/src/api/read_handle.rs new file mode 100644 index 00000000..1e4294eb --- /dev/null +++ b/d-engine-server/src/api/read_handle.rs @@ -0,0 +1,236 @@ +//! ReadHandle — unified read-routing for embedded and standalone modes. +//! +//! `ReadHandle` is the single source of truth for read routing: +//! - `EventualConsistency` / `LeaseRead` → ReadActor fast path (no Raft round-trip) +//! - `LinearizableRead` → `cmd_tx` (full Raft readIndex protocol) +//! - `SmError` → returned immediately; no `cmd_tx` fallback +//! - `LeaseInvalid` / `SmStopped` / channel-closed → fall through to `cmd_tx` +//! +//! Both `EmbeddedClient` and the gRPC `Node` handler hold a cloned `ReadHandle`, +//! ensuring routing logic is defined in exactly one place. + +use std::time::Duration; + +use bytes::Bytes; +use d_engine_core::MaybeCloneOneshot; +use d_engine_core::RaftOneshot; +use d_engine_core::client::{ + ClientApiError, ClientApiResult, ClientReadRequest, ClientResponsePayload, ErrorCode, + LeaderHint, ReadResults, +}; +use d_engine_core::config::ReadConsistencyPolicy; +use tokio::sync::{mpsc, oneshot}; + +use crate::read_actor::{ReadActorError, ReadCmd}; + +// ── Error helpers ───────────────────────────────────────────────────────────── + +pub(crate) fn channel_closed_error() -> ClientApiError { + ClientApiError::Network { + code: ErrorCode::ConnectionTimeout, + message: "Channel closed, node may be shutting down".to_string(), + retry_after_ms: None, + leader_hint: None, + } +} + +pub(crate) fn timeout_error(duration: Duration) -> ClientApiError { + ClientApiError::Network { + code: ErrorCode::ConnectionTimeout, + message: format!("Operation timed out after {duration:?}"), + retry_after_ms: Some(1000), + leader_hint: None, + } +} + +pub(crate) fn server_error(msg: String) -> ClientApiError { + ClientApiError::Business { + code: ErrorCode::Uncategorized, + message: msg, + required_action: None, + } +} + +pub(crate) fn not_leader_error( + leader_id: Option, + leader_address: Option, + retry_after_ms: Option, +) -> ClientApiError { + let message = match (&leader_address, &leader_id) { + (Some(addr), _) => format!("Not leader, try leader at: {addr}"), + (None, Some(id)) => format!("Not leader, leader_id: {id}"), + (None, None) => "Not leader".to_string(), + }; + let leader_hint = match (&leader_id, &leader_address) { + (Some(id_str), Some(addr)) => id_str.parse::().ok().map(|id| LeaderHint { + leader_id: id, + address: addr.clone(), + }), + _ => None, + }; + ClientApiError::Network { + code: ErrorCode::NotLeader, + message, + retry_after_ms: retry_after_ms.or(Some(100)), + leader_hint, + } +} + +pub(crate) fn map_error_response( + error: ErrorCode, + leader_hint: Option, + retry_after_ms: Option, +) -> ClientApiError { + match error { + ErrorCode::NotLeader => { + let (leader_id, leader_address) = if let Some(hint) = leader_hint { + (Some(hint.leader_id.to_string()), Some(hint.address)) + } else { + (None, None) + }; + not_leader_error(leader_id, leader_address, retry_after_ms) + } + _ => server_error(format!("Error code: {error:?}")), + } +} + +/// Unwrap a `ClientResponsePayload` as `ReadResults`. +pub(crate) fn extract_read_payload( + result: Option +) -> ClientApiResult { + match result { + Some(ClientResponsePayload::Read(r)) => Ok(r), + Some(ClientResponsePayload::Write(_)) => Err(ClientApiError::Protocol { + code: ErrorCode::InvalidResponse, + message: "expected ReadData payload, got WriteResult".to_string(), + supported_versions: None, + }), + None => Err(ClientApiError::Protocol { + code: ErrorCode::InvalidResponse, + message: "expected ReadData payload, got None".to_string(), + supported_versions: None, + }), + } +} + +// ── ReadHandle ──────────────────────────────────────────────────────────────── + +/// Routes read requests to the ReadActor fast path or `cmd_tx`. +/// +/// Cloneable — `EmbeddedClient` and `StandaloneServer` each hold their own clone. +/// The underlying channels are shared (mpsc::Sender is cheaply cloneable). +#[derive(Clone)] +pub struct ReadHandle { + /// ReadActor channel. `None` if node was started without a ReadActor. + pub(crate) read_tx: Option>, + /// Raft command channel for the cmd_tx fallback path. + pub(crate) cmd_tx: mpsc::Sender, +} + +impl ReadHandle { + /// Create a `ReadHandle` wiring the optional fast-path sender and the Raft cmd channel. + pub(crate) fn new( + read_tx: Option>, + cmd_tx: mpsc::Sender, + ) -> Self { + Self { read_tx, cmd_tx } + } + + /// Route a single-key read. Convenience wrapper around [`Self::get_batch`]. + /// + /// # Routing rules + /// | Policy | Path | On failure | + /// |----------------|----------------------------|-----------------------| + /// | Eventual/Lease | ReadActor (fast path) | fall through to cmd_tx| + /// | Linearizable | cmd_tx always | — | + /// | SmError | direct return | no fallback | + pub async fn get( + &self, + key: &[u8], + consistency: ReadConsistencyPolicy, + client_id: u32, + timeout: Duration, + ) -> ClientApiResult> { + let key_bytes = Bytes::copy_from_slice(key); + let mut results = self.get_batch(&[key_bytes], consistency, client_id, timeout).await?; + Ok(results.pop().flatten()) + } + + /// Route a multi-key read atomically. + /// + /// For `Eventual` / `LeaseRead`, all keys are sent to ReadActor in a single + /// `ReadCmd` and read from one consistent snapshot. On fallback or + /// `Linearizable`, the full key list is forwarded to `cmd_tx` as a single + /// `ClientCmd::Read`. + /// + /// The returned `Vec` is the same length as `keys` and positionally ordered. + pub async fn get_batch( + &self, + keys: &[Bytes], + consistency: ReadConsistencyPolicy, + client_id: u32, + timeout: Duration, + ) -> ClientApiResult>> { + // Fast path: Eventual and LeaseRead bypass cmd_tx via ReadActor. + if let Some(read_tx) = &self.read_tx + && matches!( + consistency, + ReadConsistencyPolicy::EventualConsistency | ReadConsistencyPolicy::LeaseRead + ) + { + let (reply_tx, reply_rx) = oneshot::channel(); + if read_tx + .send(ReadCmd { + keys: keys.to_vec(), + consistency: consistency.clone(), + reply: reply_tx, + }) + .await + .is_ok() + { + match reply_rx.await { + Ok(Ok(values)) => return Ok(values), + Ok(Err(ReadActorError::SmError(e))) => return Err(server_error(e)), + // LeaseInvalid / SmStopped → fall through to cmd_tx + Ok(Err(ReadActorError::LeaseInvalid | ReadActorError::SmStopped)) => {} + // ReadActor exited without replying → fall through + Err(_) => {} + } + } + // send() failed (channel closed) → fall through to cmd_tx + } + + // cmd_tx path (Raft readIndex — always correct, Linearizable always arrives here) + let request = ClientReadRequest { + client_id, + keys: keys.to_vec(), + consistency_policy: Some(consistency), + }; + let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); + self.cmd_tx + .send(d_engine_core::ClientCmd::Read(request, resp_tx)) + .await + .map_err(|_| channel_closed_error())?; + + let result = tokio::time::timeout(timeout, resp_rx) + .await + .map_err(|_| timeout_error(timeout))? + .map_err(|_| channel_closed_error())?; + + let response = + result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; + + if response.error != ErrorCode::Success { + return Err(map_error_response( + response.error, + response.leader_hint, + response.retry_after_ms, + )); + } + + let read_results = extract_read_payload(response.result)?; + let entry_map: std::collections::HashMap = + read_results.entries.into_iter().map(|e| (e.key, e.value)).collect(); + Ok(keys.iter().map(|k| entry_map.get(k).cloned()).collect()) + } +} diff --git a/d-engine-server/src/api/read_handle_test.rs b/d-engine-server/src/api/read_handle_test.rs new file mode 100644 index 00000000..7fe1c2f3 --- /dev/null +++ b/d-engine-server/src/api/read_handle_test.rs @@ -0,0 +1,570 @@ +/// Unit tests for ReadHandle routing logic. +/// +/// ReadHandle is the single source of truth for read routing: +/// Eventual/LeaseRead → ReadActor fast path; fallback to cmd_tx on LeaseInvalid/SmStopped +/// LinearizableRead → cmd_tx always +/// SmError → returned directly, NO cmd_tx fallback +/// +/// Proof technique (same as embedded_client_fast_path_test.rs): +/// cmd_rx is dropped so any fallback to cmd_tx returns a Network/channel-closed error. +/// A Business error proves SmError was returned directly. +/// An Ok(value) with cmd_rx dropped proves the fast path was taken. +#[cfg(test)] +mod read_handle_tests { + use std::sync::Arc; + use std::time::Duration; + + use crate::read_actor::run_read_actor; + use bytes::Bytes; + use d_engine_core::client::{ClientResponse, KvEntry}; + use d_engine_core::config::ReadConsistencyPolicy; + use d_engine_core::{ClientApiError, ClientCmd, Error, MockStateMachine, ReadLease, now_ms}; + use tokio::sync::mpsc; + use tokio::task::JoinHandle; + + use super::super::read_handle::ReadHandle; + + // ── Helpers ─────────────────────────────────────────────────────────────── + + fn valid_lease() -> Arc { + let l = Arc::new(ReadLease::new()); + l.renew(1, now_ms() + 60_000); + l + } + + fn revoked_lease() -> Arc { + let l = Arc::new(ReadLease::new()); + l.revoke(); + l + } + + fn expired_lease() -> Arc { + let l = Arc::new(ReadLease::new()); + l.renew(1, now_ms().saturating_sub(1)); + l + } + + fn sm_running_with(value: Bytes) -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi() + .returning(move |keys| Ok(keys.iter().map(|_| Some(value.clone())).collect())); + sm + } + + fn sm_running_empty() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi().returning(|keys| Ok(keys.iter().map(|_| None).collect())); + sm + } + + fn sm_stopped() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| false); + sm + } + + fn sm_with_error() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi().returning(|_| Err(Error::Fatal("disk failure".into()))); + sm + } + + /// Build a ReadHandle with a live ReadActor. + /// + /// `drop_cmd_rx=true` closes the cmd_tx receiver — any cmd_tx fallback + /// returns a channel-closed Network error (proof the fast path was NOT taken). + async fn make_handle( + sm: MockStateMachine, + lease: Arc, + drop_cmd_rx: bool, + ) -> (ReadHandle, JoinHandle<()>) { + let (read_tx, read_rx) = mpsc::channel(8); + let (cmd_tx, cmd_rx) = mpsc::channel(1); + if drop_cmd_rx { + drop(cmd_rx); + } + let handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); + let rh = ReadHandle::new(Some(read_tx), cmd_tx); + (rh, handle) + } + + const TIMEOUT: Duration = Duration::from_millis(100); + + // ── Eventual fast path ──────────────────────────────────────────────────── + + /// Eventual, SM running, key exists → fast path returns value. + /// cmd_rx dropped: Ok(value) proves fast path was taken. + #[tokio::test] + async fn test_eventual_fast_path_returns_value() { + let (rh, handle) = + make_handle(sm_running_with(Bytes::from("v1")), valid_lease(), true).await; + let result = rh.get(b"k", ReadConsistencyPolicy::EventualConsistency, 1, TIMEOUT).await; + assert_eq!(result.unwrap(), Some(Bytes::from("v1"))); + drop(rh); + handle.await.unwrap(); + } + + /// Eventual, SM running, key missing → fast path returns None. + #[tokio::test] + async fn test_eventual_fast_path_returns_none_for_missing_key() { + let (rh, handle) = make_handle(sm_running_empty(), valid_lease(), true).await; + let result = rh + .get( + b"missing", + ReadConsistencyPolicy::EventualConsistency, + 1, + TIMEOUT, + ) + .await; + assert_eq!(result.unwrap(), None); + drop(rh); + handle.await.unwrap(); + } + + /// Eventual, SM stopped → SmStopped → fallback to cmd_tx. + /// cmd_rx dropped: error is Network (channel-closed), proving cmd_tx fallback triggered. + #[tokio::test] + async fn test_eventual_sm_stopped_falls_back_to_cmd_tx() { + let (rh, handle) = make_handle(sm_stopped(), valid_lease(), true).await; + let result = rh.get(b"k", ReadConsistencyPolicy::EventualConsistency, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "SmStopped must fall back to cmd_tx (Network error), got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + // ── LeaseRead fast path ─────────────────────────────────────────────────── + + /// LeaseRead, valid lease, SM running → fast path returns value. + #[tokio::test] + async fn test_lease_read_fast_path_returns_value() { + let (rh, handle) = make_handle( + sm_running_with(Bytes::from("lease_val")), + valid_lease(), + true, + ) + .await; + let result = rh.get(b"k", ReadConsistencyPolicy::LeaseRead, 1, TIMEOUT).await; + assert_eq!(result.unwrap(), Some(Bytes::from("lease_val"))); + drop(rh); + handle.await.unwrap(); + } + + /// LeaseRead, revoked lease → LeaseInvalid → fallback to cmd_tx. + #[tokio::test] + async fn test_lease_read_revoked_falls_back_to_cmd_tx() { + let (rh, handle) = + make_handle(sm_running_with(Bytes::from("x")), revoked_lease(), true).await; + let result = rh.get(b"k", ReadConsistencyPolicy::LeaseRead, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "revoked lease must fall back to cmd_tx, got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + /// LeaseRead, expired lease → LeaseInvalid → fallback to cmd_tx. + #[tokio::test] + async fn test_lease_read_expired_falls_back_to_cmd_tx() { + let (rh, handle) = + make_handle(sm_running_with(Bytes::from("x")), expired_lease(), true).await; + let result = rh.get(b"k", ReadConsistencyPolicy::LeaseRead, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "expired lease must fall back to cmd_tx, got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + /// LeaseRead, SM stopped (even with valid lease) → LeaseInvalid → fallback. + #[tokio::test] + async fn test_lease_read_sm_stopped_falls_back_to_cmd_tx() { + let (rh, handle) = make_handle(sm_stopped(), valid_lease(), true).await; + let result = rh.get(b"k", ReadConsistencyPolicy::LeaseRead, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "SM stopped must fall back to cmd_tx, got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + // ── SmError — direct return, no cmd_tx fallback ─────────────────────────── + + /// sm.get() returns Err → SmError → Business error returned DIRECTLY. + /// cmd_rx dropped: if fallback were taken, error would be Network. + /// Business error proves SmError was returned without touching cmd_tx. + #[tokio::test] + async fn test_sm_error_returned_directly_no_cmd_tx_fallback() { + let (rh, handle) = make_handle(sm_with_error(), valid_lease(), true).await; + let result = rh.get(b"k", ReadConsistencyPolicy::EventualConsistency, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Business { .. })), + "SmError must produce Business error (direct), not Network (fallback), got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + // ── Linearizable — always cmd_tx ───────────────────────────────────────── + + /// LinearizableRead must never touch ReadActor — always routed to cmd_tx. + /// cmd_rx dropped: Network error proves cmd_tx was used (not fast path). + #[tokio::test] + async fn test_linearizable_always_uses_cmd_tx() { + // SM has no get() expectation — mockall panics if get() is called (implicit safety net). + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + let (rh, handle) = make_handle(sm, valid_lease(), true).await; + + let result = rh.get(b"k", ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "LinearizableRead must always use cmd_tx, got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + // ── No read_tx — always cmd_tx ──────────────────────────────────────────── + + /// ReadHandle without read_tx (None) always falls through to cmd_tx for any policy. + #[tokio::test] + async fn test_no_read_tx_all_policies_use_cmd_tx() { + let (cmd_tx, cmd_rx) = mpsc::channel::(1); + drop(cmd_rx); + let rh = ReadHandle::new(None, cmd_tx); + + for policy in [ + ReadConsistencyPolicy::EventualConsistency, + ReadConsistencyPolicy::LeaseRead, + ReadConsistencyPolicy::LinearizableRead, + ] { + let result = rh.get(b"k", policy.clone(), 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "no read_tx must always use cmd_tx, policy={policy:?}, got: {:?}", + result + ); + } + } + + // ── ReadActor channel closed ────────────────────────────────────────────── + + /// ReadActor already stopped (read_rx dropped) → send fails → fallback to cmd_tx. + /// cmd_rx also dropped: Network error proves fallback was taken. + #[tokio::test] + async fn test_read_actor_gone_falls_back_to_cmd_tx() { + let (read_tx, read_rx) = mpsc::channel::(1); + let (cmd_tx, cmd_rx) = mpsc::channel::(1); + drop(read_rx); // ReadActor is gone + drop(cmd_rx); // cmd_tx also closed — proves fallback was attempted + + let rh = ReadHandle::new(Some(read_tx), cmd_tx); + let result = rh.get(b"k", ReadConsistencyPolicy::EventualConsistency, 1, TIMEOUT).await; + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "closed ReadActor must fall back to cmd_tx, got: {:?}", + result + ); + } + + // ── cmd_tx path: alignment helper ──────────────────────────────────────── + + /// Builds a ReadHandle wired to a one-shot mock Raft responder. + /// + /// The responder returns the given sparse `entries` exactly as + /// `read_from_state_machine` would — caller is responsible for verifying + /// that `get_batch` re-aligns them to the input key positions. + async fn make_cmd_tx_handle(entries: Vec) -> ReadHandle { + let (cmd_tx, mut cmd_rx) = mpsc::channel(1); + tokio::spawn(async move { + if let Some(ClientCmd::Read(_, resp_tx)) = cmd_rx.recv().await { + let _ = resp_tx.send(Ok(ClientResponse::read_results(entries))); + } + }); + ReadHandle::new(None, cmd_tx) + } + + // ── cmd_tx path: HashMap re-alignment correctness ───────────────────────── + + /// cmd_tx returns sparse KvEntry with middle key missing. + /// get_batch must produce [Some, None, Some] — length 3, not 2. + /// This is the core regression for the HashMap re-alignment fix. + #[tokio::test] + async fn test_get_batch_cmd_tx_middle_key_missing_aligned() { + let entries = vec![ + KvEntry { + key: Bytes::from_static(b"k1"), + value: Bytes::from_static(b"v1"), + }, + KvEntry { + key: Bytes::from_static(b"k3"), + value: Bytes::from_static(b"v3"), + }, + ]; + let rh = make_cmd_tx_handle(entries).await; + let keys = vec![ + Bytes::from_static(b"k1"), + Bytes::from_static(b"k2"), + Bytes::from_static(b"k3"), + ]; + let result = rh + .get_batch(&keys, ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT) + .await + .unwrap(); + assert_eq!(result.len(), 3, "length must equal keys.len()"); + assert_eq!(result[0], Some(Bytes::from_static(b"v1"))); + assert_eq!( + result[1], None, + "missing key must be None at correct position" + ); + assert_eq!(result[2], Some(Bytes::from_static(b"v3"))); + } + + /// cmd_tx returns empty entries (all keys missing). + /// get_batch must produce [None, None, None] — length 3, not 0. + #[tokio::test] + async fn test_get_batch_cmd_tx_all_keys_missing_returns_all_none() { + let rh = make_cmd_tx_handle(vec![]).await; + let keys = vec![ + Bytes::from_static(b"x"), + Bytes::from_static(b"y"), + Bytes::from_static(b"z"), + ]; + let result = rh + .get_batch(&keys, ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT) + .await + .unwrap(); + assert_eq!(result.len(), 3); + assert!( + result.iter().all(|v| v.is_none()), + "all missing keys must be None: {:?}", + result + ); + } + + /// cmd_tx returns sparse entries with first key missing. + /// get_batch must produce [None, Some, Some]. + #[tokio::test] + async fn test_get_batch_cmd_tx_first_key_missing_aligned() { + let entries = vec![ + KvEntry { + key: Bytes::from_static(b"k2"), + value: Bytes::from_static(b"v2"), + }, + KvEntry { + key: Bytes::from_static(b"k3"), + value: Bytes::from_static(b"v3"), + }, + ]; + let rh = make_cmd_tx_handle(entries).await; + let keys = vec![ + Bytes::from_static(b"missing"), + Bytes::from_static(b"k2"), + Bytes::from_static(b"k3"), + ]; + let result = rh + .get_batch(&keys, ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT) + .await + .unwrap(); + assert_eq!(result.len(), 3); + assert_eq!(result[0], None); + assert_eq!(result[1], Some(Bytes::from_static(b"v2"))); + assert_eq!(result[2], Some(Bytes::from_static(b"v3"))); + } + + /// cmd_tx returns sparse entries with last key missing. + /// get_batch must produce [Some, Some, None]. + #[tokio::test] + async fn test_get_batch_cmd_tx_last_key_missing_aligned() { + let entries = vec![ + KvEntry { + key: Bytes::from_static(b"k1"), + value: Bytes::from_static(b"v1"), + }, + KvEntry { + key: Bytes::from_static(b"k2"), + value: Bytes::from_static(b"v2"), + }, + ]; + let rh = make_cmd_tx_handle(entries).await; + let keys = vec![ + Bytes::from_static(b"k1"), + Bytes::from_static(b"k2"), + Bytes::from_static(b"missing"), + ]; + let result = rh + .get_batch(&keys, ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT) + .await + .unwrap(); + assert_eq!(result.len(), 3); + assert_eq!(result[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(result[1], Some(Bytes::from_static(b"v2"))); + assert_eq!(result[2], None); + } + + /// cmd_tx returns all keys — positive case, no alignment work needed. + #[tokio::test] + async fn test_get_batch_cmd_tx_all_keys_exist_aligned() { + let entries = vec![ + KvEntry { + key: Bytes::from_static(b"k1"), + value: Bytes::from_static(b"v1"), + }, + KvEntry { + key: Bytes::from_static(b"k2"), + value: Bytes::from_static(b"v2"), + }, + ]; + let rh = make_cmd_tx_handle(entries).await; + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = rh + .get_batch(&keys, ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT) + .await + .unwrap(); + assert_eq!(result.len(), 2); + assert_eq!(result[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(result[1], Some(Bytes::from_static(b"v2"))); + } + + // ── get_batch() multi-key fast path ────────────────────────────────────── + + fn sm_running_with_multi(vals: Vec<(&'static [u8], &'static [u8])>) -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi().returning(move |keys| { + Ok(keys + .iter() + .map(|k| { + for (key, val) in &vals { + if &k[..] == *key { + return Some(Bytes::from_static(val)); + } + } + None + }) + .collect()) + }); + sm + } + + /// Multi-key Eventual batch: all keys found → Vec positionally ordered. + /// cmd_rx dropped: Ok proves fast path was taken. + #[tokio::test] + async fn test_get_batch_eventual_fast_path_returns_ordered_values() { + let sm = sm_running_with_multi(vec![(b"k1", b"v1"), (b"k2", b"v2")]); + let (rh, handle) = make_handle(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = rh + .get_batch( + &keys, + ReadConsistencyPolicy::EventualConsistency, + 1, + TIMEOUT, + ) + .await; + + let values = result.unwrap(); + assert_eq!(values.len(), 2); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(values[1], Some(Bytes::from_static(b"v2"))); + drop(rh); + handle.await.unwrap(); + } + + /// Multi-key Eventual batch: some keys missing → None at correct positions. + #[tokio::test] + async fn test_get_batch_eventual_partial_missing_keys() { + let sm = sm_running_with_multi(vec![(b"k1", b"v1")]); + let (rh, handle) = make_handle(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"missing")]; + let result = rh + .get_batch( + &keys, + ReadConsistencyPolicy::EventualConsistency, + 1, + TIMEOUT, + ) + .await; + + let values = result.unwrap(); + assert_eq!(values.len(), 2); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(values[1], None); + drop(rh); + handle.await.unwrap(); + } + + /// Multi-key LeaseRead: valid lease → fast path returns all values. + #[tokio::test] + async fn test_get_batch_lease_read_valid_lease_fast_path() { + let sm = sm_running_with_multi(vec![(b"k1", b"v1"), (b"k2", b"v2")]); + let (rh, handle) = make_handle(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = rh.get_batch(&keys, ReadConsistencyPolicy::LeaseRead, 1, TIMEOUT).await; + + assert!( + result.is_ok(), + "multi-key LeaseRead fast path must succeed: {:?}", + result.err() + ); + drop(rh); + handle.await.unwrap(); + } + + /// Multi-key LeaseRead: revoked lease → LeaseInvalid → fallback to cmd_tx. + #[tokio::test] + async fn test_get_batch_lease_revoked_falls_back_to_cmd_tx() { + let sm = sm_running_with_multi(vec![(b"k1", b"v1")]); + let (rh, handle) = make_handle(sm, revoked_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = rh.get_batch(&keys, ReadConsistencyPolicy::LeaseRead, 1, TIMEOUT).await; + + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "revoked lease must fall back to cmd_tx, got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } + + /// Multi-key Linearizable: always goes through cmd_tx (no ReadActor). + /// cmd_rx dropped: Network error proves cmd_tx was used. + #[tokio::test] + async fn test_get_batch_linearizable_always_uses_cmd_tx() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + // no expect_get() — mockall panics if get() is called + let (rh, handle) = make_handle(sm, valid_lease(), true).await; + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let result = rh.get_batch(&keys, ReadConsistencyPolicy::LinearizableRead, 1, TIMEOUT).await; + + assert!( + matches!(result, Err(ClientApiError::Network { .. })), + "Linearizable get_batch must always use cmd_tx, got: {:?}", + result + ); + drop(rh); + handle.await.unwrap(); + } +} diff --git a/d-engine-server/src/lib.rs b/d-engine-server/src/lib.rs index b5d361e7..7967bd48 100644 --- a/d-engine-server/src/lib.rs +++ b/d-engine-server/src/lib.rs @@ -98,6 +98,12 @@ mod proto_convert; #[cfg(test)] mod proto_convert_test; +/// ReadActor — fast-path read task for Eventual and LeaseRead. +/// Kept in server (not core) because it is a performance optimization, not a Raft protocol component. +pub(crate) mod read_actor; +#[cfg(test)] +mod read_actor_test; + /// Node lifecycle management /// /// Contains [`Node`] and [`NodeBuilder`] for server setup. diff --git a/d-engine-server/src/membership/membership_snapshot.rs b/d-engine-server/src/membership/membership_snapshot.rs index 315f696f..e0c60799 100644 --- a/d-engine-server/src/membership/membership_snapshot.rs +++ b/d-engine-server/src/membership/membership_snapshot.rs @@ -2,7 +2,7 @@ use std::collections::BTreeSet; /// A point-in-time snapshot of committed cluster membership. /// -/// Delivered via [`crate::EmbeddedEngine::watch_membership`] whenever a `ConfChange` +/// Delivered via `EmbeddedEngine::watch_membership` whenever a `ConfChange` /// entry commits. The snapshot reflects the membership state **after** the /// change has been applied, so `borrow()` always returns a consistent view. /// diff --git a/d-engine-server/src/network/grpc/grpc_raft_service.rs b/d-engine-server/src/network/grpc/grpc_raft_service.rs index 467d11c3..3e673064 100644 --- a/d-engine-server/src/network/grpc/grpc_raft_service.rs +++ b/d-engine-server/src/network/grpc/grpc_raft_service.rs @@ -467,15 +467,51 @@ where "Unknown consistency_policy value received, degrading to cluster default" ); } + + let timeout_duration = + Duration::from_millis(self.node_config.raft.general_raft_timeout_duration_in_ms); let core_req = proto_convert::to_core_read_req(proto_req); + + // Fast path: Eventual/LeaseRead → ReadHandle (ReadActor + cmd_tx fallback). + { + use d_engine_core::client::ClientApiError; + use d_engine_core::config::ReadConsistencyPolicy; + if let Some(ref policy) = core_req.consistency_policy + && matches!( + policy, + ReadConsistencyPolicy::EventualConsistency | ReadConsistencyPolicy::LeaseRead + ) + { + return match self + .read_handle + .get_batch( + &core_req.keys, + policy.clone(), + core_req.client_id, + timeout_duration, + ) + .await + { + Ok(values) => Ok(tonic::Response::new( + proto_convert::fast_path_batch_read_response(&core_req.keys, values), + )), + Err(ClientApiError::Business { message, .. }) => Err(Status::internal(message)), + Err(ClientApiError::Network { message, .. }) => { + Err(Status::unavailable(message)) + } + Err(other) => Err(Status::internal(format!("{other:?}"))), + }; + } + } + + // cmd_tx path: Linearizable or unrecognized policy. let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); - self.cmd_tx + self.read_handle + .cmd_tx .send(d_engine_core::ClientCmd::Read(core_req, resp_tx)) .await .map_err(|_| Status::internal("Command channel closed"))?; - let timeout_duration = - Duration::from_millis(self.node_config.raft.general_raft_timeout_duration_in_ms); handle_rpc_timeout(resp_rx, timeout_duration, "handle_client_read") .await .map(|resp| resp.map(proto_convert::to_proto_response)) diff --git a/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs b/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs new file mode 100644 index 00000000..caa0941f --- /dev/null +++ b/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs @@ -0,0 +1,357 @@ +/// Fast-path tests for `handle_client_read` via `ReadHandle`. +/// +/// Routing rules under test: +/// Eventual/LeaseRead (any key count) → ReadActor fast path; fallback on LeaseInvalid/SmStopped +/// LinearizableRead → cmd_tx always +/// SmError → error returned directly (no cmd_tx fallback) +/// +/// Proof technique (identical to read_handle_test.rs): +/// The ReadHandle's cmd_rx is dropped. Any fallback to cmd_tx produces a tonic +/// Status error (channel closed). An Ok response with cmd_rx dropped proves the +/// fast path was taken. +#[cfg(test)] +mod grpc_fast_path_tests { + use std::sync::Arc; + use std::sync::atomic::Ordering; + + use crate::read_actor::run_read_actor; + use bytes::Bytes; + use d_engine_core::{MockStateMachine, ReadLease, now_ms}; + use d_engine_proto::client::ClientReadRequest; + use d_engine_proto::client::ReadConsistencyPolicy as ProtoPolicy; + use d_engine_proto::client::client_response::SuccessResult; + use d_engine_proto::client::raft_client_service_server::RaftClientService; + use tokio::sync::mpsc; + use tokio::task::JoinHandle; + use tonic::Request; + + use crate::Node; + use crate::api::ReadHandle; + use crate::test_utils::mock_node; + use d_engine_core::MockTypeConfig; + + // ── Helpers ─────────────────────────────────────────────────────────────── + + fn valid_lease() -> Arc { + let l = Arc::new(ReadLease::new()); + l.renew(1, now_ms() + 60_000); + l + } + + fn revoked_lease() -> Arc { + let l = Arc::new(ReadLease::new()); + l.revoke(); + l + } + + fn sm_running_with(value: Bytes) -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi() + .returning(move |keys| Ok(keys.iter().map(|_| Some(value.clone())).collect())); + sm + } + + fn sm_stopped() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| false); + sm + } + + fn sm_with_error() -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi() + .returning(|_| Err(d_engine_core::Error::Fatal("disk failure".into()))); + sm + } + + /// Build a Node wired to a live ReadActor. + /// + /// `drop_cmd_rx=true` closes the ReadHandle's cmd_rx — any fallback to cmd_tx + /// returns a tonic Status error (channel closed), proving the fast path was NOT taken. + async fn make_node( + sm: MockStateMachine, + lease: Arc, + drop_cmd_rx: bool, + ) -> (Node, JoinHandle<()>) { + let (read_tx, read_rx) = mpsc::channel(8); + let (cmd_tx, cmd_rx) = mpsc::channel(1); + if drop_cmd_rx { + drop(cmd_rx); + } + let handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); + let rh = ReadHandle::new(Some(read_tx), cmd_tx); + + let (_, graceful_rx) = tokio::sync::watch::channel(()); + let mut node = mock_node("/tmp/grpc_fast_path_test", graceful_rx, None); + node.read_handle = rh; + node.ready.store(true, Ordering::SeqCst); + (node, handle) + } + + fn req( + key: &[u8], + policy: ProtoPolicy, + ) -> ClientReadRequest { + ClientReadRequest { + client_id: 1, + keys: vec![Bytes::copy_from_slice(key)], + consistency_policy: Some(policy as i32), + } + } + + fn multi_key_req( + keys: &[&[u8]], + policy: ProtoPolicy, + ) -> ClientReadRequest { + ClientReadRequest { + client_id: 1, + keys: keys.iter().map(|k| Bytes::copy_from_slice(k)).collect(), + consistency_policy: Some(policy as i32), + } + } + + // ── Eventual fast path ──────────────────────────────────────────────────── + + /// Eventual, SM running, key exists → fast path returns Ok with the value. + /// cmd_rx dropped: Ok proves fast path was taken, not cmd_tx. + #[tokio::test] + async fn test_eventual_single_key_fast_path_returns_value() { + let (node, handle) = + make_node(sm_running_with(Bytes::from("fast_v")), valid_lease(), true).await; + + let result = node + .handle_client_read(Request::new(req(b"k", ProtoPolicy::EventualConsistency))) + .await; + + let resp = result.expect("fast path must succeed with cmd_rx dropped"); + let cr = resp.into_inner(); + assert_eq!(cr.error, 0, "error must be Success"); + if let Some(SuccessResult::ReadData(read_data)) = cr.success_result { + assert_eq!(read_data.results.len(), 1); + assert_eq!(read_data.results[0].value, Bytes::from("fast_v")); + } else { + panic!("expected ReadData payload"); + } + drop(node); + handle.await.unwrap(); + } + + /// Eventual, SM running, key missing → fast path returns Ok with empty entries. + #[tokio::test] + async fn test_eventual_single_key_fast_path_returns_empty_for_missing_key() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi().returning(|keys| Ok(keys.iter().map(|_| None).collect())); + + let (node, handle) = make_node(sm, valid_lease(), true).await; + let result = node + .handle_client_read(Request::new(req( + b"missing", + ProtoPolicy::EventualConsistency, + ))) + .await; + + let resp = result.expect("fast path must succeed"); + let cr = resp.into_inner(); + assert_eq!(cr.error, 0); + if let Some(SuccessResult::ReadData(read_data)) = cr.success_result { + assert!(read_data.results.is_empty(), "missing key → empty results"); + } else { + panic!("expected ReadData payload"); + } + drop(node); + handle.await.unwrap(); + } + + /// Eventual, SM stopped → SmStopped → fallback to cmd_tx. + /// cmd_rx dropped: error proves fallback was triggered. + #[tokio::test] + async fn test_eventual_sm_stopped_falls_back_to_cmd_tx() { + let (node, handle) = make_node(sm_stopped(), valid_lease(), true).await; + + let result = node + .handle_client_read(Request::new(req(b"k", ProtoPolicy::EventualConsistency))) + .await; + + assert!( + result.is_err(), + "SM stopped must fall back to closed cmd_tx" + ); + drop(node); + handle.await.unwrap(); + } + + // ── LeaseRead fast path ─────────────────────────────────────────────────── + + /// LeaseRead, valid lease, SM running → fast path returns Ok. + #[tokio::test] + async fn test_lease_read_valid_lease_fast_path_returns_ok() { + let (node, handle) = + make_node(sm_running_with(Bytes::from("lease_v")), valid_lease(), true).await; + + let result = node.handle_client_read(Request::new(req(b"k", ProtoPolicy::LeaseRead))).await; + + assert!(result.is_ok(), "fast path must succeed: {:?}", result.err()); + drop(node); + handle.await.unwrap(); + } + + /// LeaseRead, revoked lease → LeaseInvalid → fallback to cmd_tx. + #[tokio::test] + async fn test_lease_read_revoked_falls_back_to_cmd_tx() { + let (node, handle) = + make_node(sm_running_with(Bytes::from("x")), revoked_lease(), true).await; + + let result = node.handle_client_read(Request::new(req(b"k", ProtoPolicy::LeaseRead))).await; + + assert!( + result.is_err(), + "revoked lease must fall back to closed cmd_tx" + ); + drop(node); + handle.await.unwrap(); + } + + /// LeaseRead, SM stopped (even valid lease) → LeaseInvalid → fallback. + #[tokio::test] + async fn test_lease_read_sm_stopped_falls_back_to_cmd_tx() { + let (node, handle) = make_node(sm_stopped(), valid_lease(), true).await; + + let result = node.handle_client_read(Request::new(req(b"k", ProtoPolicy::LeaseRead))).await; + + assert!( + result.is_err(), + "SM stopped must fall back to closed cmd_tx" + ); + drop(node); + handle.await.unwrap(); + } + + // ── SmError — direct return, no cmd_tx fallback ─────────────────────────── + + /// sm.get() returns Err → SmError → error returned directly without cmd_tx fallback. + /// cmd_rx dropped: if fallback were taken, the error would come from channel-closed. + /// Either way the result is Err, but the important invariant (no fallback) is + /// proven at the ReadHandle layer; here we verify the error propagates to gRPC. + #[tokio::test] + async fn test_sm_error_propagates_as_grpc_error() { + let (node, handle) = make_node(sm_with_error(), valid_lease(), true).await; + + let result = node + .handle_client_read(Request::new(req(b"k", ProtoPolicy::EventualConsistency))) + .await; + + assert!( + result.is_err(), + "SmError must surface as tonic Status error" + ); + drop(node); + handle.await.unwrap(); + } + + // ── Linearizable — always cmd_tx ───────────────────────────────────────── + + /// LinearizableRead must never touch ReadActor — always routed to cmd_tx. + /// No expect_get_multi() on SM: mockall panics if get_multi() is called (implicit safety net). + /// cmd_rx dropped: error proves cmd_tx was used (not fast path). + #[tokio::test] + async fn test_linearizable_always_uses_cmd_tx() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + // no expect_get_multi() — any get_multi() call panics + + let (node, handle) = make_node(sm, valid_lease(), true).await; + + let result = node + .handle_client_read(Request::new(req(b"k", ProtoPolicy::LinearizableRead))) + .await; + + assert!(result.is_err(), "LinearizableRead must always use cmd_tx"); + drop(node); + handle.await.unwrap(); + } + + // ── Multi-key — ReadActor fast path ────────────────────────────────────── + + /// Multi-key Eventual read routes through ReadActor fast path (same as single-key). + /// cmd_rx dropped: Ok proves ReadActor was used, not cmd_tx. + #[tokio::test] + async fn test_multi_key_eventual_fast_path_returns_values() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi() + .returning(|keys| Ok(keys.iter().map(|_| Some(Bytes::from_static(b"val"))).collect())); + + let (node, handle) = make_node(sm, valid_lease(), true).await; + + let result = node + .handle_client_read(Request::new(multi_key_req( + &[b"k1", b"k2"], + ProtoPolicy::EventualConsistency, + ))) + .await; + + assert!( + result.is_ok(), + "multi-key Eventual must use ReadActor fast path: {:?}", + result.err() + ); + drop(node); + handle.await.unwrap(); + } + + /// Multi-key LeaseRead with valid lease routes through ReadActor fast path. + /// cmd_rx dropped: Ok proves ReadActor was used, not cmd_tx. + #[tokio::test] + async fn test_multi_key_lease_read_fast_path_returns_values() { + let mut sm = MockStateMachine::new(); + sm.expect_is_running().returning(|| true); + sm.expect_get_multi() + .returning(|keys| Ok(keys.iter().map(|_| Some(Bytes::from_static(b"val"))).collect())); + + let (node, handle) = make_node(sm, valid_lease(), true).await; + + let result = node + .handle_client_read(Request::new(multi_key_req( + &[b"k1", b"k2"], + ProtoPolicy::LeaseRead, + ))) + .await; + + assert!( + result.is_ok(), + "multi-key LeaseRead must use ReadActor fast path: {:?}", + result.err() + ); + drop(node); + handle.await.unwrap(); + } + + // ── No read_tx — always cmd_tx ──────────────────────────────────────────── + + /// ReadHandle without read_tx (no ReadActor wired) falls through to cmd_tx for all policies. + #[tokio::test] + async fn test_no_read_tx_all_policies_use_cmd_tx() { + let (cmd_tx, cmd_rx) = mpsc::channel::(1); + drop(cmd_rx); + + let (_, graceful_rx) = tokio::sync::watch::channel(()); + let mut node = mock_node("/tmp/grpc_fast_path_test_no_rt", graceful_rx, None); + node.read_handle = ReadHandle::new(None, cmd_tx); + node.ready.store(true, Ordering::SeqCst); + + for policy in [ + ProtoPolicy::EventualConsistency, + ProtoPolicy::LeaseRead, + ProtoPolicy::LinearizableRead, + ] { + let result = node.handle_client_read(Request::new(req(b"k", policy))).await; + assert!( + result.is_err(), + "no read_tx must always use cmd_tx (closed → error), policy={policy:?}" + ); + } + } +} diff --git a/d-engine-server/src/network/grpc/mod.rs b/d-engine-server/src/network/grpc/mod.rs index bbec6533..0a7a22fb 100644 --- a/d-engine-server/src/network/grpc/mod.rs +++ b/d-engine-server/src/network/grpc/mod.rs @@ -13,6 +13,9 @@ pub(crate) mod grpc_transport; #[cfg(test)] mod grpc_raft_service_test; +#[cfg(test)] +mod grpc_raft_service_fast_path_test; + #[cfg(test)] mod grpc_transport_test; diff --git a/d-engine-server/src/node/builder.rs b/d-engine-server/src/node/builder.rs index d35397ab..4a535a12 100644 --- a/d-engine-server/src/node/builder.rs +++ b/d-engine-server/src/node/builder.rs @@ -32,6 +32,7 @@ use std::fmt::Debug; use std::sync::Arc; use std::sync::atomic::AtomicBool; +use crate::read_actor::run_read_actor; use d_engine_core::ClusterConfig; use d_engine_core::CommitHandler; use d_engine_core::CommitHandlerDependencies; @@ -569,11 +570,23 @@ where let read_lease = raft_core.read_lease(); let (rpc_ready_tx, _rpc_ready_rx) = watch::channel(false); + // Spawn ReadActor — sole owner of Arc on the read fast path. + let (read_tx, read_rx) = mpsc::channel(node_config_arc.raft.read_actor.channel_capacity); + let max_drain = node_config_arc.raft.read_actor.max_drain; + let read_actor_handle = tokio::spawn(run_read_actor( + read_rx, + Arc::clone(&read_lease), + state_machine, + max_drain, + )); + let read_handle = crate::api::ReadHandle::new(Some(read_tx), cmd_tx.clone()); + let node = Node::> { node_id, raft_core: Arc::new(Mutex::new(raft_core)), membership, event_tx: event_tx.clone(), + read_handle, cmd_tx, ready: AtomicBool::new(false), rpc_ready_tx, @@ -585,6 +598,7 @@ where #[cfg(feature = "watch")] _watch_dispatcher_handle: watch_system.map(|(_, _, handle, _)| handle), sm_worker_handle: std::sync::Mutex::new(Some(sm_worker_handle)), + read_actor_handle: std::sync::Mutex::new(Some(read_actor_handle)), _commit_handler_handle: Some(commit_handler_handle), _lease_cleanup_handle: lease_cleanup_handle, shutdown_signal: self.shutdown_signal.clone(), diff --git a/d-engine-server/src/node/mod.rs b/d-engine-server/src/node/mod.rs index b5ca19a9..c1064bfe 100644 --- a/d-engine-server/src/node/mod.rs +++ b/d-engine-server/src/node/mod.rs @@ -114,6 +114,10 @@ where /// ensuring `Arc` is released before run() returns. pub(crate) sm_worker_handle: std::sync::Mutex>>, + /// ReadActor task handle. Aborted in run() after sm_worker exits so that the + /// `Arc` (and the RocksDB LOCK) is released before run() returns. + pub(crate) read_actor_handle: std::sync::Mutex>>, + /// Commit handler task handle (background log application) pub(crate) _commit_handler_handle: Option>, @@ -125,6 +129,9 @@ where /// Read lease — same Arc as the one inside SharedState, exposed for EmbeddedClient. pub(crate) read_lease: Arc, + + /// Fast-path read routing. Always set; `read_tx = None` means no ReadActor. + pub(crate) read_handle: crate::api::ReadHandle, } impl Debug for Node @@ -187,6 +194,14 @@ where .ok(); } + // Abort ReadActor after sm_worker exits so Arc ref-count goes to zero + // and RocksDB LOCK is released before run() returns. + let ra_handle = self.read_actor_handle.lock().unwrap().take(); + if let Some(ra_handle) = ra_handle { + ra_handle.abort(); + let _ = ra_handle.await; + } + Ok(()) } diff --git a/d-engine-server/src/proto_convert.rs b/d-engine-server/src/proto_convert.rs index a2d675f6..a9722c33 100644 --- a/d-engine-server/src/proto_convert.rs +++ b/d-engine-server/src/proto_convert.rs @@ -211,6 +211,34 @@ pub(crate) fn to_proto_response(r: ClientResponse) -> proto_client::ClientRespon } } +/// Build a successful `ClientResponse` proto for a single-key fast-path read. +/// Build a fast-path read response from a batch of keys and their optional values. +/// +/// Keys with `None` values are omitted from results (key not found). +/// The result slice is positionally ordered and corresponds 1:1 to `keys`. +pub(crate) fn fast_path_batch_read_response( + keys: &[bytes::Bytes], + values: Vec>, +) -> proto_client::ClientResponse { + let results = keys + .iter() + .zip(values) + .filter_map(|(key, value)| { + value.map(|v| ClientResult { + key: key.clone(), + value: v, + }) + }) + .collect(); + proto_client::ClientResponse { + error: 0, // ErrorCode::Success + metadata: None, + success_result: Some(proto_client::client_response::SuccessResult::ReadData( + ProtoReadResults { results }, + )), + } +} + // ─── Helpers ────────────────────────────────────────────────────────────────── #[inline] diff --git a/d-engine-server/src/read_actor.rs b/d-engine-server/src/read_actor.rs new file mode 100644 index 00000000..246f6668 --- /dev/null +++ b/d-engine-server/src/read_actor.rs @@ -0,0 +1,131 @@ +//! ReadActor — dedicated read task for Eventual and LeaseRead fast path. +//! +//! Lives in `d-engine-server`, not `d-engine-core`, because it is a +//! performance optimisation component, not a Raft protocol component. +//! Removing it does not affect correctness of consensus, election, or +//! log replication. (Contrast: TiKV's LocalReader lives in tikv/src/server/, +//! not in raft-rs.) +//! +//! # Routing contract +//! +//! ```text +//! Eventual / LeaseRead ──► ReadActor ──► SM.get_multi() (no Raft loop) +//! Linearizable ──► cmd_tx ──► Raft loop (readIndex) +//! ``` +//! +//! # Lifecycle guarantee +//! +//! The caller drops `read_tx` to signal shutdown. `run_read_actor` exits when +//! `read_rx` is drained and closed, at which point `Arc` is dropped and the +//! RocksDB LOCK file is released — before `stop()` signals the Raft loop. + +use std::sync::Arc; + +use bytes::Bytes; +use d_engine_core::ReadLease; +use d_engine_core::StateMachine; +use d_engine_core::config::ReadConsistencyPolicy; +use d_engine_core::now_ms; +use tokio::sync::{mpsc, oneshot}; + +// ── ReadCmd ──────────────────────────────────────────────────────────────────── + +/// A read request dispatched from `ReadHandle` to `ReadActor`. +/// +/// Only `EventualConsistency` and `LeaseRead` are valid; `LinearizableRead` +/// must go through `cmd_tx` (Raft readIndex protocol). +/// +/// # Ordering guarantee +/// +/// The reply `Vec` is guaranteed to be the same length as `keys` and +/// positionally corresponds to the input key order. +pub(crate) struct ReadCmd { + pub keys: Vec, + pub consistency: ReadConsistencyPolicy, + pub reply: oneshot::Sender>, ReadActorError>>, +} + +// ── ReadActorError ───────────────────────────────────────────────────────────── + +/// Error returned by the ReadActor to the caller. +/// +/// `LeaseInvalid` and `SmStopped` are recoverable: fall back to `cmd_tx`. +/// `SmError` is a hard failure; do NOT retry via cmd_tx. +#[derive(Debug)] +pub(crate) enum ReadActorError { + /// Lease has been revoked or expired. Retry via cmd_tx. + LeaseInvalid, + /// State machine is not running (node is stopping). Retry via cmd_tx. + SmStopped, + /// SM returned a hard error. + SmError(String), +} + +// ── run_read_actor ───────────────────────────────────────────────────────────── + +/// Run the ReadActor loop until `read_rx` is closed. +/// +/// Designed to be spawned as an independent task: +/// ```ignore +/// tokio::spawn(run_read_actor(read_rx, lease, sm, max_drain)); +/// ``` +/// +/// `max_drain` caps how many commands are drained per wake-up (mirrors +/// `batching.max_batch_size` in the Raft loop). After the first `recv().await` +/// unblocks, the actor drains up to `max_drain` pending commands with +/// `try_recv()` before yielding — amortising the task-switch cost across +/// request batches. +pub(crate) async fn run_read_actor( + mut read_rx: mpsc::Receiver, + lease: Arc, + sm: Arc, + max_drain: usize, +) where + SM: StateMachine, +{ + while let Some(cmd) = read_rx.recv().await { + let reply = serve_read(&cmd, &lease, &sm); + let _ = cmd.reply.send(reply); + + // Drain commands that arrived while processing, without going back to + // sleep — same pattern as Raft::drain_client_cmds(). + let mut count = 1; + while count < max_drain { + match read_rx.try_recv() { + Ok(cmd) => { + let reply = serve_read(&cmd, &lease, &sm); + let _ = cmd.reply.send(reply); + count += 1; + } + Err(_) => break, + } + } + } + // read_rx closed → Arc drops here, releasing RocksDB LOCK +} + +fn serve_read( + cmd: &ReadCmd, + lease: &Arc, + sm: &Arc, +) -> Result>, ReadActorError> +where + SM: StateMachine, +{ + match cmd.consistency { + ReadConsistencyPolicy::EventualConsistency => { + if !sm.is_running() { + return Err(ReadActorError::SmStopped); + } + } + ReadConsistencyPolicy::LeaseRead => { + if !lease.is_valid(now_ms()) || !sm.is_running() { + return Err(ReadActorError::LeaseInvalid); + } + } + // LinearizableRead must not reach ReadActor — guard defensively + _ => return Err(ReadActorError::LeaseInvalid), + } + + sm.get_multi(&cmd.keys).map_err(|e| ReadActorError::SmError(e.to_string())) +} diff --git a/d-engine-core/src/read_actor_test.rs b/d-engine-server/src/read_actor_test.rs similarity index 60% rename from d-engine-core/src/read_actor_test.rs rename to d-engine-server/src/read_actor_test.rs index f663e7a1..f3704589 100644 --- a/d-engine-core/src/read_actor_test.rs +++ b/d-engine-server/src/read_actor_test.rs @@ -1,12 +1,10 @@ use std::sync::Arc; use bytes::Bytes; +use d_engine_core::config::ReadConsistencyPolicy; +use d_engine_core::{Error, MockStateMachine, ReadLease, now_ms}; use tokio::sync::{mpsc, oneshot}; -use crate::MockStateMachine; -use crate::ReadLease; -use crate::config::ReadConsistencyPolicy; -use crate::now_ms; use crate::read_actor::{ReadActorError, ReadCmd, run_read_actor}; fn make_sm_running() -> MockStateMachine { @@ -37,10 +35,25 @@ fn send_read( tx: &mpsc::Sender, key: &[u8], consistency: ReadConsistencyPolicy, -) -> oneshot::Receiver, ReadActorError>> { +) -> oneshot::Receiver>, ReadActorError>> { let (reply_tx, reply_rx) = oneshot::channel(); tx.try_send(ReadCmd { - key: Bytes::copy_from_slice(key), + keys: vec![Bytes::copy_from_slice(key)], + consistency, + reply: reply_tx, + }) + .expect("channel should have capacity"); + reply_rx +} + +fn send_read_multi( + tx: &mpsc::Sender, + keys: Vec, + consistency: ReadConsistencyPolicy, +) -> oneshot::Receiver>, ReadActorError>> { + let (reply_tx, reply_rx) = oneshot::channel(); + tx.try_send(ReadCmd { + keys, consistency, reply: reply_tx, }) @@ -52,20 +65,29 @@ fn send_read( #[tokio::test] async fn test_read_actor_eventual_read_returns_value() { let mut sm = make_sm_running(); - sm.expect_get() - .withf(|k| k == b"k1") - .returning(|_| Ok(Some(Bytes::from_static(b"v1")))); + sm.expect_get_multi().returning(|keys| { + Ok(keys + .iter() + .map(|k| { + if &k[..] == b"k1" { + Some(Bytes::from_static(b"v1")) + } else { + None + } + }) + .collect()) + }); let lease = valid_lease(); let (tx, rx) = mpsc::channel(8); - let handle = tokio::spawn(run_read_actor(rx, lease, Arc::new(sm), 64)); let reply_rx = send_read(&tx, b"k1", ReadConsistencyPolicy::EventualConsistency); drop(tx); - let result = reply_rx.await.expect("reply sent"); - assert_eq!(result.unwrap(), Some(Bytes::from_static(b"v1"))); + let values = reply_rx.await.expect("reply sent").unwrap(); + assert_eq!(values.len(), 1); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); handle.await.unwrap(); } @@ -73,7 +95,7 @@ async fn test_read_actor_eventual_read_returns_value() { #[tokio::test] async fn test_read_actor_eventual_read_missing_key_returns_none() { let mut sm = make_sm_running(); - sm.expect_get().returning(|_| Ok(None)); + sm.expect_get_multi().returning(|keys| Ok(keys.iter().map(|_| None).collect())); let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); @@ -81,7 +103,40 @@ async fn test_read_actor_eventual_read_missing_key_returns_none() { let reply_rx = send_read(&tx, b"missing", ReadConsistencyPolicy::EventualConsistency); drop(tx); - assert!(reply_rx.await.unwrap().unwrap().is_none()); + let values = reply_rx.await.unwrap().unwrap(); + assert_eq!(values.len(), 1); + assert_eq!(values[0], None); + handle.await.unwrap(); +} + +/// Multi-key Eventual read returns all values in positional order +#[tokio::test] +async fn test_read_actor_eventual_multi_key_returns_ordered_values() { + let mut sm = make_sm_running(); + sm.expect_get_multi().returning(|keys| { + Ok(keys + .iter() + .map(|k| { + if &k[..] == b"k1" { + Some(Bytes::from_static(b"v1")) + } else { + None + } + }) + .collect()) + }); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let reply_rx = send_read_multi(&tx, keys, ReadConsistencyPolicy::EventualConsistency); + drop(tx); + + let values = reply_rx.await.unwrap().unwrap(); + assert_eq!(values.len(), 2); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(values[1], None); handle.await.unwrap(); } @@ -104,7 +159,8 @@ async fn test_read_actor_eventual_sm_stopped_returns_error() { #[tokio::test] async fn test_read_actor_lease_read_valid_lease_returns_value() { let mut sm = make_sm_running(); - sm.expect_get().returning(|_| Ok(Some(Bytes::from_static(b"val")))); + sm.expect_get_multi() + .returning(|keys| Ok(keys.iter().map(|_| Some(Bytes::from_static(b"val"))).collect())); let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); @@ -136,7 +192,7 @@ async fn test_read_actor_lease_revoked_returns_lease_invalid() { async fn test_read_actor_lease_expired_returns_lease_invalid() { let sm = make_sm_running(); let lease = Arc::new(ReadLease::new()); - lease.renew(1, now_ms().saturating_sub(1)); // deadline already past + lease.renew(1, now_ms().saturating_sub(1)); let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, lease, Arc::new(sm), 64)); @@ -174,22 +230,56 @@ async fn test_read_actor_exits_when_channel_closed() { let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, valid_lease(), sm_arc, 64)); - drop(tx); // close sender → ReadActor loop exits + drop(tx); handle.await.unwrap(); - // After ReadActor exits, Arc count should be 0 (sole owner was ReadActor) assert!( sm_weak.upgrade().is_none(), "Arc should be dropped when ReadActor exits" ); } -/// sm.get() returning Err maps to ReadActorError::SmError (not swallowed) +/// serve_read calls sm.get_multi() — verified by explicit expect_get_multi() expectation. +/// +/// Tests that only set up expect_get() rely on MockStateMachine's default-impl delegation +/// (get_multi → get). This test sets up expect_get_multi() directly to verify that +/// serve_read → sm.get_multi() is the actual call path, not just an indirect get() chain. +#[tokio::test] +async fn test_read_actor_eventual_multi_key_uses_get_multi() { + let mut sm = make_sm_running(); + sm.expect_get_multi().returning(|keys| { + Ok(keys + .iter() + .map(|k| { + if &k[..] == b"k1" { + Some(Bytes::from_static(b"v1")) + } else { + None + } + }) + .collect()) + }); + + let (tx, rx) = mpsc::channel(8); + let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); + + let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; + let reply_rx = send_read_multi(&tx, keys, ReadConsistencyPolicy::EventualConsistency); + drop(tx); + + let values = reply_rx.await.unwrap().unwrap(); + assert_eq!(values.len(), 2); + assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); + assert_eq!(values[1], None); + handle.await.unwrap(); +} + +/// sm.get_multi() returning Err propagates as SmError through serve_read. #[tokio::test] -async fn test_read_actor_sm_get_error_returns_sm_error() { +async fn test_read_actor_sm_get_multi_error_returns_sm_error() { let mut sm = make_sm_running(); - sm.expect_get().returning(|_| Err(crate::Error::Fatal("disk failure".into()))); + sm.expect_get_multi().returning(|_| Err(Error::Fatal("disk failure".into()))); let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); @@ -203,10 +293,10 @@ async fn test_read_actor_sm_get_error_returns_sm_error() { } /// LinearizableRead must never reach ReadActor — defensive guard returns LeaseInvalid. -/// If get() were called, mockall would panic (no expectation set) — implicit safety net. +/// If get_multi() were called, mockall would panic (no expectation set) — implicit safety net. #[tokio::test] async fn test_read_actor_linearizable_read_returns_lease_invalid() { - let sm = make_sm_running(); // no expect_get() — any get() call panics + let sm = make_sm_running(); // no expect_get_multi() — any get_multi() call panics let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, valid_lease(), Arc::new(sm), 64)); @@ -229,7 +319,7 @@ async fn test_read_actor_revoke_invalidates_in_flight_reads() { let (tx, rx) = mpsc::channel(8); let handle = tokio::spawn(run_read_actor(rx, lease, Arc::new(sm), 64)); - lease_clone.revoke(); // revoke before read is processed + lease_clone.revoke(); let reply_rx = send_read(&tx, b"k", ReadConsistencyPolicy::LeaseRead); drop(tx); diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs index 2e00237b..704406cc 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs @@ -1581,4 +1581,14 @@ impl StateMachine for FileStateMachine { let revision = self.last_applied_index.load(Ordering::SeqCst); Ok(ScanResult { entries, revision }) } + + fn get_multi( + &self, + keys: &[Bytes], + ) -> d_engine_core::Result>> { + // Hold read lock for the full batch so all keys come from the same consistent view. + // apply_chunk holds the write lock; parking_lot RwLock ensures they don't interleave. + let data = self.data.read(); + Ok(keys.iter().map(|k| data.get(k).map(|(v, _)| v.clone())).collect()) + } } diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs index fb40cd35..b9031e3a 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs @@ -397,6 +397,106 @@ async fn test_file_sm_scan_prefix_empty_namespace() { ); } +// ── get_multi tests ─────────────────────────────────────────────────────────── + +/// FileStateMachine get_multi holds a read lock for the entire batch, ensuring +/// that state transitions are atomic from the reader's perspective. +/// +/// Because apply_chunk acquires a write lock when updating self.data, a concurrent +/// write cannot interleave between the individual key reads inside get_multi. +/// The result is always either the full pre-write state or the full post-write state — +/// never a mix of values from different apply indexes. +/// +/// This test verifies sequential coherence: after each state transition, all keys +/// in the batch reflect the same version with no cross-version contamination. +#[tokio::test] +async fn test_get_multi_file_sm_atomic_state_transitions() { + let temp_dir = tempfile::tempdir().unwrap(); + let sm = FileStateMachine::new(temp_dir.path().to_path_buf()).await.unwrap(); + + // v1: initial state + sm.apply_chunk(&[ + ApplyEntry { + index: 1, + term: 1, + command: Command::Insert { + key: Bytes::from("/svc/addr"), + value: Bytes::from("10.0.0.1"), + ttl_secs: None, + }, + }, + ApplyEntry { + index: 2, + term: 1, + command: Command::Insert { + key: Bytes::from("/svc/version"), + value: Bytes::from("v1"), + ttl_secs: None, + }, + }, + ]) + .await + .unwrap(); + + let keys = vec![Bytes::from("/svc/addr"), Bytes::from("/svc/version")]; + + // Read after v1 — both fields must be from v1 + let v1_result = sm.get_multi(&keys).unwrap(); + assert_eq!( + v1_result[0], + Some(Bytes::from("10.0.0.1")), + "addr must be v1" + ); + assert_eq!(v1_result[1], Some(Bytes::from("v1")), "version must be v1"); + + // Apply v2: both fields transition together + sm.apply_chunk(&[ + ApplyEntry { + index: 3, + term: 1, + command: Command::Insert { + key: Bytes::from("/svc/addr"), + value: Bytes::from("10.0.0.2"), + ttl_secs: None, + }, + }, + ApplyEntry { + index: 4, + term: 1, + command: Command::Insert { + key: Bytes::from("/svc/version"), + value: Bytes::from("v2"), + ttl_secs: None, + }, + }, + ]) + .await + .unwrap(); + + // Read after v2 — both fields must be from v2 + let v2_result = sm.get_multi(&keys).unwrap(); + assert_eq!( + v2_result[0], + Some(Bytes::from("10.0.0.2")), + "addr must be v2" + ); + assert_eq!(v2_result[1], Some(Bytes::from("v2")), "version must be v2"); + + // Verify internal consistency of each result: addr and version must come from + // the same version. A torn read (addr=v2 + version=v1) would indicate that + // the read lock is not held across the full batch, which is a correctness bug. + for (label, result) in [("v1_result", &v1_result), ("v2_result", &v2_result)] { + let is_v1 = + result[0] == Some(Bytes::from("10.0.0.1")) && result[1] == Some(Bytes::from("v1")); + let is_v2 = + result[0] == Some(Bytes::from("10.0.0.2")) && result[1] == Some(Bytes::from("v2")); + assert!( + is_v1 || is_v2, + "{label}: torn read — result is neither pure v1 nor pure v2: {result:?}" + ); + } +} + /// scan_prefix revision equals last_applied_index at scan time. #[tokio::test] async fn test_file_sm_scan_prefix_revision_reflects_applied_index() { diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs index 319fb4d5..7e3b8dec 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs @@ -1075,6 +1075,32 @@ impl StateMachine for RocksDBStateMachine { ) -> Result { self.scan_prefix(prefix) } + + fn get_multi( + &self, + keys: &[Bytes], + ) -> Result>, Error> { + if !self.is_serving.load(Ordering::SeqCst) { + return Err(StorageError::NotServing( + "State machine is restoring from snapshot".to_string(), + ) + .into()); + } + let db = self.db.load(); + let cf = db + .cf_handle(STATE_MACHINE_CF) + .ok_or_else(|| StorageError::DbError("State machine CF not found".to_string()))?; + // One snapshot covers the full batch: all keys read from the same point-in-time. + // Snapshot lives only within this call — no lifetime escaping, no unsafe. + let snap = db.snapshot(); + keys.iter() + .map(|k| { + snap.get_cf(&cf, k) + .map(|v| v.map(|b| Bytes::copy_from_slice(&b))) + .map_err(|e| StorageError::DbError(e.to_string()).into()) + }) + .collect() + } } impl Drop for RocksDBStateMachine { fn drop(&mut self) { diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs index a4fd99c9..c7af72f7 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs @@ -343,6 +343,100 @@ async fn test_scan_prefix_all_0xff_no_upper_bound() { assert_eq!(result.entries[0].0, Bytes::copy_from_slice(key)); } +// ── get_multi tests ─────────────────────────────────────────────────────────── + +/// RocksDB get_multi uses db.snapshot() to guarantee snapshot isolation. +/// +/// A snapshot taken at the start of the batch read freezes the visible state: +/// writes committed after the snapshot is taken are invisible to that batch. +/// This means every (key, value) pair in the result comes from the same +/// point-in-time state, preventing torn reads across apply indexes. +/// +/// This test verifies two things: +/// 1. get_multi returns the current state accurately after each apply. +/// 2. Each result set is internally consistent — no v1/v2 mix is possible. +#[tokio::test] +async fn test_get_multi_rocksdb_snapshot_reads_consistent_state() { + let dir = tempfile::TempDir::new().unwrap(); + let (_storage, sm) = RocksDBUnifiedEngine::open(dir.path()).unwrap(); + + // Apply v1: initial deployment state + sm.apply_chunk(&[ + insert_at(b"/svc/addr", b"10.0.0.1:8080", 1), + insert_at(b"/svc/version", b"v1", 2), + insert_at(b"/svc/health", b"healthy", 3), + ]) + .await + .unwrap(); + + let keys = vec![ + Bytes::from_static(b"/svc/addr"), + Bytes::from_static(b"/svc/version"), + Bytes::from_static(b"/svc/health"), + ]; + + // Read after v1 — must see full v1 state + let v1_result = sm.get_multi(&keys).unwrap(); + assert_eq!( + v1_result[0], + Some(Bytes::from_static(b"10.0.0.1:8080")), + "addr must be v1" + ); + assert_eq!( + v1_result[1], + Some(Bytes::from_static(b"v1")), + "version must be v1" + ); + assert_eq!( + v1_result[2], + Some(Bytes::from_static(b"healthy")), + "health must be v1" + ); + + // Apply v2: new deployment — all three fields transition + sm.apply_chunk(&[ + insert_at(b"/svc/addr", b"10.0.0.2:8080", 4), + insert_at(b"/svc/version", b"v2", 5), + insert_at(b"/svc/health", b"starting", 6), + ]) + .await + .unwrap(); + + // Read after v2 — must see full v2 state, no v1 values mixed in + let v2_result = sm.get_multi(&keys).unwrap(); + assert_eq!( + v2_result[0], + Some(Bytes::from_static(b"10.0.0.2:8080")), + "addr must be v2" + ); + assert_eq!( + v2_result[1], + Some(Bytes::from_static(b"v2")), + "version must be v2" + ); + assert_eq!( + v2_result[2], + Some(Bytes::from_static(b"starting")), + "health must be v2" + ); + + // Verify each result set is internally consistent (snapshot isolation guarantee). + // A torn read — e.g., addr=v2 + version=v1 — would indicate the snapshot is not + // held for the full batch, which would be a correctness violation. + for (label, result) in [("v1_result", &v1_result), ("v2_result", &v2_result)] { + let is_v1 = result[0] == Some(Bytes::from_static(b"10.0.0.1:8080")) + && result[1] == Some(Bytes::from_static(b"v1")) + && result[2] == Some(Bytes::from_static(b"healthy")); + let is_v2 = result[0] == Some(Bytes::from_static(b"10.0.0.2:8080")) + && result[1] == Some(Bytes::from_static(b"v2")) + && result[2] == Some(Bytes::from_static(b"starting")); + assert!( + is_v1 || is_v2, + "{label}: torn read detected — result is neither pure v1 nor pure v2: {result:?}" + ); + } +} + // ── Helpers ─────────────────────────────────────────────────────────────────── fn insert_at( diff --git a/d-engine-server/src/test_utils/mock/mock_node_builder.rs b/d-engine-server/src/test_utils/mock/mock_node_builder.rs index 1e0350ac..91281d4c 100644 --- a/d-engine-server/src/test_utils/mock/mock_node_builder.rs +++ b/d-engine-server/src/test_utils/mock/mock_node_builder.rs @@ -326,6 +326,7 @@ impl MockBuilder { raft_core: Arc::new(Mutex::new(raft)), membership, event_tx, + read_handle: crate::api::ReadHandle::new(None, cmd_tx.clone()), cmd_tx, ready: AtomicBool::new(false), rpc_ready_tx, @@ -337,6 +338,7 @@ impl MockBuilder { #[cfg(feature = "watch")] _watch_dispatcher_handle: None, sm_worker_handle: std::sync::Mutex::new(None), + read_actor_handle: std::sync::Mutex::new(None), _commit_handler_handle: None, _lease_cleanup_handle: None, shutdown_signal, @@ -377,6 +379,7 @@ impl MockBuilder { raft_core: Arc::new(Mutex::new(raft)), membership, event_tx, + read_handle: crate::api::ReadHandle::new(None, cmd_tx.clone()), cmd_tx, ready: AtomicBool::new(false), rpc_ready_tx, @@ -388,6 +391,7 @@ impl MockBuilder { #[cfg(feature = "watch")] _watch_dispatcher_handle: None, sm_worker_handle: std::sync::Mutex::new(None), + read_actor_handle: std::sync::Mutex::new(None), _commit_handler_handle: None, _lease_cleanup_handle: None, shutdown_signal: shutdown.clone(), From e4787310b74027b03a2424cadaaf4b4b76e20909 Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Sun, 31 May 2026 11:39:46 +0800 Subject: [PATCH 03/12] fix(read) #392: close lease revocation window and harden config validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - leader_state: revoke lease immediately on higher-term detection (VoteRequest / AppendEntries / AppendResult) — eliminates the window between send_become_follower_event() and become_follower() where ReadActor could still serve stale LeaseRead - read_lease: promote debug_assert! to assert! so overflow guard fires in release builds - ReadActorConfig: add validate() rejecting channel_capacity=0 and max_drain=0; call from RaftConfig::validate() - ReadConsistencyConfig: move lease_duration_ms < election_timeout_min constraint into ReadConsistencyConfig::validate(election_timeout_min), making the safety invariant self-contained at the right layer - proto_convert: remove contradictory "single-key" doc comment - Tests: 3 window-period tests for become_follower, 4 ReadActorConfig validation tests, 1 ReadConsistencyConfig lease safety unit test --- d-engine-core/src/config/raft.rs | 69 ++++++--- d-engine-core/src/config/raft_test.rs | 95 ++++++++++++ d-engine-core/src/raft_role/leader_state.rs | 9 ++ .../leader_state_test/become_follower_test.rs | 146 ++++++++++++++++++ d-engine-core/src/raft_role/read_lease.rs | 4 +- d-engine-server/src/proto_convert.rs | 1 - 6 files changed, 299 insertions(+), 25 deletions(-) diff --git a/d-engine-core/src/config/raft.rs b/d-engine-core/src/config/raft.rs index 3091a862..5058eb7d 100644 --- a/d-engine-core/src/config/raft.rs +++ b/d-engine-core/src/config/raft.rs @@ -179,24 +179,11 @@ impl RaftConfig { self.membership.validate()?; self.state_machine.validate()?; self.snapshot.validate()?; - self.read_consistency.validate()?; + self.read_consistency.validate(self.election.election_timeout_min)?; + self.read_actor.validate()?; self.watch.validate()?; self.persistence.validate()?; - // Enforce lease_duration < election_timeout (load-bearing safety constraint). - // The lease fast path for linearizable reads relies on the invariant that - // "lease valid" and "new leader elected" are mutually exclusive on the timeline. - // This holds only when: lease_duration < election_timeout - max_clock_drift. - // At minimum, lease_duration must be strictly less than election_timeout_min. - if self.read_consistency.lease_duration_ms >= self.election.election_timeout_min { - return Err(Error::Config(ConfigError::Message(format!( - "read_consistency.lease_duration_ms ({}) must be strictly less than \ - election_timeout_min ({}ms) — required for lease-based linearizable reads \ - to be safe under partition", - self.read_consistency.lease_duration_ms, self.election.election_timeout_min, - )))); - } - Ok(()) } } @@ -259,6 +246,26 @@ impl Default for ReadActorConfig { } } +impl ReadActorConfig { + pub(crate) fn validate(&self) -> Result<()> { + if self.channel_capacity == 0 { + return Err(Error::Config(ConfigError::Message( + "read_actor.channel_capacity must be at least 1 \ + (0 causes mpsc::channel to panic at startup)" + .into(), + ))); + } + if self.max_drain == 0 { + return Err(Error::Config(ConfigError::Message( + "read_actor.max_drain must be at least 1 \ + (0 disables post-wakeup batching — ReadActor drains no additional commands)" + .into(), + ))); + } + Ok(()) + } +} + fn default_read_actor_channel_capacity() -> usize { 512 } @@ -1037,12 +1044,19 @@ pub struct ReadConsistencyConfig { #[serde(default)] pub default_policy: ReadConsistencyPolicy, - /// Lease duration in milliseconds for LeaseRead policy + /// Lease duration in milliseconds for LeaseRead policy. /// - /// Only applicable when using the LeaseRead policy. The leader considers - /// itself valid for this duration after successfully heartbeating to a quorum. + /// How long the leader treats its lease as valid after the last quorum ACK. /// - /// **MUST be > 0**. Config validation will reject 0 or invalid values. + /// **Safety constraint** (enforced by `RaftConfig::validate()`): + /// `lease_duration_ms < election_timeout_min` + /// + /// Full theoretical bound (Raft §6.4): + /// `lease_duration_ms < election_timeout_min - max_clock_drift` + /// + /// The simplified check (`< election_timeout_min`) is safe when NTP drift is + /// well below the margin. For environments with large clock drift, set + /// `lease_duration_ms` conservatively (e.g., `election_timeout_min - 2 × max_drift`). #[serde(default = "default_lease_duration_ms")] pub lease_duration_ms: u64, @@ -1074,7 +1088,7 @@ impl Default for ReadConsistencyConfig { } fn default_lease_duration_ms() -> u64 { - // Conservative default: half of a typical heartbeat interval (~300ms) + // 2.5× the default heartbeat interval (100ms); safely below election_timeout_min (500ms). 250 } @@ -1088,13 +1102,24 @@ fn default_state_machine_sync_timeout_ms() -> u64 { } impl ReadConsistencyConfig { - fn validate(&self) -> Result<()> { - // Validate read consistency configuration + pub(super) fn validate( + &self, + election_timeout_min: u64, + ) -> Result<()> { if self.lease_duration_ms == 0 { return Err(Error::Config(ConfigError::Message( "read_consistency.lease_duration_ms must be greater than 0".into(), ))); } + // Safety constraint (Raft §6.4): lease_duration < election_timeout - max_clock_drift. + // Enforcing < election_timeout_min is the conservative bound (assumes drift = 0). + if self.lease_duration_ms >= election_timeout_min { + return Err(Error::Config(ConfigError::Message(format!( + "read_consistency.lease_duration_ms ({}) must be strictly less than \ + election_timeout_min ({}ms) — required for lease safety under partition", + self.lease_duration_ms, election_timeout_min, + )))); + } Ok(()) } } diff --git a/d-engine-core/src/config/raft_test.rs b/d-engine-core/src/config/raft_test.rs index 9a9bb2c3..aeaa184d 100644 --- a/d-engine-core/src/config/raft_test.rs +++ b/d-engine-core/src/config/raft_test.rs @@ -3,6 +3,7 @@ use crate::ElectionConfig; use crate::RaftConfig; use crate::ReadConsistencyConfig; use crate::RpcCompressionConfig; +use crate::config::raft::ReadActorConfig; #[test] fn test_invalid_election_timeout() { let mut config = RaftConfig::default(); @@ -232,3 +233,97 @@ fn test_config_rejects_lease_duration_not_less_than_election_timeout() { "lease_duration_ms < election_timeout_min must be accepted" ); } + +/// Direct unit test for ReadConsistencyConfig::validate() — lease safety constraint. +/// +/// This pins the Raft §6.4 invariant at the config layer: +/// lease_duration_ms < election_timeout_min +/// +/// Tested directly on ReadConsistencyConfig (not via RaftConfig) so the constraint +/// is verified at the closest possible layer to the data. +#[test] +fn test_read_consistency_config_lease_duration_rejects_unsafe_values() { + let election_timeout_min = 500u64; + + // equal → unsafe, must reject + let cfg = ReadConsistencyConfig { + lease_duration_ms: 500, + ..Default::default() + }; + assert!( + cfg.validate(election_timeout_min).is_err(), + "lease_duration_ms == election_timeout_min violates safety invariant" + ); + + // greater → unsafe, must reject + let cfg = ReadConsistencyConfig { + lease_duration_ms: 600, + ..Default::default() + }; + assert!( + cfg.validate(election_timeout_min).is_err(), + "lease_duration_ms > election_timeout_min violates safety invariant" + ); + + // strictly less → safe, must accept + let cfg = ReadConsistencyConfig { + lease_duration_ms: 250, + ..Default::default() + }; + assert!( + cfg.validate(election_timeout_min).is_ok(), + "lease_duration_ms < election_timeout_min must be accepted" + ); + + // zero → must reject (separate guard) + let cfg = ReadConsistencyConfig { + lease_duration_ms: 0, + ..Default::default() + }; + assert!( + cfg.validate(election_timeout_min).is_err(), + "lease_duration_ms = 0 must be rejected" + ); +} + +#[test] +fn test_read_actor_channel_capacity_zero_is_invalid() { + let cfg = ReadActorConfig { + channel_capacity: 0, + max_drain: 100, + }; + assert!( + cfg.validate().is_err(), + "channel_capacity = 0 must be rejected (mpsc::channel(0) panics at startup)" + ); +} + +#[test] +fn test_read_actor_max_drain_zero_is_invalid() { + let cfg = ReadActorConfig { + channel_capacity: 512, + max_drain: 0, + }; + assert!( + cfg.validate().is_err(), + "max_drain = 0 must be rejected (drains 0 commands per wakeup — disables batching)" + ); +} + +#[test] +fn test_read_actor_default_config_is_valid() { + assert!( + ReadActorConfig::default().validate().is_ok(), + "default ReadActorConfig must be valid" + ); +} + +#[test] +fn test_raft_config_propagates_read_actor_validation() { + let mut config = RaftConfig::default(); + config.read_actor.channel_capacity = 0; + assert!( + config.validate().is_err(), + "RaftConfig::validate must propagate ReadActorConfig::validate failures" + ); +} diff --git a/d-engine-core/src/raft_role/leader_state.rs b/d-engine-core/src/raft_role/leader_state.rs index 388528de..59688442 100644 --- a/d-engine-core/src/raft_role/leader_state.rs +++ b/d-engine-core/src/raft_role/leader_state.rs @@ -1116,6 +1116,9 @@ impl RaftRoleState for LeaderState { let my_term = self.current_term(); if my_term < vote_request.term { self.update_current_term(vote_request.term); + // Revoke lease immediately — before the Raft loop processes BecomeFollower, + // a concurrent ReadActor could still see the old valid lease (window-period bug). + self.shared_state.lease.revoke(); // Step down as Follower self.send_become_follower_event(None, &role_tx)?; @@ -1219,6 +1222,8 @@ impl RaftRoleState for LeaderState { my_id ); //TODO: if there is a bug? self.update_current_term(vote_request.term); + // Revoke lease immediately — window-period fix (see VoteRequest branch). + self.shared_state.lease.revoke(); self.send_become_follower_event( Some(append_entries_request.leader_id), &role_tx, @@ -1766,6 +1771,8 @@ impl RaftRoleState for LeaderState { ); self.update_current_term(response.term); self.drain_pending_writes_with_error(ErrorCode::TermOutdated); + // Revoke lease immediately — window-period fix (see VoteRequest branch). + self.shared_state.lease.revoke(); self.send_become_follower_event(None, role_tx)?; return Err(ReplicationError::HigherTerm(response.term).into()); } @@ -1793,6 +1800,8 @@ impl RaftRoleState for LeaderState { if term > leader_term { self.update_current_term(term); self.drain_pending_writes_with_error(ErrorCode::TermOutdated); + // Revoke lease immediately — window-period fix (see VoteRequest branch). + self.shared_state.lease.revoke(); self.send_become_follower_event(None, role_tx)?; return Err(ReplicationError::HigherTerm(term).into()); } diff --git a/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs b/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs index 4240bcfa..96c2b42e 100644 --- a/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs +++ b/d-engine-core/src/raft_role/leader_state_test/become_follower_test.rs @@ -161,6 +161,152 @@ async fn test_receive_higher_term_append_entries_revokes_lease() { ); } +/// Higher-term VoteRequest → lease revoked BEFORE Raft loop calls become_follower(). +/// +/// Pins the window-period safety contract: the Raft loop sends BecomeFollower into +/// role_tx but may not process it immediately (async event-driven). During that gap a +/// concurrent ReadActor task can observe the old valid lease and serve a stale LeaseRead. +/// +/// This test verifies the fix: revoke() is called at the detection point itself, so +/// the lease is invalid as soon as handle_raft_event() returns — before become_follower() +/// is ever called by the Raft loop. +/// +/// Expected to FAIL before the fix (lease still valid in window), PASS after. +#[tokio::test] +async fn test_vote_request_higher_term_lease_revoked_before_become_follower() { + let (_graceful_tx, graceful_rx) = watch::channel(()); + let context = MockBuilder::new(graceful_rx) + .with_db_path("/tmp/test_vote_request_revokes_lease_early") + .build_context(); + + let mut state = LeaderState::::new(1, context.node_config.clone()); + let lease = Arc::clone(&state.shared_state.lease); + + state.test_update_lease_timestamp(); + assert!( + lease.is_valid(now_ms()), + "precondition: lease must be valid" + ); + + let (resp_tx, _resp_rx) = >::new(); + let (role_tx, mut role_rx) = mpsc::unbounded_channel(); + let event = RaftEvent::ReceiveVoteRequest( + VoteRequest { + term: 999, + candidate_id: 2, + last_log_index: 0, + last_log_term: 0, + }, + resp_tx, + ); + state.handle_raft_event(event, &context, role_tx).await.ok(); + + assert!( + matches!(role_rx.try_recv(), Ok(RoleEvent::BecomeFollower(_))), + "higher-term VoteRequest must emit BecomeFollower" + ); + + // become_follower() is intentionally NOT called here — the Raft loop has not yet + // processed the BecomeFollower event. The lease must already be invalid. + assert!( + !lease.is_valid(now_ms()), + "lease must be revoked at detection point, not waiting for become_follower() \ + — window-period fix required in handle_raft_event VoteRequest branch" + ); +} + +/// Higher-term AppendEntries → lease revoked BEFORE Raft loop calls become_follower(). +/// +/// Same window-period contract as test_vote_request_higher_term_lease_revoked_before_become_follower, +/// for the AppendEntries detection path. +#[tokio::test] +async fn test_append_entries_higher_term_lease_revoked_before_become_follower() { + let (_graceful_tx, graceful_rx) = watch::channel(()); + let context = MockBuilder::new(graceful_rx) + .with_db_path("/tmp/test_append_entries_revokes_lease_early") + .build_context(); + + let mut state = LeaderState::::new(1, context.node_config.clone()); + state.update_current_term(10); + let lease = Arc::clone(&state.shared_state.lease); + + state.test_update_lease_timestamp(); + assert!( + lease.is_valid(now_ms()), + "precondition: lease must be valid" + ); + + let (resp_tx, _resp_rx) = >::new(); + let (role_tx, mut role_rx) = mpsc::unbounded_channel(); + let event = RaftEvent::AppendEntries( + AppendEntriesRequest { + term: 11, + leader_id: 2, + prev_log_index: 0, + prev_log_term: 0, + entries: vec![], + leader_commit_index: 0, + }, + resp_tx, + ); + state.handle_raft_event(event, &context, role_tx).await.ok(); + + assert!( + matches!(role_rx.try_recv(), Ok(RoleEvent::BecomeFollower(_))), + "higher-term AppendEntries must emit BecomeFollower" + ); + + // become_follower() intentionally NOT called — pinning the window-period invariant. + assert!( + !lease.is_valid(now_ms()), + "lease must be revoked at detection point, not waiting for become_follower() \ + — window-period fix required in handle_raft_event AppendEntries branch" + ); +} + +/// Higher-term AppendResult → lease revoked BEFORE Raft loop calls become_follower(). +/// +/// Same window-period contract for the handle_append_result detection path. +#[tokio::test] +async fn test_append_result_higher_term_lease_revoked_before_become_follower() { + let (_graceful_tx, graceful_rx) = watch::channel(()); + let context = MockBuilder::new(graceful_rx) + .with_db_path("/tmp/test_append_result_revokes_lease_early") + .build_context(); + + let mut state = LeaderState::::new(1, context.node_config.clone()); + let lease = Arc::clone(&state.shared_state.lease); + + state.test_update_lease_timestamp(); + assert!( + lease.is_valid(now_ms()), + "precondition: lease must be valid" + ); + + let (role_tx, mut role_rx) = mpsc::unbounded_channel(); + let higher_term_response = AppendEntriesResponse { + node_id: 2, + term: 999, + result: None, + }; + let result = state + .handle_append_result(2, Ok(higher_term_response), &context, &role_tx) + .await; + + assert!(result.is_err(), "higher-term AppendResult must return Err"); + assert!( + matches!(role_rx.try_recv(), Ok(RoleEvent::BecomeFollower(_))), + "higher-term AppendResult must emit BecomeFollower" + ); + + // become_follower() intentionally NOT called — pinning the window-period invariant. + assert!( + !lease.is_valid(now_ms()), + "lease must be revoked at detection point, not waiting for become_follower() \ + — window-period fix required in handle_append_result HigherTerm branch" + ); +} + /// Higher-term AppendResult → BecomeFollower event → become_follower() → lease revoked. /// /// End-to-end pin for the path: diff --git a/d-engine-core/src/raft_role/read_lease.rs b/d-engine-core/src/raft_role/read_lease.rs index 9eab7f10..9e855549 100644 --- a/d-engine-core/src/raft_role/read_lease.rs +++ b/d-engine-core/src/raft_role/read_lease.rs @@ -56,9 +56,9 @@ impl ReadLease { term: u64, deadline_ms: u64, ) -> u64 { - debug_assert!( + assert!( deadline_ms <= Self::DEADLINE_MASK, - "deadline_ms overflows 48 bits" + "deadline_ms overflows 48 bits: {deadline_ms}" ); ((term & 0xFFFF) << Self::TERM_SHIFT) | (deadline_ms & Self::DEADLINE_MASK) } diff --git a/d-engine-server/src/proto_convert.rs b/d-engine-server/src/proto_convert.rs index a9722c33..dbb00f05 100644 --- a/d-engine-server/src/proto_convert.rs +++ b/d-engine-server/src/proto_convert.rs @@ -211,7 +211,6 @@ pub(crate) fn to_proto_response(r: ClientResponse) -> proto_client::ClientRespon } } -/// Build a successful `ClientResponse` proto for a single-key fast-path read. /// Build a fast-path read response from a batch of keys and their optional values. /// /// Keys with `None` values are omitted from results (key not found). From c2f256e370c3e1dee99696e860775f30aa99aacb Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Sun, 31 May 2026 11:39:59 +0800 Subject: [PATCH 04/12] docs #392: update docs for DefaultEmbeddedEngine and v0.2.5 read fast path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace EmbeddedEngine/EmbeddedClient with DefaultEmbeddedEngine/ DefaultEmbeddedClient in all code examples (README, quick-start, integration-modes, watch-feature, ha-deployment, d-engine-server README, examples/quick-start-embedded) - read-consistency: document ReadActor fast path, fix EventualConsistency "Any node" claim, add 0 RTT explanation - consistency-tuning: fix lease_duration_ms default (500→250), fix all scenario configs that would fail validate(), add both formula bounds, remove 6 non-existent raft.xxx metrics, drop fictional Monitoring section - throughput-optimization-guide: replace architectural prose with actionable channel_capacity/max_drain tuning table (correct defaults: capacity=512, max_drain=100) - raft.rs lease_duration_ms: add full safety constraint doc including theoretical bound and clock drift guidance; fix wrong default comment --- README.md | 2 +- d-engine-server/README.md | 8 +- .../src/docs/client_guide/read-consistency.md | 6 +- .../examples/ha-deployment-load-balancing.md | 2 +- d-engine/src/docs/integration-modes.md | 4 +- d-engine/src/docs/overview.md | 2 +- .../throughput-optimization-guide.md | 29 +++++- d-engine/src/docs/quick-start-5min.md | 39 ++++---- d-engine/src/docs/quick-start-standalone.md | 2 +- .../docs/server_guide/consistency-tuning.md | 96 +++++-------------- .../src/docs/server_guide/watch-feature.md | 8 +- examples/quick-start-embedded/README.md | 4 +- 12 files changed, 92 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index 9573bfb8..df1462fb 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ use std::time::Duration; #[tokio::main] async fn main() { - let engine = EmbeddedEngine::start("./data").await.unwrap(); + let engine = DefaultEmbeddedEngine::start("./data").await.unwrap(); engine.wait_ready(Duration::from_secs(5)).await.unwrap(); let client = engine.client(); diff --git a/d-engine-server/README.md b/d-engine-server/README.md index 0ba57f76..608a01db 100644 --- a/d-engine-server/README.md +++ b/d-engine-server/README.md @@ -44,12 +44,12 @@ d-engine-server = "0.2" ### Embedded Mode (zero-overhead local client) ```rust -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use std::time::Duration; #[tokio::main] async fn main() -> Result<(), Box> { - let engine = EmbeddedEngine::start_with("config.toml").await?; + let engine = DefaultEmbeddedEngine::start_with("config.toml").await?; engine.wait_ready(Duration::from_secs(5)).await?; let client = engine.client(); @@ -184,13 +184,13 @@ See the [Server Guide](https://docs.rs/d-engine/latest/d_engine/docs/server_guid High-level API for embedding d-engine in Rust applications: ```rust -use d_engine_server::EmbeddedEngine; +use d_engine_server::DefaultEmbeddedEngine; use std::time::Duration; #[tokio::main] async fn main() -> Result<(), Box> { // Start embedded engine with config file - let engine = EmbeddedEngine::start_with("d-engine.toml").await?; + let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // Wait for leader election let leader = engine.wait_ready(Duration::from_secs(5)).await?; diff --git a/d-engine/src/docs/client_guide/read-consistency.md b/d-engine/src/docs/client_guide/read-consistency.md index 8d977dd0..8abe9386 100644 --- a/d-engine/src/docs/client_guide/read-consistency.md +++ b/d-engine/src/docs/client_guide/read-consistency.md @@ -73,7 +73,7 @@ let user = client.get_lease(b"user:123").await?; **API**: `client.get_eventual(key)` -**Guarantee**: Returns valid committed state, may be ~100ms behind leader. +**Guarantee**: Returns valid committed state, may be slightly behind the latest write. **Performance**: ~0.1ms (20x faster than LinearizableRead) @@ -83,7 +83,7 @@ let user = client.get_lease(b"user:123").await?; - Analytics queries - Monitoring data -**Bonus**: Can read from **any node** (leader/follower), not just leader. +> **Any node**: EventualConsistency is served by the local ReadActor on whichever node the client connects to — leader or follower. No lease is required. Follower reads may return slightly stale data (expected for this policy). ```rust,ignore let stats = client.get_eventual(b"dashboard_stats").await?; @@ -132,6 +132,8 @@ allow_client_override = true # Allow client to override (default: true _Measured on 3-node cluster, AWS same-region_ +**Why 0 RTT for Eventual/LeaseRead (v0.2.5+)**: These policies are served by a dedicated ReadActor that reads directly from the state machine — bypassing the Raft command channel entirely. The leader's read lease is validated atomically; if it expires or the node steps down, ReadActor falls back to the Raft path automatically. + **Important**: All policies return **correct** committed data. Difference is whether you get the **latest** or **slightly older** committed state. --- diff --git a/d-engine/src/docs/examples/ha-deployment-load-balancing.md b/d-engine/src/docs/examples/ha-deployment-load-balancing.md index 088c154a..12bb8d9b 100644 --- a/d-engine/src/docs/examples/ha-deployment-load-balancing.md +++ b/d-engine/src/docs/examples/ha-deployment-load-balancing.md @@ -159,7 +159,7 @@ Each node exposes two health endpoints: **Implementation** (from example code): ```rust,ignore -async fn health_primary(State(engine): State>) -> StatusCode { +async fn health_primary(State(engine): State>) -> StatusCode { if engine.is_leader() { StatusCode::OK } else { diff --git a/d-engine/src/docs/integration-modes.md b/d-engine/src/docs/integration-modes.md index 9e29e5d8..e35255c6 100644 --- a/d-engine/src/docs/integration-modes.md +++ b/d-engine/src/docs/integration-modes.md @@ -63,12 +63,12 @@ d-engine runs **inside your Rust application process**: ### Quick Start ```rust,ignore -use d_engine::EmbeddedEngine; +use d_engine::prelude::*; #[tokio::main] async fn main() -> Result<(), Box> { // Start with config file - let engine = EmbeddedEngine::start_with("d-engine.toml").await?; + let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // Wait for leader election engine.wait_ready(Duration::from_secs(5)).await?; diff --git a/d-engine/src/docs/overview.md b/d-engine/src/docs/overview.md index 1c4c1b9f..d974c60c 100644 --- a/d-engine/src/docs/overview.md +++ b/d-engine/src/docs/overview.md @@ -21,7 +21,7 @@ use std::time::Duration; #[tokio::main] async fn main() -> Result<(), Box> { - let engine = EmbeddedEngine::start("./data").await?; + let engine = DefaultEmbeddedEngine::start("./data").await?; engine.wait_ready(Duration::from_secs(5)).await?; let client = engine.client(); diff --git a/d-engine/src/docs/performance/throughput-optimization-guide.md b/d-engine/src/docs/performance/throughput-optimization-guide.md index 5234d212..6cc9f83c 100644 --- a/d-engine/src/docs/performance/throughput-optimization-guide.md +++ b/d-engine/src/docs/performance/throughput-optimization-guide.md @@ -56,14 +56,33 @@ The `max_batch_size` controls how many commands are drained per Raft loop iterat max_batch_size = 200 # default, suitable for most deployments ``` -| Deployment | Recommended | Rationale | -|---|---|---| -| Embedded 3-node | **200** | Matches typical concurrent client counts; higher values yield diminishing returns | -| Standalone 3-node | **200** | Network RTT dominates; batch size has limited impact | -| High concurrency (500+ clients) | **500** | Increase if HC Write throughput plateaus | +| Deployment | Recommended | Rationale | +| ------------------------------- | ----------- | --------------------------------------------------------------------------------- | +| Embedded 3-node | **200** | Matches typical concurrent client counts; higher values yield diminishing returns | +| Standalone 3-node | **200** | Network RTT dominates; batch size has limited impact | +| High concurrency (500+ clients) | **500** | Increase if HC Write throughput plateaus | > **Rule of thumb**: For embedded mode, optimal `max_batch_size ≈ concurrent_client_count`. For standalone, keep at 200 unless profiling shows cmd_rx consistently saturated. +## Read Fast Path Tuning (v0.2.5+) + +`Eventual` and `LeaseRead` bypass `cmd_rx` entirely — they never touch `max_batch_size` or `time_threshold_ms`. Two dedicated knobs: + +```toml +[raft.read_actor] +channel_capacity = 512 # default +max_drain = 100 # default +``` + +| Parameter | What it controls | Tune up when… | +|---|---|---| +| `channel_capacity` | mpsc buffer depth between client and ReadActor | read latency spikes under high concurrent Eventual/LeaseRead (channel full → backpressure) | +| `max_drain` | reads batched per ReadActor wakeup (mirrors `max_batch_size`) | read throughput plateaus but CPU is not saturated | + +Same tradeoff as write batching: higher `max_drain` → better throughput, higher tail latency. Start with defaults; only tune if profiling shows a bottleneck here. + +--- + ## Configuration Tuning ### Control Plane (`[network.control]`) diff --git a/d-engine/src/docs/quick-start-5min.md b/d-engine/src/docs/quick-start-5min.md index 501ef50c..bdd8f261 100644 --- a/d-engine/src/docs/quick-start-5min.md +++ b/d-engine/src/docs/quick-start-5min.md @@ -61,7 +61,7 @@ async fn main() -> Result<(), Box> { println!("Starting d-engine...\n"); // Start embedded engine with config file - let engine = EmbeddedEngine::start_with("d-engine.toml").await?; + let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // Wait for leader election (single-node: instant) let leader = engine.wait_ready(Duration::from_secs(5)).await?; @@ -116,7 +116,7 @@ Done! ### Behind the Scenes ```rust,ignore -EmbeddedEngine::start_with("d-engine.toml").await? +DefaultEmbeddedEngine::start_with("d-engine.toml").await? ``` This one line: @@ -141,7 +141,7 @@ Waits for leader election (combines node initialization + leader election): let client = engine.client(); ``` -Returns `Arc` for zero-overhead KV operations. +Returns `Arc` for zero-overhead KV operations. --- @@ -174,7 +174,8 @@ No gRPC overhead - direct function calls to embedded Raft core. - `put(key, value)` - Write with Raft consensus - `get_linearizable(key)` - Strong consistency read -- `get_eventual(key)` - Fast local read (may be stale) +- `get_lease(key)` - Fast read, no Raft round-trip (recommended default) +- `get_eventual(key)` - Fastest local read (may be slightly stale) - `delete(key)` - Delete key See docs for TTL, multi-key operations, and advanced consistency control. @@ -184,7 +185,7 @@ See docs for TTL, multi-key operations, and advanced consistency control. ### 3. Automatic Lifecycle Management ```rust,ignore -let engine = EmbeddedEngine::start_with("d-engine.toml").await?; +let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // ↑ Internally spawns node.run() in background engine.stop().await?; @@ -197,17 +198,17 @@ No manual `tokio::spawn()`, no leaked tasks. ## API Reference -### EmbeddedEngine +### DefaultEmbeddedEngine ```rust,ignore // Explicit data directory (highest priority) -EmbeddedEngine::start(data_dir: impl AsRef) -> Result +DefaultEmbeddedEngine::start(data_dir: impl AsRef) -> Result // Use explicit config file -EmbeddedEngine::start_with(config_path: &str) -> Result +DefaultEmbeddedEngine::start_with(config_path: &str) -> Result -// Advanced (custom storage) -EmbeddedEngine::start_custom( +// Advanced (custom storage + state machine — define your own TypeConfig) +EmbeddedEngine::::start_custom( storage: Arc, state_machine: Arc, config_path: Option<&str> @@ -217,7 +218,7 @@ EmbeddedEngine::start_custom( engine.wait_ready(timeout: Duration) -> Result // Get KV client -engine.client() -> Arc +engine.client() -> Arc // Subscribe to leader changes (optional, for monitoring) engine.leader_change_notifier() -> watch::Receiver> @@ -226,14 +227,20 @@ engine.leader_change_notifier() -> watch::Receiver> engine.stop().await -> Result<()> ``` -### EmbeddedClient +### DefaultEmbeddedClient ```rust,ignore // Write (replicates to majority) client.put(key: Vec, value: Vec) -> Result -// Read (local, no network) -client.get(key: Vec) -> Result>> +// Read — linearizable (always latest, 1 Raft round-trip) +client.get_linearizable(key: impl Into>) -> Result> + +// Read — lease (no Raft round-trip, recommended default) +client.get_lease(key: impl Into>) -> Result> + +// Read — eventual (fastest, served directly from state machine) +client.get_eventual(key: impl Into>) -> Result> // Delete client.delete(key: Vec) -> Result @@ -249,14 +256,14 @@ See [complete API documentation](https://docs.rs/d-engine/latest/d_engine/prelud ```rust,ignore // Pass the data directory directly — works in debug and release -let engine = EmbeddedEngine::start("./data").await?; +let engine = DefaultEmbeddedEngine::start("./data").await?; ``` ### Pattern 2: Explicit config file ```rust,ignore // Use specific config file -let engine = EmbeddedEngine::start_with("d-engine.toml").await?; +let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; ``` ### Pattern 3: Monitor Leader Changes diff --git a/d-engine/src/docs/quick-start-standalone.md b/d-engine/src/docs/quick-start-standalone.md index f86e6abd..cf4b5770 100644 --- a/d-engine/src/docs/quick-start-standalone.md +++ b/d-engine/src/docs/quick-start-standalone.md @@ -155,7 +155,7 @@ tail -f logs/2/demo.log # Watch new leader election | **Serialization** | None | Protobuf | | **Language** | Rust only | Any (Go, Python, Java) | | **Deployment** | 1 binary | 3 server processes | -| **Setup** | `EmbeddedEngine::start_with()` | `make start-cluster` | +| **Setup** | `DefaultEmbeddedEngine::start_with()` | `make start-cluster` | --- diff --git a/d-engine/src/docs/server_guide/consistency-tuning.md b/d-engine/src/docs/server_guide/consistency-tuning.md index f7c88bb1..35dbfb63 100644 --- a/d-engine/src/docs/server_guide/consistency-tuning.md +++ b/d-engine/src/docs/server_guide/consistency-tuning.md @@ -9,7 +9,7 @@ All read consistency settings are in your server's `config.toml`: ```toml [raft.read_consistency] default_policy = "LeaseRead" -lease_duration_ms = 500 +lease_duration_ms = 250 allow_client_override = true ``` @@ -33,27 +33,18 @@ The consistency policy applied when clients don't specify one explicitly. **Type**: Integer (milliseconds) -**Default**: `500` +**Default**: `250` -**Range**: `100` to `5000` - -How long the leader considers its lease valid after successful heartbeat. +How long the leader considers its lease valid after a successful heartbeat quorum ACK. **Trade-offs**: -- **Higher values** (e.g., 1000ms): - - Better read performance (fewer verification round-trips) - - Larger window for stale reads if clock drift exists - - Recommended for stable cloud environments with NTP - -- **Lower values** (e.g., 200ms): - - Stronger consistency guarantees - - More sensitive to network latency spikes - - Recommended for environments with unreliable clock sync - -**Formula**: `lease_duration_ms ≥ 2 × heartbeat_interval` +- **Higher values**: better LeaseRead performance; larger staleness window on clock drift +- **Lower values**: more conservative; more sensitive to heartbeat jitter -Default heartbeat interval is 100ms, so minimum recommended lease is 200ms. +**Valid range** (both constraints are enforced by `RaftConfig::validate()`): +- Lower bound: `lease_duration_ms ≥ 2 × heartbeat_interval` (with default 100ms heartbeat: ≥ 200ms) +- Upper bound: `lease_duration_ms < election_timeout_min` (default: < 500ms) ### `allow_client_override` @@ -61,12 +52,10 @@ Default heartbeat interval is 100ms, so minimum recommended lease is 200ms. **Default**: `true` -Whether clients can specify per-request consistency policies. +Whether clients can specify per-request consistency policies that override `default_policy`. -**Use cases**: - -- `true`: Allow mixed workloads (critical reads + analytics reads) -- `false`: Enforce uniform consistency across all operations +- `true`: mixed workloads (e.g., most reads use LeaseRead, critical ops use LinearizableRead) +- `false`: uniform consistency enforced — client-specified policies are ignored ## Tuning by Deployment Scenario @@ -77,8 +66,8 @@ Whether clients can specify per-request consistency policies. ```toml [raft.read_consistency] default_policy = "LinearizableRead" -lease_duration_ms = 500 # Unused for LinearizableRead, but keep default -allow_client_override = false # Enforce strict policy +lease_duration_ms = 250 # unused for LinearizableRead +allow_client_override = false # enforce strict policy ``` **Result**: @@ -94,14 +83,13 @@ allow_client_override = false # Enforce strict policy ```toml [raft.read_consistency] default_policy = "EventualConsistency" -lease_duration_ms = 500 # Unused for EventualConsistency -allow_client_override = true # Allow critical reads to override +lease_duration_ms = 250 # unused for EventualConsistency +allow_client_override = true # allow critical reads to override ``` **Result**: -- Reads served immediately from any node -- Maximum throughput (~20x baseline) +- Reads served from local state machine on any node (leader or follower) - Sub-millisecond latency ### Scenario 3: Production Web Service (Recommended) @@ -111,15 +99,14 @@ allow_client_override = true # Allow critical reads to override ```toml [raft.read_consistency] default_policy = "LeaseRead" -lease_duration_ms = 500 # 5x heartbeat interval -allow_client_override = true # Mixed workload support +lease_duration_ms = 250 # default; increase if read latency matters more than freshness +allow_client_override = true # mixed workload support ``` **Result**: - Strong consistency with low latency - Clients can use LinearizableRead for critical operations -- 7x better performance than LinearizableRead ### Scenario 4: Unstable Network Environment @@ -128,49 +115,14 @@ allow_client_override = true # Mixed workload support ```toml [raft.read_consistency] default_policy = "LeaseRead" -lease_duration_ms = 200 # Shorter lease for safety +lease_duration_ms = 200 # shorter lease — faster fallback on partition allow_client_override = true ``` **Result**: -- Faster fallback to LinearizableRead if lease expires -- Better handling of network partitions -- Slightly more verification overhead - -## Monitoring Recommendations - -Track these metrics to validate your configuration: - -### Key Metrics - -```bash -# Lease-related -raft.lease_renewal.success # Should match heartbeat frequency -raft.lease_renewal.failed # Should be near zero - -# Linearizable reads -raft.linearizable_read.success # Total count -raft.leadership_verification.duration_us # Should be <2000 (2ms) - -# Read coalescing effectiveness -raft.linearizable_read.coalesced # Higher = better optimization -raft.pending_reads.queue_depth # Should spike during high concurrency -``` - -### Health Indicators - -**Healthy LeaseRead configuration**: - -- `lease_renewal.success` rate: ~10/sec (100ms heartbeat interval) -- `lease_renewal.failed` < 1% of attempts -- `leadership_verification.duration_us` p99 < 5ms - -**Signs of misconfiguration**: - -- Frequent lease expirations → Increase `lease_duration_ms` -- High `linearizable_read.coalesced` but low throughput → Network bottleneck -- `leadership_verification.duration_us` p99 > 10ms → Check network latency +- Faster fallback to Raft path when lease expires under partition +- Slightly higher fallback frequency under heartbeat jitter ## Clock Synchronization Requirements @@ -206,10 +158,12 @@ Most cloud providers offer time synchronization services: | Configuration | Read Latency (p50) | Throughput | Clock Dependency | | ---------------------------------------------------------- | ------------------ | ---------- | ---------------- | | `default_policy = "LinearizableRead"` | 2.1ms | Baseline | None | -| `default_policy = "LeaseRead"`, `lease_duration_ms = 500` | 0.3ms | ~7x | Low (NTP) | -| `default_policy = "LeaseRead"`, `lease_duration_ms = 1000` | 0.2ms | ~8x | Medium | +| `default_policy = "LeaseRead"`, `lease_duration_ms = 250` | 0.3ms | ~7x | Low (NTP) | +| `default_policy = "LeaseRead"`, `lease_duration_ms = 400` | 0.2ms | ~8x | Medium | | `default_policy = "EventualConsistency"` | 0.1ms | ~20x | None | +_Measured on 3-node cluster, AWS same-region._ + ## Further Reading - Client usage guide: [Read Consistency Guide](crate::docs::client_guide::read_consistency) diff --git a/d-engine/src/docs/server_guide/watch-feature.md b/d-engine/src/docs/server_guide/watch-feature.md index 46107dcc..64a302af 100644 --- a/d-engine/src/docs/server_guide/watch-feature.md +++ b/d-engine/src/docs/server_guide/watch-feature.md @@ -63,10 +63,10 @@ while let Some(event) = stream.next().await { For in-process usage (e.g., `EmbeddedEngine`), use the client's `watch()` method: ```rust,ignore -use d_engine::EmbeddedEngine; +use d_engine::prelude::*; // Initialize engine with config enabling watch -let engine = EmbeddedEngine::start_with("d-engine.toml").await?; +let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // Watch via client (unified API) let mut watcher = engine.client().watch("my_key")?; @@ -386,7 +386,7 @@ Write → Raft Consensus → StateMachine.apply() → broadcast::send() When `EmbeddedEngine` is dropped or crashes: ```rust,ignore -let engine = EmbeddedEngine::start_with(config).await?; +let engine = DefaultEmbeddedEngine::start_with(config).await?; let mut watcher = engine.client().watch(b"key")?; // If engine crashes or is dropped: @@ -399,7 +399,7 @@ let mut watcher = engine.client().watch(b"key")?; ```rust,ignore loop { - let engine = EmbeddedEngine::start_with(config).await?; + let engine = DefaultEmbeddedEngine::start_with(config).await?; let mut watcher = engine.watch(b"key").await?; while let Some(event) = watcher.recv().await { diff --git a/examples/quick-start-embedded/README.md b/examples/quick-start-embedded/README.md index ba16edcf..13eaee5d 100644 --- a/examples/quick-start-embedded/README.md +++ b/examples/quick-start-embedded/README.md @@ -85,7 +85,7 @@ The example demonstrates 3 simple steps: ```rust // 1. Start embedded engine with config file -let engine = EmbeddedEngine::start_with("d-engine.toml").await?; +let engine = DefaultEmbeddedEngine::start_with("d-engine.toml").await?; // 2. Wait for leader election (single-node: instant) let leader = engine.wait_ready(Duration::from_secs(5)).await?; @@ -131,7 +131,7 @@ Copy this example and modify `src/main.rs`: Example: ```rust -async fn my_app(client: &EmbeddedClient) -> Result<(), Box> { +async fn my_app(client: &DefaultEmbeddedClient) -> Result<(), Box> { // Your code here client.put("user:1:name".as_bytes().to_vec(), b"alice".to_vec()).await?; client.put("user:1:email".as_bytes().to_vec(), b"alice@example.com".to_vec()).await?; From 66912492f19c1cc0a5434879abd9dde10091c489 Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Sun, 31 May 2026 23:26:25 +0800 Subject: [PATCH 05/12] =?UTF-8?q?perf=20#392:=20Add=20EmbeddedReadHandle?= =?UTF-8?q?=20=E2=80=94=20zero-channel=20direct-SM=20read=20path=20for=20e?= =?UTF-8?q?mbedded=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split ReadHandle into StandaloneReadHandle (gRPC/ReadActor path) and EmbeddedReadHandle (direct SM call, zero oneshot/channel overhead). EmbeddedClient now uses EmbeddedReadHandle, recovering v0.2.3 latency. Add close_storage() to StateMachine trait for deterministic LOCK release on stop(). --- benches/embedded-bench/config/n1.toml | 4 +- benches/embedded-bench/config/n2.toml | 4 +- benches/embedded-bench/config/n3.toml | 4 +- d-engine-core/src/storage/state_machine.rs | 11 + d-engine-server/src/api/embedded.rs | 29 +- d-engine-server/src/api/embedded_client.rs | 201 +-------- .../src/api/embedded_client_fast_path_test.rs | 396 ----------------- .../embedded_client_test.rs | 196 +++++---- .../src/api/embedded_client_test/mod.rs | 2 + .../src/api/embedded_read_handle.rs | 176 ++++++++ .../src/api/embedded_read_handle_test.rs | 199 +++++++++ .../{ => embedded_test}/embedded_env_test.rs | 0 .../api/{ => embedded_test}/embedded_test.rs | 0 d-engine-server/src/api/embedded_test/mod.rs | 5 + d-engine-server/src/api/mod.rs | 23 +- d-engine-server/src/api/standalone.rs | 4 + ...ad_handle.rs => standalone_read_handle.rs} | 34 +- ...test.rs => standalone_read_handle_test.rs} | 172 +++++++- .../grpc/grpc_raft_service_fast_path_test.rs | 6 +- d-engine-server/src/node/builder.rs | 2 +- d-engine-server/src/node/mod.rs | 2 +- .../adaptors/file/file_state_machine.rs | 6 + .../adaptors/file/file_state_machine_test.rs | 56 ++- .../adaptors/rocksdb/rocksdb_state_machine.rs | 401 +++++++++++------- .../rocksdb/rocksdb_state_machine_test.rs | 53 +++ .../src/test_utils/mock/mock_node_builder.rs | 4 +- .../server_guide/customize-state-machine.md | 16 +- .../sled-cluster/src/sled_state_machine.rs | 6 + 28 files changed, 1095 insertions(+), 917 deletions(-) delete mode 100644 d-engine-server/src/api/embedded_client_fast_path_test.rs rename d-engine-server/src/api/{ => embedded_client_test}/embedded_client_test.rs (73%) create mode 100644 d-engine-server/src/api/embedded_client_test/mod.rs create mode 100644 d-engine-server/src/api/embedded_read_handle.rs create mode 100644 d-engine-server/src/api/embedded_read_handle_test.rs rename d-engine-server/src/api/{ => embedded_test}/embedded_env_test.rs (100%) rename d-engine-server/src/api/{ => embedded_test}/embedded_test.rs (100%) create mode 100644 d-engine-server/src/api/embedded_test/mod.rs rename d-engine-server/src/api/{read_handle.rs => standalone_read_handle.rs} (87%) rename d-engine-server/src/api/{read_handle_test.rs => standalone_read_handle_test.rs} (77%) diff --git a/benches/embedded-bench/config/n1.toml b/benches/embedded-bench/config/n1.toml index 4af9487a..f53c2249 100644 --- a/benches/embedded-bench/config/n1.toml +++ b/benches/embedded-bench/config/n1.toml @@ -10,8 +10,8 @@ db_root_dir = "./data/n1" log_dir = "./logs" [raft.read_actor] -channel_capacity = 10240 -max_drain = 2000 +channel_capacity = 2048 +max_drain = 1024 [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations diff --git a/benches/embedded-bench/config/n2.toml b/benches/embedded-bench/config/n2.toml index 69d05252..0d26472c 100644 --- a/benches/embedded-bench/config/n2.toml +++ b/benches/embedded-bench/config/n2.toml @@ -10,8 +10,8 @@ db_root_dir = "./data/n2" log_dir = "./logs" [raft.read_actor] -channel_capacity = 10240 -max_drain = 2000 +channel_capacity = 2048 +max_drain = 1024 [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations diff --git a/benches/embedded-bench/config/n3.toml b/benches/embedded-bench/config/n3.toml index 0521dc4a..98a48063 100644 --- a/benches/embedded-bench/config/n3.toml +++ b/benches/embedded-bench/config/n3.toml @@ -10,8 +10,8 @@ db_root_dir = "./data/n3" log_dir = "./logs" [raft.read_actor] -channel_capacity = 10240 -max_drain = 2000 +channel_capacity = 2048 +max_drain = 1024 [raft.batching] # Maximum number of commands to accumulate in a single batch during drain operations diff --git a/d-engine-core/src/storage/state_machine.rs b/d-engine-core/src/storage/state_machine.rs index 2a09721a..95eeef46 100644 --- a/d-engine-core/src/storage/state_machine.rs +++ b/d-engine-core/src/storage/state_machine.rs @@ -85,6 +85,17 @@ pub trait StateMachine: Send + Sync + 'static { /// This is typically a sync operation for state management. fn stop(&self) -> Result<(), Error>; + /// Permanently close underlying storage resources (e.g. DB handle, file descriptors). + /// + /// Called by `EmbeddedEngine::stop()` before the Raft loop exits to release + /// OS-level resources (e.g. RocksDB LOCK file) without waiting for all + /// `Arc` clones to drop. + /// + /// Default is a no-op — custom state machine implementations do not need to + /// override this unless they hold exclusive OS resources that must be released + /// before the process exits or a new engine instance is started. + fn close_storage(&self) {} + /// Checks if the state machine is currently running. /// Sync operation as it just checks an atomic boolean. fn is_running(&self) -> bool; diff --git a/d-engine-server/src/api/embedded.rs b/d-engine-server/src/api/embedded.rs index b0785fb3..f04c4775 100644 --- a/d-engine-server/src/api/embedded.rs +++ b/d-engine-server/src/api/embedded.rs @@ -123,6 +123,7 @@ //! For auto-forwarding with gRPC overhead, use standalone mode with `GrpcClient`. use super::embedded_client::EmbeddedClient; +use super::embedded_read_handle::EmbeddedReadHandle; use crate::Result; #[cfg(feature = "rocksdb")] use crate::RocksDBStateMachine; @@ -145,6 +146,9 @@ use tracing::error; use tracing::info; struct Inner { + /// SM reference for shutdown: close_storage() releases OS resources (e.g. RocksDB LOCK) + /// before the Raft loop exits, without waiting for all Arc clones to drop. + sm: Arc, node_handle: Mutex>>>, shutdown_tx: watch::Sender<()>, client: Arc>, @@ -345,6 +349,13 @@ where let (shutdown_tx, shutdown_rx) = watch::channel(()); + // Clone SM before NodeBuilder consumes it — EmbeddedReadHandle holds this + // for the direct-SM fast path. LOCK release is decoupled from Arc counting + // (via close_db()), so holding multiple Arc clones is safe. + let sm_for_client = Arc::clone(&state_machine); + + let sm_for_engine = Arc::clone(&state_machine); + let node = NodeBuilder::init(node_config, shutdown_rx) .storage_engine(storage_engine) .state_machine(state_machine) @@ -354,14 +365,16 @@ where let leader_elected_rx = node.leader_change_notifier(); let membership_rx = node.membership_change_notifier(); + let read_handle = + EmbeddedReadHandle::new(sm_for_client, node.read_lease(), node.cmd_tx.clone()); + let client = { let base = EmbeddedClient::new_internal( node.event_tx.clone(), - node.cmd_tx.clone(), + read_handle, node.node_id, Duration::from_millis(node.node_config.raft.general_raft_timeout_duration_in_ms), - ) - .with_read_handle(node.read_handle.clone()); + ); #[cfg(feature = "watch")] let base = { @@ -390,6 +403,7 @@ where Ok(Self { inner: Arc::new(Inner { + sm: sm_for_engine, node_handle: Mutex::new(Some(node_handle)), shutdown_tx, client, @@ -633,6 +647,11 @@ impl EmbeddedEngine { info!("Stopping embedded d-engine"); + // Close SM storage resources first (releases RocksDB LOCK immediately). + // Must happen before the Raft loop exits so the LOCK is freed before any + // subsequent engine restart on the same data directory. + self.inner.sm.close_storage(); + // Send shutdown signal to Raft node let _ = self.inner.shutdown_tx.send(()); @@ -686,3 +705,7 @@ impl Drop for EmbeddedEngine { } } } + +#[cfg(test)] +#[path = "embedded_test/mod.rs"] +mod tests; diff --git a/d-engine-server/src/api/embedded_client.rs b/d-engine-server/src/api/embedded_client.rs index 5e14f9c5..c9bf3c56 100644 --- a/d-engine-server/src/api/embedded_client.rs +++ b/d-engine-server/src/api/embedded_client.rs @@ -15,7 +15,6 @@ //! client.put(b"key", b"value").await?; //! ``` -use std::marker::PhantomData; #[cfg(feature = "watch")] use std::sync::Arc; use std::time::Duration; @@ -26,8 +25,6 @@ use d_engine_core::RaftEvent; use d_engine_core::RaftOneshot; use d_engine_core::ScanResult; use d_engine_core::TypeConfig; -#[cfg(feature = "watch")] -use d_engine_core::client::ClientApiError; use d_engine_core::client::{ ClientApi, ClientApiResult, ClientResponsePayload, ClientWriteRequest, ErrorCode, WriteOperation, @@ -35,11 +32,13 @@ use d_engine_core::client::{ use d_engine_core::config::ReadConsistencyPolicy; use tokio::sync::mpsc; -use super::read_handle::ReadHandle; -pub(crate) use super::read_handle::{ +use super::embedded_read_handle::EmbeddedReadHandle; +pub(crate) use super::standalone_read_handle::{ channel_closed_error, map_error_response, server_error, timeout_error, }; +#[cfg(feature = "watch")] +use d_engine_core::client::ClientApiError; #[cfg(feature = "watch")] use d_engine_core::watch::WatchRegistry; @@ -51,12 +50,11 @@ use d_engine_core::watch::WatchRegistry; /// For standalone/gRPC mode use `GrpcClient` instead. Both implement `ClientApi`. pub struct EmbeddedClient { event_tx: mpsc::Sender, - read_handle: ReadHandle, + read_handle: EmbeddedReadHandle, client_id: u32, timeout: Duration, #[cfg(feature = "watch")] watch_registry: Option>, - _phantom: PhantomData T>, } impl Clone for EmbeddedClient { @@ -68,39 +66,28 @@ impl Clone for EmbeddedClient { timeout: self.timeout, #[cfg(feature = "watch")] watch_registry: self.watch_registry.clone(), - _phantom: PhantomData, } } } impl EmbeddedClient { - /// Internal constructor (used by EmbeddedEngine) + /// Internal constructor (used by EmbeddedEngine). pub(crate) fn new_internal( event_tx: mpsc::Sender, - cmd_tx: mpsc::Sender, + read_handle: EmbeddedReadHandle, client_id: u32, timeout: Duration, ) -> Self { Self { event_tx, - read_handle: ReadHandle::new(None, cmd_tx), + read_handle, client_id, timeout, #[cfg(feature = "watch")] watch_registry: None, - _phantom: PhantomData, } } - /// Wire the ReadHandle (fast path + cmd_tx) into the client. - pub(crate) fn with_read_handle( - mut self, - rh: ReadHandle, - ) -> Self { - self.read_handle = rh; - self - } - /// Set watch registry for watch operations #[cfg(feature = "watch")] pub(crate) fn with_watch_registry( @@ -743,173 +730,5 @@ impl ClientApi for EmbeddedClient { } #[cfg(test)] -mod error_helper_tests { - use d_engine_core::client::{KvEntry, LeaderHint, ReadResults}; - - use super::super::read_handle::{extract_read_payload, not_leader_error}; - use super::*; - - // ─── not_leader_error ──────────────────────────────────────────────────── - - #[test] - fn test_not_leader_uses_server_retry_after_ms_when_provided() { - let err = not_leader_error( - Some("1".to_string()), - Some("127.0.0.1:5001".to_string()), - Some(500), - ); - match err { - ClientApiError::Network { retry_after_ms, .. } => { - assert_eq!(retry_after_ms, Some(500)); - } - _ => panic!("expected Network error"), - } - } - - #[test] - fn test_not_leader_falls_back_to_100ms_when_server_provides_none() { - let err = not_leader_error(None, None, None); - match err { - ClientApiError::Network { retry_after_ms, .. } => { - assert_eq!(retry_after_ms, Some(100)); - } - _ => panic!("expected Network error"), - } - } - - #[test] - fn test_not_leader_zero_is_not_treated_as_none() { - // Some(0) is an explicit server instruction, not absent — must be preserved - let err = not_leader_error(None, None, Some(0)); - match err { - ClientApiError::Network { retry_after_ms, .. } => { - assert_eq!(retry_after_ms, Some(0)); - } - _ => panic!("expected Network error"), - } - } - - // ─── map_error_response ────────────────────────────────────────────────── - - #[test] - fn test_map_error_response_not_leader_forwards_retry_after_ms() { - let err = map_error_response( - ErrorCode::NotLeader, - Some(LeaderHint { - leader_id: 2, - address: "10.0.0.2:5002".into(), - }), - Some(250), - ); - match err { - ClientApiError::Network { - code, - retry_after_ms, - leader_hint, - .. - } => { - assert_eq!(code, ErrorCode::NotLeader); - assert_eq!(retry_after_ms, Some(250)); - let h = leader_hint.unwrap(); - assert_eq!(h.leader_id, 2); - } - _ => panic!("expected Network error"), - } - } - - #[test] - fn test_map_error_response_not_leader_falls_back_to_100ms_when_none() { - let err = map_error_response(ErrorCode::NotLeader, None, None); - match err { - ClientApiError::Network { retry_after_ms, .. } => { - assert_eq!(retry_after_ms, Some(100)); - } - _ => panic!("expected Network error"), - } - } - - // ─── extract_read_payload ──────────────────────────────────────────────── - // - // These tests call `extract_read_payload` directly — the actual function - // used by both `get_with_consistency` and `get_multi_with_consistency`. - // This ensures the error behaviour is tested at the implementation site, - // not via a copy of the match logic that could silently drift. - - #[test] - fn test_extract_read_payload_returns_read_results_on_success() { - // Happy path: a well-formed Read payload must be unwrapped without error. - let entries = vec![KvEntry { - key: Bytes::from("k"), - value: Bytes::from("v"), - }]; - let payload = Some(ClientResponsePayload::Read(ReadResults { - entries: entries.clone(), - })); - - let result = extract_read_payload(payload).unwrap(); - assert_eq!(result.entries.len(), 1); - assert_eq!(result.entries[0].key, Bytes::from("k")); - assert_eq!(result.entries[0].value, Bytes::from("v")); - } - - #[test] - fn test_extract_read_payload_rejects_write_result_payload() { - // A WriteResult inside a read response is a server protocol violation. - // It must surface as InvalidResponse, not silently become "key not found". - let payload = Some(ClientResponsePayload::Write( - d_engine_core::client::WriteResult { succeeded: true }, - )); - - let err = extract_read_payload(payload).unwrap_err(); - assert_eq!(err.code(), ErrorCode::InvalidResponse); - assert!( - err.message().contains("WriteResult"), - "error message should identify the unexpected variant; got: {}", - err.message() - ); - } - - #[test] - fn test_extract_read_payload_rejects_none_payload() { - // A Success response with no payload is a protocol violation. - // It must surface as InvalidResponse, not silently become "key not found". - let err = extract_read_payload(None).unwrap_err(); - assert_eq!(err.code(), ErrorCode::InvalidResponse); - assert!( - err.message().contains("None"), - "error message should identify missing payload; got: {}", - err.message() - ); - } - - #[test] - fn test_extract_read_payload_empty_entries_is_valid() { - // An empty ReadResults is a legitimate response (no keys matched). - // It must not be treated as an error. - let payload = Some(ClientResponsePayload::Read(ReadResults { entries: vec![] })); - - let result = extract_read_payload(payload).unwrap(); - assert!(result.entries.is_empty()); - } - - #[test] - fn test_extract_read_payload_multiple_entries_are_preserved() { - // All entries in the ReadResults must be passed through unchanged. - let payload = Some(ClientResponsePayload::Read(ReadResults { - entries: vec![ - KvEntry { - key: Bytes::from("k1"), - value: Bytes::from("v1"), - }, - KvEntry { - key: Bytes::from("k2"), - value: Bytes::from("v2"), - }, - ], - })); - - let result = extract_read_payload(payload).unwrap(); - assert_eq!(result.entries.len(), 2); - assert_eq!(result.entries[1].key, Bytes::from("k2")); - } -} +#[path = "embedded_client_test/embedded_client_test.rs"] +mod tests; diff --git a/d-engine-server/src/api/embedded_client_fast_path_test.rs b/d-engine-server/src/api/embedded_client_fast_path_test.rs deleted file mode 100644 index f95b0981..00000000 --- a/d-engine-server/src/api/embedded_client_fast_path_test.rs +++ /dev/null @@ -1,396 +0,0 @@ -/// Fast-path tests for EmbeddedClient via ReadActor. -/// -/// These tests verify that EventualConsistency and LeaseRead requests are -/// routed to the ReadActor (bypassing cmd_tx), and fall back to cmd_tx when -/// the ReadActor returns LeaseInvalid, SmStopped, or its channel is closed. -/// -/// Proof technique: cmd_rx is dropped so any fallback to cmd_tx returns a -/// channel-closed error — success proves the fast path was taken; error proves -/// the fallback triggered. -#[cfg(test)] -mod fast_path_tests { - use std::sync::Arc; - use std::time::Duration; - - use crate::read_actor::run_read_actor; - use bytes::Bytes; - use d_engine_core::MockTypeConfig; - use d_engine_core::config::ReadConsistencyPolicy; - use d_engine_core::{MockStateMachine, ReadLease, now_ms}; - use tokio::sync::mpsc; - use tokio::task::JoinHandle; - - use super::super::embedded_client::EmbeddedClient; - use super::super::read_handle::ReadHandle; - - // ── Helpers ─────────────────────────────────────────────────────────────── - - fn make_event_tx() -> mpsc::Sender { - let (tx, _rx) = mpsc::channel(1); - tx - } - - /// Builds a client wired to a live ReadActor. - /// - /// `drop_cmd_rx=true` closes the receiving end — any fallback to cmd_tx - /// will fail with a channel-closed error, proving the fast path was NOT taken. - async fn client_with_read_actor( - sm: MockStateMachine, - lease: Arc, - drop_cmd_rx: bool, - ) -> (EmbeddedClient, JoinHandle<()>) { - let (read_tx, read_rx) = mpsc::channel(8); - let (cmd_tx, cmd_rx) = mpsc::channel(1); - if drop_cmd_rx { - drop(cmd_rx); - } - - let ra_handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); - let client = EmbeddedClient::new_internal( - make_event_tx(), - cmd_tx.clone(), - 1, - Duration::from_millis(100), - ) - .with_read_handle(ReadHandle::new(Some(read_tx), cmd_tx)); - (client, ra_handle) - } - - fn valid_lease() -> Arc { - let lease = Arc::new(ReadLease::new()); - lease.renew(1, now_ms() + 60_000); - lease - } - - fn revoked_lease() -> Arc { - let lease = Arc::new(ReadLease::new()); - lease.revoke(); - lease - } - - fn expired_lease() -> Arc { - let lease = Arc::new(ReadLease::new()); - lease.renew(1, now_ms().saturating_sub(1)); - lease - } - - fn sm_running_with_value(value: Bytes) -> MockStateMachine { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - sm.expect_get_multi() - .returning(move |keys| Ok(keys.iter().map(|_| Some(value.clone())).collect())); - sm - } - - fn sm_running_missing_key() -> MockStateMachine { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - sm.expect_get_multi().returning(|keys| Ok(keys.iter().map(|_| None).collect())); - sm - } - - fn sm_stopped() -> MockStateMachine { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| false); - sm - } - - // ── LeaseRead fast path ─────────────────────────────────────────────────── - - /// LeaseRead with valid lease and running SM → ReadActor returns value. - /// cmd_tx is closed: success proves the fast path was taken. - #[tokio::test] - async fn test_get_lease_bypasses_cmd_tx_when_lease_valid() { - let sm = sm_running_with_value(Bytes::from("fast_value")); - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - - let result = client.get_with_consistency(b"key1", ReadConsistencyPolicy::LeaseRead).await; - assert_eq!(result.unwrap(), Some(Bytes::from("fast_value"))); - - drop(client); // drop read_tx so ReadActor exits - handle.await.unwrap(); - } - - /// LeaseRead with valid lease and missing key → ReadActor returns None. - #[tokio::test] - async fn test_get_lease_returns_none_for_missing_key() { - let sm = sm_running_missing_key(); - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - - let result = - client.get_with_consistency(b"missing", ReadConsistencyPolicy::LeaseRead).await; - assert_eq!(result.unwrap(), None); - - drop(client); - handle.await.unwrap(); - } - - /// LeaseRead with revoked lease → ReadActor returns LeaseInvalid → fallback to cmd_tx. - /// cmd_tx closed → error proves fallback was triggered. - #[tokio::test] - async fn test_get_lease_fallback_when_lease_revoked() { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - // get_multi() must not be called — ReadActor short-circuits on LeaseInvalid - sm.expect_get_multi().never(); - - let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; - let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; - assert!(result.is_err(), "revoked lease must fall back to cmd_tx"); - - drop(client); - handle.await.unwrap(); - } - - /// LeaseRead with expired deadline → ReadActor returns LeaseInvalid → fallback. - #[tokio::test] - async fn test_get_lease_fallback_when_lease_expired() { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - sm.expect_get_multi().never(); - - let (client, handle) = client_with_read_actor(sm, expired_lease(), true).await; - let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; - assert!(result.is_err(), "expired lease must fall back to cmd_tx"); - - drop(client); - handle.await.unwrap(); - } - - /// LeaseRead with SM stopped → ReadActor returns LeaseInvalid → fallback. - #[tokio::test] - async fn test_get_lease_fallback_when_sm_not_running() { - let sm = sm_stopped(); - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; - assert!(result.is_err(), "non-running SM must fall back to cmd_tx"); - - drop(client); - handle.await.unwrap(); - } - - // ── EventualConsistency fast path ───────────────────────────────────────── - - /// EventualConsistency with running SM → fast path via ReadActor. - /// Lease is irrelevant for Eventual reads. - #[tokio::test] - async fn test_get_eventual_bypasses_cmd_tx_when_sm_running() { - let sm = sm_running_with_value(Bytes::from("stale_but_fast")); - // Eventual does not check lease — use a revoked/empty lease to confirm - let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; - - let result = client - .get_with_consistency(b"key1", ReadConsistencyPolicy::EventualConsistency) - .await; - assert_eq!(result.unwrap(), Some(Bytes::from("stale_but_fast"))); - - drop(client); - handle.await.unwrap(); - } - - /// EventualConsistency with SM stopped → ReadActor returns SmStopped → fallback. - #[tokio::test] - async fn test_get_eventual_fallback_when_sm_not_running() { - let sm = sm_stopped(); - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - let result = client - .get_with_consistency(b"k", ReadConsistencyPolicy::EventualConsistency) - .await; - assert!(result.is_err(), "non-running SM must fall back to cmd_tx"); - - drop(client); - handle.await.unwrap(); - } - - // ── No fast path without read_tx ────────────────────────────────────────── - - /// Client without with_read_handle() (read_tx=None) always routes through cmd_tx. - #[tokio::test] - async fn test_no_fast_path_without_read_handle() { - let (cmd_tx, cmd_rx) = mpsc::channel(1); - drop(cmd_rx); - let client: EmbeddedClient = - EmbeddedClient::new_internal(make_event_tx(), cmd_tx, 1, Duration::from_millis(100)); - - let r1 = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; - assert!( - r1.is_err(), - "without read_tx, must go through (closed) cmd_tx" - ); - - let r2 = client - .get_with_consistency(b"k", ReadConsistencyPolicy::EventualConsistency) - .await; - assert!( - r2.is_err(), - "without read_tx, must go through (closed) cmd_tx" - ); - } - - /// LinearizableRead always routes through cmd_tx, never ReadActor. - #[tokio::test] - async fn test_linearizable_always_routes_through_cmd_tx() { - // ReadActor is running with a valid lease and SM — but Linearizable must NOT use it. - let sm = sm_running_with_value(Bytes::from("should_not_see_this")); - // cmd_tx closed → error proves Linearizable hit cmd_tx, not ReadActor - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - - let result = - client.get_with_consistency(b"k", ReadConsistencyPolicy::LinearizableRead).await; - assert!(result.is_err(), "LinearizableRead must always use cmd_tx"); - - drop(client); - handle.await.unwrap(); - } - - /// sm.get() returning Err is surfaced directly as ClientApiError::Business — - /// SmError causes an immediate return without falling back to cmd_tx. - /// - /// Proof: cmd_rx is dropped (cmd_tx closed). A cmd_tx fallback would produce - /// ClientApiError::Network (channel-closed); SmError produces ClientApiError::Business. - /// The error variant is the discriminant. - #[tokio::test] - async fn test_sm_error_returned_directly_without_cmd_tx_fallback() { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - sm.expect_get_multi() - .returning(|_| Err(d_engine_core::Error::Fatal("disk I/O failure".into()))); - - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - let result = client - .get_with_consistency(b"k", ReadConsistencyPolicy::EventualConsistency) - .await; - - assert!( - matches!(result, Err(d_engine_core::ClientApiError::Business { .. })), - "SmError must produce Business error (direct return), not Network (cmd_tx fallback): {:?}", - result - ); - - drop(client); - handle.await.unwrap(); - } - - /// ReadActor channel closed (engine stopping) → fallback to cmd_tx. - #[tokio::test] - async fn test_fast_path_fallback_when_read_actor_channel_closed() { - let sm = sm_running_with_value(Bytes::from("v")); - let (read_tx, read_rx) = mpsc::channel::(1); - let (cmd_tx, cmd_rx) = mpsc::channel(1); - drop(cmd_rx); // cmd_tx closed for fallback verification - - // Drop read_rx immediately → channel is closed from the receiver side. - drop(read_rx); - - let client: EmbeddedClient = EmbeddedClient::new_internal( - make_event_tx(), - cmd_tx.clone(), - 1, - Duration::from_millis(100), - ) - .with_read_handle(ReadHandle::new(Some(read_tx), cmd_tx)); - - // Send to a closed channel → is_ok() == false → falls through to cmd_tx → error - let result = client.get_with_consistency(b"k", ReadConsistencyPolicy::LeaseRead).await; - assert!( - result.is_err(), - "closed read_tx must fall back to (closed) cmd_tx" - ); - - // Suppress unused SM warning - drop(sm); - } - - // ── get_multi_with_consistency fast path ────────────────────────────────── - - fn sm_running_with_multi_values(vals: Vec<(&'static [u8], &'static [u8])>) -> MockStateMachine { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - sm.expect_get_multi().returning(move |keys| { - Ok(keys - .iter() - .map(|k| { - for (key, val) in &vals { - if &k[..] == *key { - return Some(Bytes::from_static(val)); - } - } - None - }) - .collect()) - }); - sm - } - - /// get_multi_with_consistency Eventual with valid SM → ReadActor fast path. - /// cmd_rx dropped: Ok proves fast path was taken. - #[tokio::test] - async fn test_get_multi_eventual_fast_path_returns_values() { - let sm = sm_running_with_multi_values(vec![(b"k1", b"v1"), (b"k2", b"v2")]); - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - - let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; - let result = client - .get_multi_with_consistency(&keys, ReadConsistencyPolicy::EventualConsistency) - .await; - - let values = result.unwrap(); - assert_eq!(values.len(), 2); - assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); - assert_eq!(values[1], Some(Bytes::from_static(b"v2"))); - drop(client); - handle.await.unwrap(); - } - - /// get_multi_with_consistency LeaseRead with valid lease → fast path. - #[tokio::test] - async fn test_get_multi_lease_read_fast_path_returns_values() { - let sm = sm_running_with_multi_values(vec![(b"k1", b"v1")]); - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - - let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"missing")]; - let result = - client.get_multi_with_consistency(&keys, ReadConsistencyPolicy::LeaseRead).await; - - let values = result.unwrap(); - assert_eq!(values.len(), 2); - assert_eq!(values[0], Some(Bytes::from_static(b"v1"))); - assert_eq!(values[1], None); - drop(client); - handle.await.unwrap(); - } - - /// get_multi_with_consistency LeaseRead revoked → fallback to cmd_tx. - #[tokio::test] - async fn test_get_multi_lease_revoked_falls_back_to_cmd_tx() { - let sm = sm_running_with_multi_values(vec![(b"k1", b"v1")]); - let (client, handle) = client_with_read_actor(sm, revoked_lease(), true).await; - - let keys = vec![Bytes::from_static(b"k1")]; - let result = - client.get_multi_with_consistency(&keys, ReadConsistencyPolicy::LeaseRead).await; - - assert!(result.is_err(), "revoked lease must fall back to cmd_tx"); - drop(client); - handle.await.unwrap(); - } - - /// get_multi_with_consistency LinearizableRead always uses cmd_tx. - /// cmd_rx dropped: error proves cmd_tx was used (not ReadActor). - #[tokio::test] - async fn test_get_multi_linearizable_always_routes_through_cmd_tx() { - let mut sm = MockStateMachine::new(); - sm.expect_is_running().returning(|| true); - // no expect_get() — mockall panics if get() is called - let (client, handle) = client_with_read_actor(sm, valid_lease(), true).await; - - let keys = vec![Bytes::from_static(b"k1"), Bytes::from_static(b"k2")]; - let result = client - .get_multi_with_consistency(&keys, ReadConsistencyPolicy::LinearizableRead) - .await; - - assert!(result.is_err(), "LinearizableRead must always use cmd_tx"); - drop(client); - handle.await.unwrap(); - } -} diff --git a/d-engine-server/src/api/embedded_client_test.rs b/d-engine-server/src/api/embedded_client_test/embedded_client_test.rs similarity index 73% rename from d-engine-server/src/api/embedded_client_test.rs rename to d-engine-server/src/api/embedded_client_test/embedded_client_test.rs index 696af75d..6cf68037 100644 --- a/d-engine-server/src/api/embedded_client_test.rs +++ b/d-engine-server/src/api/embedded_client_test/embedded_client_test.rs @@ -1,105 +1,101 @@ -#[cfg(all(test, feature = "rocksdb"))] -mod tests { - use std::collections::HashMap; - - use bytes::Bytes; - - /// Test that get_multi reconstructs results in correct key order. - /// - /// Verifies the critical fix: when server returns only results for - /// existing keys (sparse), we must map by key to preserve positional - /// correspondence with the input key vector. - #[test] - fn test_get_multi_result_reconstruction() { - // Simulate server response scenario: - // Request: [key1, key2, key3] - // Exists: [key1, key3] (key2 is missing) - // Server returns: [key1→value1, key3→value3] - - let requested_keys: Vec<_> = [ - Bytes::from("key1"), - Bytes::from("key2"), - Bytes::from("key3"), - ] - .to_vec(); - let server_results: Vec<_> = vec![ - (Bytes::from("key1"), Bytes::from("value1")), - (Bytes::from("key3"), Bytes::from("value3")), - ]; - - // Simulate the fixed reconstruction logic - let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); - let reconstructed: Vec> = - requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); - - // Expected: [Some(value1), None, Some(value3)] - assert_eq!( - reconstructed.len(), - 3, - "Result count must match request count" - ); - assert_eq!( - reconstructed[0], - Some(Bytes::from("value1")), - "Position 0 is key1" - ); - assert_eq!(reconstructed[1], None, "Position 1 is key2 (missing)"); - assert_eq!( - reconstructed[2], - Some(Bytes::from("value3")), - "Position 2 is key3" - ); - } +use std::collections::HashMap; + +use bytes::Bytes; + +/// Test that get_multi reconstructs results in correct key order. +/// +/// Verifies the critical fix: when server returns only results for +/// existing keys (sparse), we must map by key to preserve positional +/// correspondence with the input key vector. +#[test] +fn test_get_multi_result_reconstruction() { + // Simulate server response scenario: + // Request: [key1, key2, key3] + // Exists: [key1, key3] (key2 is missing) + // Server returns: [key1→value1, key3→value3] + + let requested_keys: Vec<_> = [ + Bytes::from("key1"), + Bytes::from("key2"), + Bytes::from("key3"), + ] + .to_vec(); + let server_results: Vec<_> = vec![ + (Bytes::from("key1"), Bytes::from("value1")), + (Bytes::from("key3"), Bytes::from("value3")), + ]; + + // Simulate the fixed reconstruction logic + let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); + let reconstructed: Vec> = + requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); + + // Expected: [Some(value1), None, Some(value3)] + assert_eq!( + reconstructed.len(), + 3, + "Result count must match request count" + ); + assert_eq!( + reconstructed[0], + Some(Bytes::from("value1")), + "Position 0 is key1" + ); + assert_eq!(reconstructed[1], None, "Position 1 is key2 (missing)"); + assert_eq!( + reconstructed[2], + Some(Bytes::from("value3")), + "Position 2 is key3" + ); +} - /// Test edge case: all requested keys exist. - #[test] - fn test_get_multi_all_keys_exist() { - let requested_keys: Vec<_> = [Bytes::from("a"), Bytes::from("b")].to_vec(); - let server_results: Vec<_> = vec![ - (Bytes::from("a"), Bytes::from("1")), - (Bytes::from("b"), Bytes::from("2")), - ]; - - let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); - let reconstructed: Vec> = - requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); - - assert_eq!(reconstructed.len(), 2); - assert_eq!(reconstructed[0], Some(Bytes::from("1"))); - assert_eq!(reconstructed[1], Some(Bytes::from("2"))); - } +/// Test edge case: all requested keys exist. +#[test] +fn test_get_multi_all_keys_exist() { + let requested_keys: Vec<_> = [Bytes::from("a"), Bytes::from("b")].to_vec(); + let server_results: Vec<_> = vec![ + (Bytes::from("a"), Bytes::from("1")), + (Bytes::from("b"), Bytes::from("2")), + ]; + + let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); + let reconstructed: Vec> = + requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); + + assert_eq!(reconstructed.len(), 2); + assert_eq!(reconstructed[0], Some(Bytes::from("1"))); + assert_eq!(reconstructed[1], Some(Bytes::from("2"))); +} - /// Test edge case: no requested keys exist. - #[test] - fn test_get_multi_no_keys_exist() { - let requested_keys: Vec<_> = - [Bytes::from("x"), Bytes::from("y"), Bytes::from("z")].to_vec(); - let server_results: Vec<(Bytes, Bytes)> = Vec::new(); +/// Test edge case: no requested keys exist. +#[test] +fn test_get_multi_no_keys_exist() { + let requested_keys: Vec<_> = [Bytes::from("x"), Bytes::from("y"), Bytes::from("z")].to_vec(); + let server_results: Vec<(Bytes, Bytes)> = Vec::new(); - let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); - let reconstructed: Vec> = - requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); + let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); + let reconstructed: Vec> = + requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); - assert_eq!(reconstructed.len(), 3); - assert!(reconstructed.iter().all(|r| r.is_none())); - } + assert_eq!(reconstructed.len(), 3); + assert!(reconstructed.iter().all(|r| r.is_none())); +} - /// Test that empty byte values are preserved correctly. - #[test] - fn test_get_multi_preserves_empty_values() { - let requested_keys: Vec<_> = [Bytes::from("empty"), Bytes::from("nonempty")].to_vec(); - let server_results: Vec<_> = vec![ - (Bytes::from("empty"), Bytes::new()), - (Bytes::from("nonempty"), Bytes::from("v")), - ]; - - let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); - let reconstructed: Vec> = - requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); - - assert_eq!(reconstructed[0], Some(Bytes::new())); - assert_eq!(reconstructed[1], Some(Bytes::from("v"))); - } +/// Test that empty byte values are preserved correctly. +#[test] +fn test_get_multi_preserves_empty_values() { + let requested_keys: Vec<_> = [Bytes::from("empty"), Bytes::from("nonempty")].to_vec(); + let server_results: Vec<_> = vec![ + (Bytes::from("empty"), Bytes::new()), + (Bytes::from("nonempty"), Bytes::from("v")), + ]; + + let results_by_key: HashMap<_, _> = server_results.into_iter().collect(); + let reconstructed: Vec> = + requested_keys.iter().map(|k| results_by_key.get(k).cloned()).collect(); + + assert_eq!(reconstructed[0], Some(Bytes::new())); + assert_eq!(reconstructed[1], Some(Bytes::from("v"))); } // ============================================================================= @@ -319,7 +315,7 @@ max_batch_size = 1 engine.stop().await.expect("Failed to stop engine"); } - } + } // cas_operations mod scan_prefix_operations { use super::*; @@ -382,5 +378,5 @@ max_batch_size = 1 engine.stop().await.expect("Failed to stop engine"); } - } -} + } // scan_prefix_operations +} // integration_tests diff --git a/d-engine-server/src/api/embedded_client_test/mod.rs b/d-engine-server/src/api/embedded_client_test/mod.rs new file mode 100644 index 00000000..6548344e --- /dev/null +++ b/d-engine-server/src/api/embedded_client_test/mod.rs @@ -0,0 +1,2 @@ +#[cfg(test)] +mod embedded_client_test; diff --git a/d-engine-server/src/api/embedded_read_handle.rs b/d-engine-server/src/api/embedded_read_handle.rs new file mode 100644 index 00000000..b7c9cfe3 --- /dev/null +++ b/d-engine-server/src/api/embedded_read_handle.rs @@ -0,0 +1,176 @@ +//! EmbeddedReadHandle — zero-channel read path for embedded mode. +//! +//! Replaces `ReadHandle` (which routes through the ReadActor channel) for +//! `EmbeddedClient`. Eventual and LeaseRead call `SM::get_multi()` directly — +//! no oneshot allocation, no task context switch, no channel round-trip. +//! +//! # Routing +//! +//! ```text +//! Eventual / LeaseRead (valid) → sm.get_multi() (direct, zero channel) +//! Eventual / LeaseRead (error) → cmd_tx fallback (SM stopped or error) +//! LeaseRead (invalid lease) → cmd_tx fallback +//! LinearizableRead → cmd_tx always (Raft readIndex) +//! ``` +//! +//! # Shutdown safety +//! +//! After `EmbeddedEngine::stop()` calls `sm.close_db()`, `sm.get_multi()` returns +//! `NotServing`. The handle falls through to `cmd_tx` which is also closed at +//! that point, so callers receive a `channel_closed_error` — the same behaviour +//! as any other shutdown scenario. + +use std::marker::PhantomData; +use std::time::Duration; + +use bytes::Bytes; +use d_engine_core::MaybeCloneOneshot; +use d_engine_core::RaftOneshot; +use d_engine_core::ReadLease; +use d_engine_core::StateMachine; +use d_engine_core::TypeConfig; +use d_engine_core::client::{ClientApiResult, ClientReadRequest, ErrorCode}; +use d_engine_core::config::ReadConsistencyPolicy; +use d_engine_core::now_ms; +use std::sync::Arc; +use tokio::sync::mpsc; + +use super::standalone_read_handle::{ + channel_closed_error, extract_read_payload, map_error_response, server_error, timeout_error, +}; + +// ── EmbeddedReadHandle ──────────────────────────────────────────────────────── + +/// Direct-SM read handle for embedded mode. +/// +/// Cloneable — `EmbeddedClient` and its clones each hold their own instance. +/// Cloning is cheap: all fields are `Arc` or `mpsc::Sender` (reference-counted). +pub(crate) struct EmbeddedReadHandle { + sm: Arc, + lease: Arc, + pub(crate) cmd_tx: mpsc::Sender, + _phantom: PhantomData T>, +} + +impl Clone for EmbeddedReadHandle { + fn clone(&self) -> Self { + Self { + sm: Arc::clone(&self.sm), + lease: Arc::clone(&self.lease), + cmd_tx: self.cmd_tx.clone(), + _phantom: PhantomData, + } + } +} + +impl EmbeddedReadHandle { + pub(crate) fn new( + sm: Arc, + lease: Arc, + cmd_tx: mpsc::Sender, + ) -> Self { + Self { + sm, + lease, + cmd_tx, + _phantom: PhantomData, + } + } + + /// Single-key read. Convenience wrapper around [`Self::get_batch`]. + pub async fn get( + &self, + key: &[u8], + consistency: ReadConsistencyPolicy, + client_id: u32, + timeout: Duration, + ) -> ClientApiResult> { + let key_bytes = Bytes::copy_from_slice(key); + let mut results = self.get_batch(&[key_bytes], consistency, client_id, timeout).await?; + Ok(results.pop().flatten()) + } + + /// Multi-key read with consistency routing. + /// + /// For `Eventual` and `LeaseRead` (when the lease is valid), all keys are + /// served from a single `SM::get_multi()` snapshot — no Raft round-trip. + /// On any SM error, or when the lease is invalid, the request falls through + /// to `cmd_tx` (Raft readIndex protocol). + pub async fn get_batch( + &self, + keys: &[Bytes], + consistency: ReadConsistencyPolicy, + client_id: u32, + timeout: Duration, + ) -> ClientApiResult>> { + match consistency { + ReadConsistencyPolicy::EventualConsistency => { + if let Ok(values) = self.sm.get_multi(keys) { + return Ok(values); + } + // SM stopped or hard error → fall through to cmd_tx + } + ReadConsistencyPolicy::LeaseRead => { + if self.lease.is_valid(now_ms()) + && let Ok(values) = self.sm.get_multi(keys) + { + return Ok(values); + + // SM stopped or hard error → fall through + } + // invalid lease → fall through to cmd_tx + } + ReadConsistencyPolicy::LinearizableRead => { + // always cmd_tx — Raft readIndex protocol + } + } + + self.cmd_tx_path(keys, consistency, client_id, timeout).await + } + + // ── cmd_tx fallback ─────────────────────────────────────────────────────── + + async fn cmd_tx_path( + &self, + keys: &[Bytes], + consistency: ReadConsistencyPolicy, + client_id: u32, + timeout: Duration, + ) -> ClientApiResult>> { + let request = ClientReadRequest { + client_id, + keys: keys.to_vec(), + consistency_policy: Some(consistency), + }; + let (resp_tx, resp_rx) = MaybeCloneOneshot::new(); + self.cmd_tx + .send(d_engine_core::ClientCmd::Read(request, resp_tx)) + .await + .map_err(|_| channel_closed_error())?; + + let result = tokio::time::timeout(timeout, resp_rx) + .await + .map_err(|_| timeout_error(timeout))? + .map_err(|_| channel_closed_error())?; + + let response = + result.map_err(|status| server_error(format!("RPC error: {}", status.message())))?; + + if response.error != ErrorCode::Success { + return Err(map_error_response( + response.error, + response.leader_hint, + response.retry_after_ms, + )); + } + + let read_results = extract_read_payload(response.result)?; + let entry_map: std::collections::HashMap = + read_results.entries.into_iter().map(|e| (e.key, e.value)).collect(); + Ok(keys.iter().map(|k| entry_map.get(k).cloned()).collect()) + } +} + +#[cfg(test)] +#[path = "embedded_read_handle_test.rs"] +mod tests; diff --git a/d-engine-server/src/api/embedded_read_handle_test.rs b/d-engine-server/src/api/embedded_read_handle_test.rs new file mode 100644 index 00000000..c8ec8461 --- /dev/null +++ b/d-engine-server/src/api/embedded_read_handle_test.rs @@ -0,0 +1,199 @@ +/// Tests for EmbeddedReadHandle — the zero-channel direct-SM read path. +/// +/// Proof technique (same as embedded_client_fast_path_test): +/// cmd_rx is dropped so any fallback to cmd_tx returns a channel-closed error. +/// Success proves the SM was called directly; error proves fallback was triggered. +#[cfg(test)] +mod embedded_read_handle_tests { + use std::sync::Arc; + use std::time::Duration; + + use bytes::Bytes; + use d_engine_core::config::ReadConsistencyPolicy; + use d_engine_core::{MockStateMachine, MockTypeConfig, ReadLease, now_ms}; + use tokio::sync::mpsc; + + use super::super::EmbeddedReadHandle; + + // ── Helpers ─────────────────────────────────────────────────────────────── + + fn valid_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.renew(1, now_ms() + 60_000); + lease + } + + fn invalid_lease() -> Arc { + let lease = Arc::new(ReadLease::new()); + lease.revoke(); + lease + } + + fn sm_with_value(value: Bytes) -> MockStateMachine { + let mut sm = MockStateMachine::new(); + sm.expect_get_multi() + .returning(move |keys| Ok(keys.iter().map(|_| Some(value.clone())).collect())); + sm + } + + fn sm_stopped() -> MockStateMachine { + // SM stopped: get_multi returns NotServing error + let mut sm = MockStateMachine::new(); + sm.expect_get_multi().returning(|_| { + Err(d_engine_core::StorageError::NotServing("state machine stopped".into()).into()) + }); + sm + } + + /// Build a handle. `drop_cmd_rx=true` closes the cmd channel so any fallback errors. + fn make_handle( + sm: MockStateMachine, + lease: Arc, + drop_cmd_rx: bool, + ) -> EmbeddedReadHandle { + let (cmd_tx, cmd_rx) = mpsc::channel(1); + if drop_cmd_rx { + drop(cmd_rx); + } + EmbeddedReadHandle::new(Arc::new(sm), lease, cmd_tx) + } + + // ── Eventual fast path ──────────────────────────────────────────────────── + + /// Eventual read goes directly to SM; cmd_rx dropped proves cmd_tx was not used. + #[tokio::test] + async fn test_eventual_read_bypasses_cmd_tx() { + let handle = make_handle(sm_with_value(Bytes::from("v")), valid_lease(), true); + let result = handle + .get( + b"k", + ReadConsistencyPolicy::EventualConsistency, + 1, + Duration::from_millis(100), + ) + .await; + assert_eq!(result.unwrap(), Some(Bytes::from("v"))); + } + + /// Eventual read when SM is stopped falls back to cmd_tx. + /// cmd_rx dropped → fallback returns error (proves fallback was taken, not panic). + #[tokio::test] + async fn test_eventual_sm_stopped_falls_back_to_cmd_tx() { + let handle = make_handle(sm_stopped(), valid_lease(), true); + let result = handle + .get( + b"k", + ReadConsistencyPolicy::EventualConsistency, + 1, + Duration::from_millis(100), + ) + .await; + assert!(result.is_err(), "stopped SM must fall back to cmd_tx"); + } + + // ── LeaseRead fast path ─────────────────────────────────────────────────── + + /// LeaseRead with valid lease goes directly to SM. + #[tokio::test] + async fn test_lease_read_valid_lease_bypasses_cmd_tx() { + let handle = make_handle(sm_with_value(Bytes::from("lease_val")), valid_lease(), true); + let result = handle + .get( + b"k", + ReadConsistencyPolicy::LeaseRead, + 1, + Duration::from_millis(100), + ) + .await; + assert_eq!(result.unwrap(), Some(Bytes::from("lease_val"))); + } + + /// LeaseRead with invalid (revoked) lease falls back to cmd_tx. + #[tokio::test] + async fn test_lease_read_invalid_lease_falls_back_to_cmd_tx() { + let mut sm = MockStateMachine::new(); + // get_multi must NOT be called — lease is invalid + sm.expect_get_multi().never(); + + let handle = make_handle(sm, invalid_lease(), true); + let result = handle + .get( + b"k", + ReadConsistencyPolicy::LeaseRead, + 1, + Duration::from_millis(100), + ) + .await; + assert!(result.is_err(), "invalid lease must fall back to cmd_tx"); + } + + /// LeaseRead with valid lease but stopped SM falls back to cmd_tx. + #[tokio::test] + async fn test_lease_read_sm_stopped_falls_back_to_cmd_tx() { + let handle = make_handle(sm_stopped(), valid_lease(), true); + let result = handle + .get( + b"k", + ReadConsistencyPolicy::LeaseRead, + 1, + Duration::from_millis(100), + ) + .await; + assert!(result.is_err(), "stopped SM must fall back to cmd_tx"); + } + + // ── LinearizableRead ───────────────────────────────────────────────────── + + /// Linearizable always uses cmd_tx. cmd_rx dropped → error proves cmd_tx was used. + #[tokio::test] + async fn test_linearizable_always_uses_cmd_tx() { + let mut sm = MockStateMachine::new(); + sm.expect_get_multi().never(); // must not be called + + let handle = make_handle(sm, valid_lease(), true); + let result = handle + .get( + b"k", + ReadConsistencyPolicy::LinearizableRead, + 1, + Duration::from_millis(100), + ) + .await; + assert!( + result.is_err(), + "linearizable must always go through cmd_tx" + ); + } + + // ── get_batch multi-key ─────────────────────────────────────────────────── + + /// get_batch returns values for all keys in order. + #[tokio::test] + async fn test_get_batch_returns_all_keys_in_order() { + let mut sm = MockStateMachine::new(); + sm.expect_get_multi().returning(|keys| { + Ok(keys + .iter() + .enumerate() + .map(|(i, _)| Some(Bytes::from(format!("v{i}")))) + .collect()) + }); + + let handle = make_handle(sm, valid_lease(), true); + let keys = vec![Bytes::from("k0"), Bytes::from("k1"), Bytes::from("k2")]; + let result = handle + .get_batch( + &keys, + ReadConsistencyPolicy::EventualConsistency, + 1, + Duration::from_millis(100), + ) + .await + .unwrap(); + + assert_eq!(result.len(), 3); + assert_eq!(result[0], Some(Bytes::from("v0"))); + assert_eq!(result[1], Some(Bytes::from("v1"))); + assert_eq!(result[2], Some(Bytes::from("v2"))); + } +} diff --git a/d-engine-server/src/api/embedded_env_test.rs b/d-engine-server/src/api/embedded_test/embedded_env_test.rs similarity index 100% rename from d-engine-server/src/api/embedded_env_test.rs rename to d-engine-server/src/api/embedded_test/embedded_env_test.rs diff --git a/d-engine-server/src/api/embedded_test.rs b/d-engine-server/src/api/embedded_test/embedded_test.rs similarity index 100% rename from d-engine-server/src/api/embedded_test.rs rename to d-engine-server/src/api/embedded_test/embedded_test.rs diff --git a/d-engine-server/src/api/embedded_test/mod.rs b/d-engine-server/src/api/embedded_test/mod.rs new file mode 100644 index 00000000..c9c4cfc0 --- /dev/null +++ b/d-engine-server/src/api/embedded_test/mod.rs @@ -0,0 +1,5 @@ +#[cfg(test)] +mod embedded_test; + +#[cfg(test)] +mod embedded_env_test; diff --git a/d-engine-server/src/api/mod.rs b/d-engine-server/src/api/mod.rs index e4be4ebd..e78e38ab 100644 --- a/d-engine-server/src/api/mod.rs +++ b/d-engine-server/src/api/mod.rs @@ -2,11 +2,12 @@ mod embedded; mod embedded_client; -mod read_handle; +mod embedded_read_handle; mod standalone; +mod standalone_read_handle; -pub use read_handle::ReadHandle; pub use standalone::StandaloneEngine; +pub(crate) use standalone_read_handle::StandaloneReadHandle; /// Embedded engine generic over any `(SE, SM)` pair. pub type EmbeddedEngine = embedded::EmbeddedEngine>; @@ -24,21 +25,3 @@ pub type DefaultEmbeddedEngine = #[cfg(feature = "rocksdb")] pub type DefaultEmbeddedClient = EmbeddedClient; - -#[cfg(test)] -mod embedded_client_test; - -#[cfg(test)] -mod embedded_client_fast_path_test; - -#[cfg(test)] -mod read_handle_test; - -#[cfg(test)] -mod embedded_test; - -#[cfg(test)] -mod embedded_env_test; - -#[cfg(test)] -mod standalone_test; diff --git a/d-engine-server/src/api/standalone.rs b/d-engine-server/src/api/standalone.rs index 59f3ee41..17f64d40 100644 --- a/d-engine-server/src/api/standalone.rs +++ b/d-engine-server/src/api/standalone.rs @@ -187,3 +187,7 @@ impl StandaloneEngine { node.run().await } } + +#[cfg(test)] +#[path = "standalone_test.rs"] +mod tests; diff --git a/d-engine-server/src/api/read_handle.rs b/d-engine-server/src/api/standalone_read_handle.rs similarity index 87% rename from d-engine-server/src/api/read_handle.rs rename to d-engine-server/src/api/standalone_read_handle.rs index 1e4294eb..f8151195 100644 --- a/d-engine-server/src/api/read_handle.rs +++ b/d-engine-server/src/api/standalone_read_handle.rs @@ -1,13 +1,10 @@ -//! ReadHandle — unified read-routing for embedded and standalone modes. +//! StandaloneReadHandle — read routing for standalone (gRPC) mode. //! -//! `ReadHandle` is the single source of truth for read routing: -//! - `EventualConsistency` / `LeaseRead` → ReadActor fast path (no Raft round-trip) -//! - `LinearizableRead` → `cmd_tx` (full Raft readIndex protocol) -//! - `SmError` → returned immediately; no `cmd_tx` fallback -//! - `LeaseInvalid` / `SmStopped` / channel-closed → fall through to `cmd_tx` +//! Routes reads through the ReadActor channel for Eventual/LeaseRead fast path, +//! falling back to `cmd_tx` (Raft readIndex) for LinearizableRead or on error. //! -//! Both `EmbeddedClient` and the gRPC `Node` handler hold a cloned `ReadHandle`, -//! ensuring routing logic is defined in exactly one place. +//! For embedded mode, use `EmbeddedReadHandle` which calls the SM directly +//! without any channel overhead. use std::time::Duration; @@ -113,22 +110,22 @@ pub(crate) fn extract_read_payload( } } -// ── ReadHandle ──────────────────────────────────────────────────────────────── +// ── StandaloneReadHandle ────────────────────────────────────────────────────── -/// Routes read requests to the ReadActor fast path or `cmd_tx`. +/// Routes read requests to the ReadActor fast path or `cmd_tx` for standalone gRPC mode. /// -/// Cloneable — `EmbeddedClient` and `StandaloneServer` each hold their own clone. -/// The underlying channels are shared (mpsc::Sender is cheaply cloneable). +/// Cloneable — the gRPC `Node` handler holds a clone per request. +/// The underlying channels are shared (`mpsc::Sender` is cheaply cloneable). #[derive(Clone)] -pub struct ReadHandle { +pub(crate) struct StandaloneReadHandle { /// ReadActor channel. `None` if node was started without a ReadActor. pub(crate) read_tx: Option>, /// Raft command channel for the cmd_tx fallback path. pub(crate) cmd_tx: mpsc::Sender, } -impl ReadHandle { - /// Create a `ReadHandle` wiring the optional fast-path sender and the Raft cmd channel. +impl StandaloneReadHandle { + /// Create a `StandaloneReadHandle` wiring the fast-path sender and the Raft cmd channel. pub(crate) fn new( read_tx: Option>, cmd_tx: mpsc::Sender, @@ -144,6 +141,9 @@ impl ReadHandle { /// | Eventual/Lease | ReadActor (fast path) | fall through to cmd_tx| /// | Linearizable | cmd_tx always | — | /// | SmError | direct return | no fallback | + /// + /// Note: Not called internally; exposed as public API for callers to use. + #[allow(dead_code)] pub async fn get( &self, key: &[u8], @@ -234,3 +234,7 @@ impl ReadHandle { Ok(keys.iter().map(|k| entry_map.get(k).cloned()).collect()) } } + +#[cfg(test)] +#[path = "standalone_read_handle_test.rs"] +mod tests; diff --git a/d-engine-server/src/api/read_handle_test.rs b/d-engine-server/src/api/standalone_read_handle_test.rs similarity index 77% rename from d-engine-server/src/api/read_handle_test.rs rename to d-engine-server/src/api/standalone_read_handle_test.rs index 7fe1c2f3..04ba3a36 100644 --- a/d-engine-server/src/api/read_handle_test.rs +++ b/d-engine-server/src/api/standalone_read_handle_test.rs @@ -1,6 +1,6 @@ -/// Unit tests for ReadHandle routing logic. +/// Unit tests for StandaloneReadHandle routing logic. /// -/// ReadHandle is the single source of truth for read routing: +/// StandaloneReadHandle is the single source of truth for read routing: /// Eventual/LeaseRead → ReadActor fast path; fallback to cmd_tx on LeaseInvalid/SmStopped /// LinearizableRead → cmd_tx always /// SmError → returned directly, NO cmd_tx fallback @@ -22,7 +22,7 @@ mod read_handle_tests { use tokio::sync::mpsc; use tokio::task::JoinHandle; - use super::super::read_handle::ReadHandle; + use super::super::StandaloneReadHandle; // ── Helpers ─────────────────────────────────────────────────────────────── @@ -72,7 +72,7 @@ mod read_handle_tests { sm } - /// Build a ReadHandle with a live ReadActor. + /// Build a StandaloneReadHandle with a live ReadActor. /// /// `drop_cmd_rx=true` closes the cmd_tx receiver — any cmd_tx fallback /// returns a channel-closed Network error (proof the fast path was NOT taken). @@ -80,14 +80,14 @@ mod read_handle_tests { sm: MockStateMachine, lease: Arc, drop_cmd_rx: bool, - ) -> (ReadHandle, JoinHandle<()>) { + ) -> (StandaloneReadHandle, JoinHandle<()>) { let (read_tx, read_rx) = mpsc::channel(8); let (cmd_tx, cmd_rx) = mpsc::channel(1); if drop_cmd_rx { drop(cmd_rx); } let handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); - let rh = ReadHandle::new(Some(read_tx), cmd_tx); + let rh = StandaloneReadHandle::new(Some(read_tx), cmd_tx); (rh, handle) } @@ -241,12 +241,12 @@ mod read_handle_tests { // ── No read_tx — always cmd_tx ──────────────────────────────────────────── - /// ReadHandle without read_tx (None) always falls through to cmd_tx for any policy. + /// StandaloneReadHandle without read_tx (None) always falls through to cmd_tx for any policy. #[tokio::test] async fn test_no_read_tx_all_policies_use_cmd_tx() { let (cmd_tx, cmd_rx) = mpsc::channel::(1); drop(cmd_rx); - let rh = ReadHandle::new(None, cmd_tx); + let rh = StandaloneReadHandle::new(None, cmd_tx); for policy in [ ReadConsistencyPolicy::EventualConsistency, @@ -273,7 +273,7 @@ mod read_handle_tests { drop(read_rx); // ReadActor is gone drop(cmd_rx); // cmd_tx also closed — proves fallback was attempted - let rh = ReadHandle::new(Some(read_tx), cmd_tx); + let rh = StandaloneReadHandle::new(Some(read_tx), cmd_tx); let result = rh.get(b"k", ReadConsistencyPolicy::EventualConsistency, 1, TIMEOUT).await; assert!( matches!(result, Err(ClientApiError::Network { .. })), @@ -284,19 +284,19 @@ mod read_handle_tests { // ── cmd_tx path: alignment helper ──────────────────────────────────────── - /// Builds a ReadHandle wired to a one-shot mock Raft responder. + /// Builds a StandaloneReadHandle wired to a one-shot mock Raft responder. /// /// The responder returns the given sparse `entries` exactly as /// `read_from_state_machine` would — caller is responsible for verifying /// that `get_batch` re-aligns them to the input key positions. - async fn make_cmd_tx_handle(entries: Vec) -> ReadHandle { + async fn make_cmd_tx_handle(entries: Vec) -> StandaloneReadHandle { let (cmd_tx, mut cmd_rx) = mpsc::channel(1); tokio::spawn(async move { if let Some(ClientCmd::Read(_, resp_tx)) = cmd_rx.recv().await { let _ = resp_tx.send(Ok(ClientResponse::read_results(entries))); } }); - ReadHandle::new(None, cmd_tx) + StandaloneReadHandle::new(None, cmd_tx) } // ── cmd_tx path: HashMap re-alignment correctness ───────────────────────── @@ -568,3 +568,151 @@ mod read_handle_tests { handle.await.unwrap(); } } + +// ── Error helper tests ──────────────────────────────────────────────────────── +// +// These functions live in standalone_read_handle.rs and are shared by both +// StandaloneReadHandle and EmbeddedReadHandle (via re-export). Testing them +// here keeps the coverage co-located with the implementation. + +#[cfg(test)] +mod error_helper_tests { + use bytes::Bytes; + use d_engine_core::client::{ClientApiError, ClientResponsePayload, ErrorCode}; + use d_engine_core::client::{KvEntry, LeaderHint, ReadResults}; + + use super::super::{extract_read_payload, map_error_response, not_leader_error}; + + // ─── not_leader_error ──────────────────────────────────────────────────── + + #[test] + fn test_not_leader_uses_server_retry_after_ms_when_provided() { + let err = not_leader_error( + Some("1".to_string()), + Some("127.0.0.1:5001".to_string()), + Some(500), + ); + match err { + ClientApiError::Network { retry_after_ms, .. } => { + assert_eq!(retry_after_ms, Some(500)); + } + _ => panic!("expected Network error"), + } + } + + #[test] + fn test_not_leader_falls_back_to_100ms_when_server_provides_none() { + let err = not_leader_error(None, None, None); + match err { + ClientApiError::Network { retry_after_ms, .. } => { + assert_eq!(retry_after_ms, Some(100)); + } + _ => panic!("expected Network error"), + } + } + + #[test] + fn test_not_leader_zero_is_not_treated_as_none() { + let err = not_leader_error(None, None, Some(0)); + match err { + ClientApiError::Network { retry_after_ms, .. } => { + assert_eq!(retry_after_ms, Some(0)); + } + _ => panic!("expected Network error"), + } + } + + // ─── map_error_response ────────────────────────────────────────────────── + + #[test] + fn test_map_error_response_not_leader_forwards_retry_after_ms() { + let err = map_error_response( + ErrorCode::NotLeader, + Some(LeaderHint { + leader_id: 2, + address: "10.0.0.2:5002".into(), + }), + Some(250), + ); + match err { + ClientApiError::Network { + code, + retry_after_ms, + leader_hint, + .. + } => { + assert_eq!(code, ErrorCode::NotLeader); + assert_eq!(retry_after_ms, Some(250)); + assert_eq!(leader_hint.unwrap().leader_id, 2); + } + _ => panic!("expected Network error"), + } + } + + #[test] + fn test_map_error_response_not_leader_falls_back_to_100ms_when_none() { + let err = map_error_response(ErrorCode::NotLeader, None, None); + match err { + ClientApiError::Network { retry_after_ms, .. } => { + assert_eq!(retry_after_ms, Some(100)); + } + _ => panic!("expected Network error"), + } + } + + // ─── extract_read_payload ──────────────────────────────────────────────── + + #[test] + fn test_extract_read_payload_returns_read_results_on_success() { + let payload = Some(ClientResponsePayload::Read(ReadResults { + entries: vec![KvEntry { + key: Bytes::from("k"), + value: Bytes::from("v"), + }], + })); + let result = extract_read_payload(payload).unwrap(); + assert_eq!(result.entries[0].key, Bytes::from("k")); + } + + #[test] + fn test_extract_read_payload_rejects_write_result_payload() { + let payload = Some(ClientResponsePayload::Write( + d_engine_core::client::WriteResult { succeeded: true }, + )); + let err = extract_read_payload(payload).unwrap_err(); + assert_eq!(err.code(), ErrorCode::InvalidResponse); + assert!(err.message().contains("WriteResult")); + } + + #[test] + fn test_extract_read_payload_rejects_none_payload() { + let err = extract_read_payload(None).unwrap_err(); + assert_eq!(err.code(), ErrorCode::InvalidResponse); + assert!(err.message().contains("None")); + } + + #[test] + fn test_extract_read_payload_empty_entries_is_valid() { + let payload = Some(ClientResponsePayload::Read(ReadResults { entries: vec![] })); + assert!(extract_read_payload(payload).unwrap().entries.is_empty()); + } + + #[test] + fn test_extract_read_payload_multiple_entries_are_preserved() { + let payload = Some(ClientResponsePayload::Read(ReadResults { + entries: vec![ + KvEntry { + key: Bytes::from("k1"), + value: Bytes::from("v1"), + }, + KvEntry { + key: Bytes::from("k2"), + value: Bytes::from("v2"), + }, + ], + })); + let result = extract_read_payload(payload).unwrap(); + assert_eq!(result.entries.len(), 2); + assert_eq!(result.entries[1].key, Bytes::from("k2")); + } +} diff --git a/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs b/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs index caa0941f..ed7d50c0 100644 --- a/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs +++ b/d-engine-server/src/network/grpc/grpc_raft_service_fast_path_test.rs @@ -26,7 +26,7 @@ mod grpc_fast_path_tests { use tonic::Request; use crate::Node; - use crate::api::ReadHandle; + use crate::api::StandaloneReadHandle; use crate::test_utils::mock_node; use d_engine_core::MockTypeConfig; @@ -81,7 +81,7 @@ mod grpc_fast_path_tests { drop(cmd_rx); } let handle = tokio::spawn(run_read_actor(read_rx, lease, Arc::new(sm), 64)); - let rh = ReadHandle::new(Some(read_tx), cmd_tx); + let rh = StandaloneReadHandle::new(Some(read_tx), cmd_tx); let (_, graceful_rx) = tokio::sync::watch::channel(()); let mut node = mock_node("/tmp/grpc_fast_path_test", graceful_rx, None); @@ -339,7 +339,7 @@ mod grpc_fast_path_tests { let (_, graceful_rx) = tokio::sync::watch::channel(()); let mut node = mock_node("/tmp/grpc_fast_path_test_no_rt", graceful_rx, None); - node.read_handle = ReadHandle::new(None, cmd_tx); + node.read_handle = StandaloneReadHandle::new(None, cmd_tx); node.ready.store(true, Ordering::SeqCst); for policy in [ diff --git a/d-engine-server/src/node/builder.rs b/d-engine-server/src/node/builder.rs index 4a535a12..46d89b65 100644 --- a/d-engine-server/src/node/builder.rs +++ b/d-engine-server/src/node/builder.rs @@ -579,7 +579,7 @@ where state_machine, max_drain, )); - let read_handle = crate::api::ReadHandle::new(Some(read_tx), cmd_tx.clone()); + let read_handle = crate::api::StandaloneReadHandle::new(Some(read_tx), cmd_tx.clone()); let node = Node::> { node_id, diff --git a/d-engine-server/src/node/mod.rs b/d-engine-server/src/node/mod.rs index c1064bfe..4bd53766 100644 --- a/d-engine-server/src/node/mod.rs +++ b/d-engine-server/src/node/mod.rs @@ -131,7 +131,7 @@ where pub(crate) read_lease: Arc, /// Fast-path read routing. Always set; `read_tx = None` means no ReadActor. - pub(crate) read_handle: crate::api::ReadHandle, + pub(crate) read_handle: crate::api::StandaloneReadHandle, } impl Debug for Node diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs index 704406cc..c5f15d11 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs @@ -1017,6 +1017,12 @@ impl StateMachine for FileStateMachine { Ok(()) } + fn close_storage(&self) { + self.running.store(false, Ordering::SeqCst); + // FileStateMachine has no exclusive OS lock file. + // Marking not-running is sufficient; Drop handles final flush. + } + fn stop(&self) -> Result<(), Error> { // Ensure all data is flushed to disk before stopping self.running.store(false, Ordering::SeqCst); diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs index b9031e3a..dcf49be1 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs @@ -9,6 +9,32 @@ use d_engine_core::Error; use d_engine_core::storage::state_machine_test::{StateMachineBuilder, StateMachineTestSuite}; use tempfile::TempDir; +// ── close_storage() tests ───────────────────────────────────────────────────── + +/// close_storage() must mark the SM as not running. +/// FileStateMachine has no exclusive OS lock, so close_storage() is a lifecycle +/// signal — subsequent reads must fail with NotServing. +#[tokio::test] +async fn test_file_sm_close_storage_marks_not_running() { + let dir = TempDir::new().unwrap(); + let sm = FileStateMachine::new(dir.path().to_path_buf()).await.unwrap(); + sm.start().await.unwrap(); + assert!(sm.is_running()); + + sm.close_storage(); + + assert!(!sm.is_running(), "close_storage must mark SM not running"); +} + +/// stop() after close_storage() must not panic (idempotent shutdown). +#[tokio::test] +async fn test_file_sm_stop_after_close_storage_is_safe() { + let dir = TempDir::new().unwrap(); + let sm = FileStateMachine::new(dir.path().to_path_buf()).await.unwrap(); + sm.close_storage(); + assert!(sm.stop().is_ok(), "stop after close_storage must not error"); +} + /// Builder for FileStateMachine test instances struct FileStateMachineBuilder { temp_dir: TempDir, @@ -26,7 +52,7 @@ impl FileStateMachineBuilder { impl StateMachineBuilder for FileStateMachineBuilder { async fn build(&self) -> Result, Error> { // Use fixed path to support restart recovery testing - let path = self.temp_dir.path().join("file_sm"); + let path = self.temp_dir.path().to_path_buf().join("file_sm"); let sm = FileStateMachine::new(path).await?; Ok(Arc::new(sm)) } @@ -60,7 +86,7 @@ async fn test_file_state_machine_performance() { #[tokio::test] async fn test_wal_replay_after_crash() { let temp_dir = tempfile::tempdir().unwrap(); - let data_dir = temp_dir.path().to_path_buf(); + let data_dir = temp_dir.path().to_path_buf().to_path_buf(); let sm = FileStateMachine::new(data_dir.clone()).await.unwrap(); @@ -136,7 +162,7 @@ async fn test_wal_replay_after_crash() { #[tokio::test] async fn test_cas_failure_wal_replay_does_not_corrupt_data() { let temp_dir = tempfile::tempdir().unwrap(); - let data_dir = temp_dir.path().to_path_buf(); + let data_dir = temp_dir.path().to_path_buf().to_path_buf(); let sm = FileStateMachine::new(data_dir.clone()).await.unwrap(); // Establish initial value @@ -190,7 +216,9 @@ async fn test_cas_failure_wal_replay_does_not_corrupt_data() { #[tokio::test] async fn test_cas_in_same_chunk_as_preceding_insert() { let temp_dir = tempfile::tempdir().unwrap(); - let sm = FileStateMachine::new(temp_dir.path().to_path_buf()).await.unwrap(); + let sm = FileStateMachine::new(temp_dir.path().to_path_buf().to_path_buf()) + .await + .unwrap(); let results = sm .apply_chunk(&[ @@ -224,7 +252,7 @@ async fn test_cas_in_same_chunk_as_preceding_insert() { #[tokio::test] async fn test_cas_success_wal_replay_applies_new_value() { let temp_dir = tempfile::tempdir().unwrap(); - let data_dir = temp_dir.path().to_path_buf(); + let data_dir = temp_dir.path().to_path_buf().to_path_buf(); let sm = FileStateMachine::new(data_dir.clone()).await.unwrap(); sm.apply_chunk(&[ApplyEntry { @@ -278,7 +306,7 @@ async fn test_cas_success_wal_replay_applies_new_value() { #[tokio::test] async fn test_replay_wal_unknown_opcode_returns_error() { let temp_dir = tempfile::tempdir().unwrap(); - let data_dir = temp_dir.path().to_path_buf(); + let data_dir = temp_dir.path().to_path_buf().to_path_buf(); // Write one valid entry so the WAL file exists and has a known-good prefix. let sm = FileStateMachine::new(data_dir.clone()).await.unwrap(); @@ -325,7 +353,9 @@ async fn test_replay_wal_unknown_opcode_returns_error() { #[tokio::test] async fn test_file_sm_scan_prefix_returns_matching_keys() { let temp_dir = tempfile::tempdir().unwrap(); - let sm = FileStateMachine::new(temp_dir.path().to_path_buf()).await.unwrap(); + let sm = FileStateMachine::new(temp_dir.path().to_path_buf().to_path_buf()) + .await + .unwrap(); let entries = vec![ ApplyEntry { @@ -375,7 +405,9 @@ async fn test_file_sm_scan_prefix_returns_matching_keys() { #[tokio::test] async fn test_file_sm_scan_prefix_empty_namespace() { let temp_dir = tempfile::tempdir().unwrap(); - let sm = FileStateMachine::new(temp_dir.path().to_path_buf()).await.unwrap(); + let sm = FileStateMachine::new(temp_dir.path().to_path_buf().to_path_buf()) + .await + .unwrap(); sm.apply_chunk(&[ApplyEntry { index: 1, @@ -412,7 +444,9 @@ async fn test_file_sm_scan_prefix_empty_namespace() { #[tokio::test] async fn test_get_multi_file_sm_atomic_state_transitions() { let temp_dir = tempfile::tempdir().unwrap(); - let sm = FileStateMachine::new(temp_dir.path().to_path_buf()).await.unwrap(); + let sm = FileStateMachine::new(temp_dir.path().to_path_buf().to_path_buf()) + .await + .unwrap(); // v1: initial state sm.apply_chunk(&[ @@ -501,7 +535,9 @@ async fn test_get_multi_file_sm_atomic_state_transitions() { #[tokio::test] async fn test_file_sm_scan_prefix_revision_reflects_applied_index() { let temp_dir = tempfile::tempdir().unwrap(); - let sm = FileStateMachine::new(temp_dir.path().to_path_buf()).await.unwrap(); + let sm = FileStateMachine::new(temp_dir.path().to_path_buf().to_path_buf()) + .await + .unwrap(); let entries: Vec = (1u64..=3) .map(|i| ApplyEntry { diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs index 7e3b8dec..e9e8a80a 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs @@ -76,7 +76,9 @@ struct CfExportFile { /// RocksDB-based state machine implementation with lease support #[derive(Debug)] pub struct RocksDBStateMachine { - db: Arc>, + // Option> inside ArcSwap: close_db() stores None to release the RocksDB LOCK + // file immediately, decoupled from Arc reference count reaching zero. + db: Arc>>>, is_serving: AtomicBool, last_applied_index: AtomicU64, last_applied_term: AtomicU64, @@ -130,7 +132,7 @@ impl RocksDBStateMachine { let last_snapshot_metadata = Self::load_snapshot_metadata(&db_arc)?; Ok(Self { - db: Arc::new(ArcSwap::new(db_arc)), + db: Arc::new(ArcSwap::new(Arc::new(Some(db_arc)))), is_serving: AtomicBool::new(true), last_applied_index: AtomicU64::new(last_applied_index), last_applied_term: AtomicU64::new(last_applied_term), @@ -148,7 +150,7 @@ impl RocksDBStateMachine { let last_snapshot_metadata = Self::load_snapshot_metadata(&db)?; Ok(Self { - db: Arc::new(ArcSwap::new(db)), + db: Arc::new(ArcSwap::new(Arc::new(Some(db)))), is_serving: AtomicBool::new(true), last_applied_index: AtomicU64::new(last_applied_index), last_applied_term: AtomicU64::new(last_applied_term), @@ -176,15 +178,50 @@ impl RocksDBStateMachine { &self, new_db: DB, ) { - self.db.store(Arc::new(new_db)); + self.db.store(Arc::new(Some(Arc::new(new_db)))); } - // Injects lease configuration into this state machine. - // - // Framework-internal method: called by NodeBuilder::build() during initialization. - // Opens RocksDB with the standard configuration // ========== Private helper methods ========== + /// Run `f` with a borrowed `&DB`, returning `NotServing` if `close_db()` was called. + /// + /// Uses `ArcSwap::load()` — a seqlock read with no Arc clone. The Guard never + /// escapes this call, so the hot-path cost is identical to the pre-refactor code. + /// + /// **When to use**: any operation whose entire DB access fits inside a single closure + /// body: reads, metadata writes, batch commits, etc. + /// + /// **When NOT to use**: if the DB handle must cross an `await` point or if complex + /// lifetime dependencies prevent the whole operation from fitting in one closure + /// (e.g. `apply_chunk`, where `batch` borrows `cf` which borrows `db` across the + /// full function body). In those cases use the inline Guard pattern directly, or + /// `load_db()` when the `Arc` must be moved (e.g. `spawn_blocking`). + fn with_db( + &self, + f: F, + ) -> Result + where + F: FnOnce(&DB) -> Result, + { + let guard = self.db.load(); // Guard — no Arc clone + match guard.as_ref().as_deref() { + Some(db) => f(db), + None => Err(StorageError::NotServing("state machine stopped".into()).into()), + } + } + + /// Clone the live `Arc` for paths that must *move* the handle (e.g. `spawn_blocking`). + /// + /// Costs 2 atomic ops (Arc increment + future decrement). Only use when the handle + /// must be moved into a closure or across an await point. For all other cases prefer + /// `with_db()` (zero Arc clone) or the inline Guard pattern. + fn load_db(&self) -> Result, Error> { + let opt = self.db.load_full(); // Arc>> + opt.as_ref() + .clone() + .ok_or_else(|| StorageError::NotServing("state machine stopped".into()).into()) + } + fn load_state_machine_metadata(db: &Arc) -> Result<(u64, u64), Error> { let cf = db .cf_handle(STATE_MACHINE_META_CF) @@ -231,51 +268,55 @@ impl RocksDBStateMachine { } fn persist_state_machine_metadata(&self) -> Result<(), Error> { - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_META_CF) - .ok_or_else(|| StorageError::DbError("State machine meta CF not found".to_string()))?; - let index = self.last_applied_index.load(Ordering::SeqCst); let term = self.last_applied_term.load(Ordering::SeqCst); - - db.put_cf(&cf, LAST_APPLIED_INDEX_KEY, index.to_be_bytes()) - .map_err(|e| StorageError::DbError(e.to_string()))?; - db.put_cf(&cf, LAST_APPLIED_TERM_KEY, term.to_be_bytes()) - .map_err(|e| StorageError::DbError(e.to_string()))?; - - Ok(()) + self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_META_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine meta CF not found".to_string(), + ))) + })?; + db.put_cf(&cf, LAST_APPLIED_INDEX_KEY, index.to_be_bytes()) + .map_err(|e| StorageError::DbError(e.to_string()))?; + db.put_cf(&cf, LAST_APPLIED_TERM_KEY, term.to_be_bytes()) + .map_err(|e| StorageError::DbError(e.to_string()))?; + Ok(()) + }) } fn persist_snapshot_metadata(&self) -> Result<(), Error> { - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_META_CF) - .ok_or_else(|| StorageError::DbError("State machine meta CF not found".to_string()))?; - - if let Some(metadata) = self.last_snapshot_metadata.read().clone() { - let bytes = bincode::serialize(&metadata).map_err(StorageError::BincodeError)?; - db.put_cf(&cf, SNAPSHOT_METADATA_KEY, bytes) - .map_err(|e| StorageError::DbError(e.to_string()))?; - } - Ok(()) + let snapshot = self.last_snapshot_metadata.read().clone(); + self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_META_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine meta CF not found".to_string(), + ))) + })?; + if let Some(metadata) = &snapshot { + let bytes = bincode::serialize(metadata).map_err(StorageError::BincodeError)?; + db.put_cf(&cf, SNAPSHOT_METADATA_KEY, bytes) + .map_err(|e| StorageError::DbError(e.to_string()))?; + } + Ok(()) + }) } fn persist_ttl_metadata(&self) -> Result<(), Error> { - if let Some(ref lease) = self.lease { - let db = self.db.load(); + let Some(ref lease) = self.lease else { + return Ok(()); + }; + let ttl_snapshot = lease.to_snapshot(); + self.with_db(|db| { let cf = db.cf_handle(STATE_MACHINE_META_CF).ok_or_else(|| { - StorageError::DbError("State machine meta CF not found".to_string()) + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine meta CF not found".to_string(), + ))) })?; - - let ttl_snapshot = lease.to_snapshot(); - - db.put_cf(&cf, TTL_STATE_KEY, ttl_snapshot) + db.put_cf(&cf, TTL_STATE_KEY, &ttl_snapshot) .map_err(|e| StorageError::DbError(e.to_string()))?; - debug!("Persisted TTL state to RocksDB"); - } - Ok(()) + Ok(()) + }) } /// Loads TTL state from RocksDB metadata after lease injection. @@ -286,26 +327,26 @@ impl RocksDBStateMachine { let Some(ref lease) = self.lease else { return Ok(()); // No lease configured }; - - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_META_CF) - .ok_or_else(|| StorageError::DbError("State machine meta CF not found".to_string()))?; - - match db - .get_cf(&cf, TTL_STATE_KEY) - .map_err(|e| StorageError::DbError(e.to_string()))? - { - Some(ttl_data) => { - lease.reload(&ttl_data)?; - debug!("Loaded TTL state from RocksDB: {} active TTLs", lease.len()); - } - None => { - debug!("No TTL state found in RocksDB"); + self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_META_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine meta CF not found".to_string(), + ))) + })?; + match db + .get_cf(&cf, TTL_STATE_KEY) + .map_err(|e| StorageError::DbError(e.to_string()))? + { + Some(ttl_data) => { + lease.reload(&ttl_data)?; + debug!("Loaded TTL state from RocksDB: {} active TTLs", lease.len()); + } + None => { + debug!("No TTL state found in RocksDB"); + } } - } - - Ok(()) + Ok(()) + }) } /// Piggyback cleanup: Remove expired keys with time budget @@ -347,13 +388,13 @@ impl RocksDBStateMachine { } // Get database handle - let db = self.db.load(); - let cf = match db.cf_handle(STATE_MACHINE_CF) { - Some(cf) => cf, - None => { - error!("State machine CF not found during TTL cleanup"); - return 0; - } + let guard = self.db.load(); + let Some(db) = guard.as_ref().as_deref() else { + return 0; + }; + let Some(cf) = db.cf_handle(STATE_MACHINE_CF) else { + error!("State machine CF not found during TTL cleanup"); + return 0; }; // Cleanup expired keys with time budget @@ -410,8 +451,7 @@ impl RocksDBStateMachine { &self, batch: WriteBatch, ) -> Result<(), Error> { - self.db.load().write(&batch).map_err(|e| StorageError::DbError(e.to_string()))?; - Ok(()) + self.with_db(|db| db.write(&batch).map_err(|e| StorageError::DbError(e.to_string()).into())) } // ===== Snapshot restore helpers ===== @@ -424,8 +464,7 @@ impl RocksDBStateMachine { metadata: &SnapshotMetadata, snapshot_dir: &std::path::Path, ) -> Result<(), Error> { - let db = self.db.load(); - Self::restore_from_cf_export(&db, snapshot_dir)?; + self.with_db(|db| Self::restore_from_cf_export(db, snapshot_dir))?; info!("Snapshot restore complete"); @@ -615,7 +654,10 @@ impl RocksDBStateMachine { opts.set_iterate_upper_bound(upper); } - let db = self.db.load(); + let guard = self.db.load(); + let Some(db) = guard.as_ref().as_deref() else { + return Err(StorageError::NotServing("state machine stopped".into()).into()); + }; let cf = db .cf_handle(STATE_MACHINE_CF) .ok_or_else(|| StorageError::DbError("STATE_MACHINE_CF not found".into()))?; @@ -633,6 +675,38 @@ impl RocksDBStateMachine { let revision = self.last_applied_index.load(Ordering::SeqCst); Ok(ScanResult { entries, revision }) } + + /// Permanently close the RocksDB handle and release the LOCK file. + /// + /// Unlike `stop()`, this is not reversible with `start()`. + /// Called by `EmbeddedEngine::stop()` before the Raft loop exits so the LOCK + /// is released without waiting for `Arc` reference counts to reach zero. + /// + /// Sequence: flush → save hard state → cancel background work → store None. + /// After this, `load_db()` returns `NotServing`; `stop()` afterwards is safe. + pub(crate) fn close_db(&self) { + self.is_serving.store(false, Ordering::SeqCst); + + if let Err(e) = self.persist_ttl_metadata() { + error!("close_db: failed to persist TTL metadata: {e:?}"); + } + if let Err(e) = self.save_hard_state() { + error!("close_db: failed to save hard state: {e:?}"); + } + if let Err(e) = self.flush() { + error!("close_db: failed to flush: {e:?}"); + } + { + let guard = self.db.load(); + if let Some(db) = guard.as_ref().as_deref() { + db.cancel_all_background_work(true); + } + } + + // Release Arc: refcount decrements here, RocksDB LOCK file released. + self.db.store(Arc::new(None)); + info!("RocksDB state machine: DB closed, LOCK released"); + } } #[async_trait] @@ -650,12 +724,20 @@ impl StateMachine for RocksDBStateMachine { Ok(()) } + fn close_storage(&self) { + self.close_db(); + } + fn stop(&self) -> Result<(), Error> { self.is_serving.store(false, Ordering::SeqCst); - // Graceful shutdown: persist TTL state to disk - // This ensures lease data survives across restarts - if let Err(e) = self.persist_ttl_metadata() { + // Skip TTL persist if close_db() was already called (DB is None). + // Node::stop() calls sm.stop() after EmbeddedEngine has already called close_db(), + // so this path must be safe to call on a closed DB. + // Skip TTL persist if close_db() has already set DB to None. + if self.db.load().as_ref().is_some() + && let Err(e) = self.persist_ttl_metadata() + { error!("Failed to persist TTL metadata on shutdown: {:?}", e); return Err(e); } @@ -682,15 +764,17 @@ impl StateMachine for RocksDBStateMachine { .into()); } - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_CF) - .ok_or_else(|| StorageError::DbError("State machine CF not found".to_string()))?; - - match db.get_cf(&cf, key_buffer).map_err(|e| StorageError::DbError(e.to_string()))? { - Some(value) => Ok(Some(Bytes::copy_from_slice(&value))), - None => Ok(None), - } + self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine CF not found".to_string(), + ))) + })?; + match db.get_cf(&cf, key_buffer).map_err(|e| StorageError::DbError(e.to_string()))? { + Some(value) => Ok(Some(Bytes::copy_from_slice(&value))), + None => Ok(None), + } + }) } fn entry_term( @@ -708,7 +792,13 @@ impl StateMachine for RocksDBStateMachine { &self, chunk: &[ApplyEntry], ) -> Result, Error> { - let db = self.db.load(); + // Inline guard: db and cf must share a lifetime across the entire function body + // (batch borrows cf, CAS reads borrow db). Using with_db() closure would require + // moving the whole async function body into a sync closure — use Guard directly. + let guard = self.db.load(); + let Some(db) = guard.as_ref().as_deref() else { + return Err(StorageError::NotServing("state machine stopped".into()).into()); + }; let cf = db .cf_handle(STATE_MACHINE_CF) .ok_or_else(|| StorageError::DbError("State machine CF not found".to_string()))?; @@ -767,7 +857,7 @@ impl StateMachine for RocksDBStateMachine { // Read through WriteBatchWithIndex so earlier writes in this batch // are visible, preventing stale-read linearizability violations. let current_value = batch - .get_from_batch_and_db_cf(&*db, &cf, key, &ReadOptions::default()) + .get_from_batch_and_db_cf(db, &cf, key, &ReadOptions::default()) .map_err(|e| StorageError::DbError(format!("CAS read failed: {e}")))?; let cas_success = match (current_value, expected) { @@ -796,10 +886,7 @@ impl StateMachine for RocksDBStateMachine { } } - self.db - .load() - .write_wbwi(&batch) - .map_err(|e| StorageError::DbError(e.to_string()))?; + db.write_wbwi(&batch).map_err(|e| StorageError::DbError(e.to_string()))?; if let Some(highest) = highest_index_entry { self.update_last_applied(highest); @@ -809,15 +896,15 @@ impl StateMachine for RocksDBStateMachine { } fn len(&self) -> usize { - let db = self.db.load(); - let cf = match db.cf_handle(STATE_MACHINE_CF) { - Some(cf) => cf, - None => return 0, + let guard = self.db.load(); + let Some(db) = guard.as_ref().as_deref() else { + return 0; + }; + let Some(cf) = db.cf_handle(STATE_MACHINE_CF) else { + return 0; }; - // Note: This is an expensive operation because it iterates over all keys. - let iter = db.iterator_cf(&cf, IteratorMode::Start); - iter.count() + db.iterator_cf(&cf, IteratorMode::Start).count() } fn update_last_applied( @@ -904,7 +991,7 @@ impl StateMachine for RocksDBStateMachine { // run on tokio's blocking thread pool via spawn_blocking, not on an async worker thread. // This prevents snapshot disk I/O from starving the Raft event loop under concurrent // writes (#315). - let db = self.db.load_full(); // Arc: Send, safe to move into spawn_blocking + let db = self.load_db()?; // Arc: Send, safe to move into spawn_blocking let dir = new_snapshot_dir.clone(); tokio::task::spawn_blocking(move || -> Result<(), Error> { std::fs::create_dir_all(&dir)?; @@ -970,18 +1057,12 @@ impl StateMachine for RocksDBStateMachine { } fn flush(&self) -> Result<(), Error> { - let db = self.db.load(); - - // Step 1: Sync WAL to disk (critical!) - // true = sync to disk - db.flush_wal(true).map_err(|e| StorageError::DbError(e.to_string()))?; - // Step 2: Flush memtables to SST files - db.flush().map_err(|e| StorageError::DbError(e.to_string()))?; - - // Persist state machine metadata (last_applied_index, last_applied_term, snapshot_metadata) - self.persist_state_machine_metadata()?; - - Ok(()) + self.with_db(|db| { + db.flush_wal(true).map_err(|e| StorageError::DbError(e.to_string()))?; + db.flush().map_err(|e| StorageError::DbError(e.to_string()))?; + Ok(()) + })?; + self.persist_state_machine_metadata() } async fn flush_async(&self) -> Result<(), Error> { @@ -990,29 +1071,26 @@ impl StateMachine for RocksDBStateMachine { #[instrument(skip(self))] async fn reset(&self) -> Result<(), Error> { - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_CF) - .ok_or_else(|| StorageError::DbError("State machine CF not found".to_string()))?; - - // Delete all keys in the state machine - let mut batch = WriteBatch::default(); - let iter = db.iterator_cf(&cf, IteratorMode::Start); - - for item in iter { - let (key, _) = item.map_err(|e| StorageError::DbError(e.to_string()))?; - batch.delete_cf(&cf, &key); - } - - db.write(&batch).map_err(|e| StorageError::DbError(e.to_string()))?; + self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine CF not found".to_string(), + ))) + })?; + let mut batch = WriteBatch::default(); + let iter = db.iterator_cf(&cf, IteratorMode::Start); + for item in iter { + let (key, _) = item.map_err(|e| StorageError::DbError(e.to_string()))?; + batch.delete_cf(&cf, &key); + } + db.write(&batch).map_err(|e| StorageError::DbError(e.to_string()))?; + Ok(()) + })?; - // Reset metadata self.last_applied_index.store(0, Ordering::SeqCst); self.last_applied_term.store(0, Ordering::SeqCst); *self.last_snapshot_metadata.write() = None; - // Note: Lease is managed by NodeBuilder and doesn't need reset - self.persist_state_machine_metadata()?; self.persist_snapshot_metadata()?; @@ -1049,16 +1127,18 @@ impl StateMachine for RocksDBStateMachine { ); // Delete expired keys from RocksDB - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_CF) - .ok_or_else(|| StorageError::DbError("State machine CF not found".to_string()))?; - - let mut batch = WriteBatch::default(); - for key in &expired_keys { - batch.delete_cf(&cf, key); - } - + let batch = self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine CF not found".to_string(), + ))) + })?; + let mut batch = WriteBatch::default(); + for key in &expired_keys { + batch.delete_cf(&cf, key); + } + Ok(batch) + })?; self.apply_batch(batch)?; info!( @@ -1086,24 +1166,32 @@ impl StateMachine for RocksDBStateMachine { ) .into()); } - let db = self.db.load(); - let cf = db - .cf_handle(STATE_MACHINE_CF) - .ok_or_else(|| StorageError::DbError("State machine CF not found".to_string()))?; - // One snapshot covers the full batch: all keys read from the same point-in-time. - // Snapshot lives only within this call — no lifetime escaping, no unsafe. - let snap = db.snapshot(); - keys.iter() - .map(|k| { - snap.get_cf(&cf, k) - .map(|v| v.map(|b| Bytes::copy_from_slice(&b))) - .map_err(|e| StorageError::DbError(e.to_string()).into()) - }) - .collect() + self.with_db(|db| { + let cf = db.cf_handle(STATE_MACHINE_CF).ok_or_else(|| { + Error::System(d_engine_core::SystemError::Storage(StorageError::DbError( + "State machine CF not found".to_string(), + ))) + })?; + // One snapshot covers the full batch: all keys read from the same point-in-time. + // Snapshot lives only within this call — no lifetime escaping, no unsafe. + let snap = db.snapshot(); + keys.iter() + .map(|k| { + snap.get_cf(&cf, k) + .map(|v| v.map(|b| Bytes::copy_from_slice(&b))) + .map_err(|e| StorageError::DbError(e.to_string()).into()) + }) + .collect() + }) } } impl Drop for RocksDBStateMachine { fn drop(&mut self) { + // If close_db() was already called, DB is None — nothing to flush or cancel. + if self.db.load().as_ref().is_none() { + return; + } + // save_hard_state() persists last_applied metadata before flush // This is critical to prevent replay of already-applied entries on restart if let Err(e) = self.save_hard_state() { @@ -1117,8 +1205,11 @@ impl Drop for RocksDBStateMachine { debug!("RocksDBStateMachine flushed successfully on drop"); } - // This ensures flush operations are truly finished - self.db.load().cancel_all_background_work(true); // true = wait for completion - debug!("RocksDB background work cancelled on drop"); + // Ensure flush operations are truly finished (no Arc clone needed — just &DB) + let guard = self.db.load(); + if let Some(db) = guard.as_ref().as_deref() { + db.cancel_all_background_work(true); + debug!("RocksDB background work cancelled on drop"); + } } } diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs index c7af72f7..43b69e54 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs @@ -437,6 +437,59 @@ async fn test_get_multi_rocksdb_snapshot_reads_consistent_state() { } } +// ── close_db() tests ────────────────────────────────────────────────────────── +// +// close_db() is a permanent, one-way shutdown that releases the RocksDB LOCK file +// immediately, without waiting for Arc to be the sole owner. It is separate +// from stop() because stop()/start() must remain a reversible cycle (used during +// snapshot restoration). + +/// close_db() marks SM not-running and makes reads return an error. +#[tokio::test] +async fn test_close_db_prevents_reads() { + let dir = TempDir::new().unwrap(); + let (_storage, sm) = RocksDBUnifiedEngine::open(dir.path()).unwrap(); + sm.start().await.unwrap(); + sm.apply_chunk(&[insert_at(b"k", b"v", 1)]).await.unwrap(); + assert_eq!(sm.get(b"k").unwrap(), Some(Bytes::from_static(b"v"))); + + sm.close_db(); + + assert!(!sm.is_running(), "is_running must be false after close_db"); + assert!(sm.get(b"k").is_err(), "get must fail after close_db"); + assert!( + sm.get_multi(&[Bytes::from_static(b"k")]).is_err(), + "get_multi must fail after close_db" + ); +} + +/// stop() after close_db() must succeed without panicking. +/// Node::stop() calls sm.stop() after EmbeddedEngine has already called close_db(); +/// that sequence must be safe. +#[test] +fn test_stop_after_close_db_is_safe() { + let dir = TempDir::new().unwrap(); + let (_storage, sm) = RocksDBUnifiedEngine::open(dir.path()).unwrap(); + sm.close_db(); + assert!(sm.stop().is_ok(), "stop after close_db must not error"); +} + +/// Drop after close_db() must not panic or double-flush. +/// EmbeddedEngine::stop() calls close_db() before the Raft loop exits; the SM +/// is then dropped — Drop must detect the closed state and skip the flush. +#[tokio::test] +async fn test_drop_after_close_db_does_not_panic() { + let dir = TempDir::new().unwrap(); + { + let (_storage, sm) = RocksDBUnifiedEngine::open(dir.path()).unwrap(); + sm.start().await.unwrap(); + sm.apply_chunk(&[insert_at(b"k", b"v", 1)]).await.unwrap(); + sm.close_db(); + // sm drops here — Drop must be a no-op + } + // reaching here without panic means the test passes +} + // ── Helpers ─────────────────────────────────────────────────────────────────── fn insert_at( diff --git a/d-engine-server/src/test_utils/mock/mock_node_builder.rs b/d-engine-server/src/test_utils/mock/mock_node_builder.rs index 91281d4c..8cbeb150 100644 --- a/d-engine-server/src/test_utils/mock/mock_node_builder.rs +++ b/d-engine-server/src/test_utils/mock/mock_node_builder.rs @@ -326,7 +326,7 @@ impl MockBuilder { raft_core: Arc::new(Mutex::new(raft)), membership, event_tx, - read_handle: crate::api::ReadHandle::new(None, cmd_tx.clone()), + read_handle: crate::api::StandaloneReadHandle::new(None, cmd_tx.clone()), cmd_tx, ready: AtomicBool::new(false), rpc_ready_tx, @@ -379,7 +379,7 @@ impl MockBuilder { raft_core: Arc::new(Mutex::new(raft)), membership, event_tx, - read_handle: crate::api::ReadHandle::new(None, cmd_tx.clone()), + read_handle: crate::api::StandaloneReadHandle::new(None, cmd_tx.clone()), cmd_tx, ready: AtomicBool::new(false), rpc_ready_tx, diff --git a/d-engine/src/docs/server_guide/customize-state-machine.md b/d-engine/src/docs/server_guide/customize-state-machine.md index a732d907..004ba578 100644 --- a/d-engine/src/docs/server_guide/customize-state-machine.md +++ b/d-engine/src/docs/server_guide/customize-state-machine.md @@ -30,10 +30,21 @@ impl StateMachine for CustomStateMachine { } fn stop(&self) -> Result<(), Error> { - // Cleanup resources + // Graceful shutdown: stop accepting requests. + // Called by the Raft loop on shutdown. May be called multiple times. Ok(()) } + // close_storage() has a default no-op implementation. + // Override ONLY if your backend holds an exclusive OS resource (e.g. a lock + // file or an open DB handle) that must be released immediately when + // EmbeddedEngine::stop() is called — without waiting for all Arc clones + // held by EmbeddedClient to drop. + // + // fn close_storage(&self) { + // self.backend.close(); // release lock file / DB handle + // } + fn is_running(&self) -> bool { // Return running status true @@ -104,7 +115,8 @@ impl StateMachine for CustomStateMachine { | Method | Purpose | Sync/Async | Criticality | | ---------------------------------- | ---------------------------------- | ---------- | ----------- | | `start()` | Initialize state machine service | Sync | High | -| `stop()` | Graceful shutdown | Sync | High | +| `stop()` | Graceful shutdown (reversible) | Sync | High | +| `close_storage()` | Release exclusive OS resources (e.g. DB lock file). Default no-op — override only if needed. | Sync | Medium | | `is_running()` | Check service status | Sync | Medium | | `get()` | Read value by key | Sync | High | | `entry_term()` | Get term for log index | Sync | Medium | diff --git a/examples/sled-cluster/src/sled_state_machine.rs b/examples/sled-cluster/src/sled_state_machine.rs index 613794e9..14f3909a 100644 --- a/examples/sled-cluster/src/sled_state_machine.rs +++ b/examples/sled-cluster/src/sled_state_machine.rs @@ -93,6 +93,12 @@ impl StateMachine for SledStateMachine { Ok(()) } + fn close_storage(&self) { + self.is_serving.store(false, Ordering::Release); + // Flush pending sled writes. The sled::Db is released when SledStateMachine drops. + let _ = self.db.load().flush(); + } + fn stop(&self) -> Result<()> { debug!("stop state machine"); self.is_serving.store(false, Ordering::Release); From ccaececb3cbddba5ec34ca88224195434d7f2751 Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:17:15 +0800 Subject: [PATCH 06/12] fix #392: bound ReadActor reply with timeout; fix flaky snapshot assembler test - StandaloneReadHandle fast path: wrap reply_rx.await with tokio::time::timeout(timeout, ...) so a stalled ReadActor falls through to cmd_tx instead of blocking the caller indefinitely - Add test_read_actor_stall_respects_timeout to verify the timeout fires within the caller-supplied deadline - snapshot_assembler_test: call flush_to_disk() before drop in first transfer block; tokio::fs::File buffers writes internally and drop does not guarantee OS flush, causing non-deterministic stale file size on CI --- .../snapshot_assembler_test.rs | 7 +++- .../src/api/standalone_read_handle.rs | 12 ++++--- .../src/api/standalone_read_handle_test.rs | 34 +++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/d-engine-core/src/state_machine_handler/snapshot_assembler_test.rs b/d-engine-core/src/state_machine_handler/snapshot_assembler_test.rs index c620d5f3..939f1475 100644 --- a/d-engine-core/src/state_machine_handler/snapshot_assembler_test.rs +++ b/d-engine-core/src/state_machine_handler/snapshot_assembler_test.rs @@ -197,12 +197,17 @@ async fn test_assembler_on_stale_temp_file_does_not_append_old_data() { "snapshot-".to_string(), )); - // First transfer: write 3 chunks then drop (simulates timeout / leader change) + // First transfer: write 3 chunks, flush to OS buffer, then drop without finalize. + // Explicit flush is required: tokio::fs::File has an internal write buffer that is + // NOT guaranteed to reach the OS kernel on drop. Without flush, the stale file size + // is non-deterministic (CI flakiness). flush_to_disk() models the production scenario + // where some chunks were flushed to the OS before the transfer timed out. { let mut assembler = SnapshotAssembler::new(path_mgr.clone()).await.unwrap(); for i in 0..3u32 { assembler.write_chunk(i, Bytes::from(vec![0xAAu8; 1024])).await.unwrap(); } + assembler.flush_to_disk().await.unwrap(); // Drop without finalize — stale temp file stays on disk with 3 * 1024 bytes } diff --git a/d-engine-server/src/api/standalone_read_handle.rs b/d-engine-server/src/api/standalone_read_handle.rs index f8151195..80ea65e2 100644 --- a/d-engine-server/src/api/standalone_read_handle.rs +++ b/d-engine-server/src/api/standalone_read_handle.rs @@ -188,13 +188,15 @@ impl StandaloneReadHandle { .await .is_ok() { - match reply_rx.await { - Ok(Ok(values)) => return Ok(values), - Ok(Err(ReadActorError::SmError(e))) => return Err(server_error(e)), + match tokio::time::timeout(timeout, reply_rx).await { + Ok(Ok(Ok(values))) => return Ok(values), + Ok(Ok(Err(ReadActorError::SmError(e)))) => return Err(server_error(e)), // LeaseInvalid / SmStopped → fall through to cmd_tx - Ok(Err(ReadActorError::LeaseInvalid | ReadActorError::SmStopped)) => {} + Ok(Ok(Err(ReadActorError::LeaseInvalid | ReadActorError::SmStopped))) => {} // ReadActor exited without replying → fall through - Err(_) => {} + Ok(Err(_)) => {} + // ReadActor stalled beyond timeout → fall through to cmd_tx + Err(_timeout) => {} } } // send() failed (channel closed) → fall through to cmd_tx diff --git a/d-engine-server/src/api/standalone_read_handle_test.rs b/d-engine-server/src/api/standalone_read_handle_test.rs index 04ba3a36..c57a3713 100644 --- a/d-engine-server/src/api/standalone_read_handle_test.rs +++ b/d-engine-server/src/api/standalone_read_handle_test.rs @@ -567,6 +567,40 @@ mod read_handle_tests { drop(rh); handle.await.unwrap(); } + + /// ReadActor stalls (never replies) → timeout must fire and fall through to cmd_tx. + /// Without timeout on reply_rx.await, this test would hang indefinitely. + #[tokio::test] + async fn test_read_actor_stall_respects_timeout() { + let (read_tx, _read_rx) = mpsc::channel::(1); + // _read_rx is held alive (ReadActor never processes requests) but cmd_rx dropped + let (cmd_tx, cmd_rx) = mpsc::channel::(1); + drop(cmd_rx); + + let rh = StandaloneReadHandle::new(Some(read_tx), cmd_tx); + + let short_timeout = Duration::from_millis(50); + let start = tokio::time::Instant::now(); + let result = rh + .get( + b"k", + ReadConsistencyPolicy::EventualConsistency, + 1, + short_timeout, + ) + .await; + + assert!( + start.elapsed() < Duration::from_millis(500), + "stalled ReadActor must not block beyond timeout, took {:?}", + start.elapsed() + ); + assert!( + result.is_err(), + "stalled ReadActor + closed cmd_tx must return error, got: {:?}", + result + ); + } } // ── Error helper tests ──────────────────────────────────────────────────────── From f45293e59f3aa321ff6d40b025a6307cc0804fa4 Mon Sep 17 00:00:00 2001 From: Joshua Chi <112539+JoshuaChi@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:27:34 +0800 Subject: [PATCH 07/12] perf #392: add aws bench report for v0.2.5 --- README.md | 8 +- benches/reports/v0.2.5/bench_report_v0.2.5.md | 195 ++++++++++++++---- .../v0.2.5/d-engine_comparison_v0.2.5.png | Bin 0 -> 465422 bytes ...-engine_v0.2.5_vs_v0.2.4_embedded_mode.png | Bin 0 -> 458216 bytes ...ngine_v0.2.5_vs_v0.2.4_standalone_mode.png | Bin 0 -> 453026 bytes 5 files changed, 154 insertions(+), 49 deletions(-) create mode 100644 benches/reports/v0.2.5/d-engine_comparison_v0.2.5.png create mode 100644 benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_embedded_mode.png create mode 100644 benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_standalone_mode.png diff --git a/README.md b/README.md index df1462fb..b6a5f51a 100644 --- a/README.md +++ b/README.md @@ -123,13 +123,13 @@ Implement the `StorageEngine` and `StateMachine` traits for custom backends: ## Performance -### d-engine v0.2.4 vs etcd +### d-engine v0.2.5 vs etcd -![d-engine vs etcd comparison](https://raw.githubusercontent.com/deventlab/d-engine/main/benches/reports/v0.2.4/d-engine_comparison_v0.2.4.png) +![d-engine vs etcd comparison](https://raw.githubusercontent.com/deventlab/d-engine/main/benches/reports/v0.2.5/d-engine_comparison_v0.2.5.png) -### d-engine v0.2.4 vs v0.2.3 +### d-engine v0.2.5 vs v0.2.4 -![d-engine v0.2.4 vs v0.2.3 comparison](https://raw.githubusercontent.com/deventlab/d-engine/main/benches/reports/v0.2.4/d-engine_v0.2.3_vs_v0.2.4_embedded_mode.png) +![d-engine v0.2.5 vs v0.2.4 comparison](https://raw.githubusercontent.com/deventlab/d-engine/main/benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_embedded_mode.png) ```bash open benches/reports/ diff --git a/benches/reports/v0.2.5/bench_report_v0.2.5.md b/benches/reports/v0.2.5/bench_report_v0.2.5.md index da546fd6..1bc09080 100644 --- a/benches/reports/v0.2.5/bench_report_v0.2.5.md +++ b/benches/reports/v0.2.5/bench_report_v0.2.5.md @@ -7,8 +7,8 @@ **Test Dates**: -- **Local v0.2.5 vs v0.2.4**: May 29, 2026 (3-round average, embedded; warmup round excluded) -- **AWS v0.2.5**: _(TBD — not yet collected)_ +- **Local v0.2.5 vs v0.2.4**: June 2, 2026 (6-round average, embedded) +- **AWS v0.2.5**: June 2, 2026 (2 × 5-round average, 10 rounds total; embedded and standalone) **Key/Value**: 8 bytes / 256 bytes @@ -18,60 +18,165 @@ ### Embedded Mode: v0.2.5 vs v0.2.4 -_(3-round average, manually collected; see Benchmark Configuration for settings)_ - -| **Scenario** | **Metric** | **v0.2.4** | **v0.2.5** | **Δ** | -| ------------------- | ----------- | ------------- | ------------- | ------------- | -| Single Client Write | Throughput | 9,740 ops/s | 9,962 ops/s | +2.3% → | -| | Avg Latency | 0.102 ms | 0.100 ms | -2.0% → | -| | p99 Latency | 0.177 ms | 0.194 ms | +9.6% → | -| High Conc. Write | Throughput | 233,821 ops/s | 231,797 ops/s | -0.9% → | -| | Avg Latency | 0.426 ms | 0.430 ms | +0.9% → | -| | p99 Latency | 1.164 ms | 1.189 ms | +2.1% → | -| Linearizable Read | Throughput | 630,789 ops/s | 633,466 ops/s | +0.4% → | -| | Avg Latency | 0.157 ms | 0.156 ms | stable | -| | p99 Latency | 0.367 ms | 0.398 ms | +8.4% → | -| Lease Read | Throughput | 730,836 ops/s | 810,491 ops/s | **+10.9%** ✅ | -| | Avg Latency | 0.136 ms | 0.123 ms | **-9.4%** ✅ | -| | p99 Latency | 0.337 ms | 0.293 ms | **-13.1%** ✅ | -| Eventual Read | Throughput | 752,198 ops/s | 850,952 ops/s | **+13.1%** ✅ | -| | Avg Latency | 0.132 ms | 0.117 ms | **-11.4%** ✅ | -| | p99 Latency | 0.343 ms | 0.267 ms | **-22.2%** ✅ | -| Hot-Key (10 keys) | Throughput | 659,429 ops/s | 668,178 ops/s | +1.3% → | -| | Avg Latency | 0.153 ms | 0.148 ms | -3.0% → | -| | p99 Latency | 0.343 ms | 0.351 ms | +2.3% → | +_(v0.2.5: 6-round average; v0.2.4: 4-round average; v0.2.3: 4-round average (Lease/Eventual re-measured on same machine). See Benchmark Configuration for settings.)_ + +| **Scenario** | **Metric** | **v0.2.3** | **v0.2.4** | **v0.2.5** | **Δ (v0.2.4→v0.2.5)** | +| ------------------- | ----------- | ------------- | ------------- | ------------- | --------------------- | +| Single Client Write | Throughput | 10,075 ops/s | 9,740 ops/s | 9,658 ops/s | -0.8% → | +| | Avg Latency | 0.099 ms | 0.102 ms | 0.103 ms | stable | +| | p99 Latency | 0.139 ms | 0.177 ms | 0.203 ms | +14.7% → | +| High Conc. Write | Throughput | 176,314 ops/s | 233,821 ops/s | 224,176 ops/s | -4.1% → | +| | Avg Latency | 0.566 ms | 0.426 ms | 0.447 ms | +4.9% → | +| | p99 Latency | 1.566 ms | 1.164 ms | 0.912 ms | **-21.6%** ✅ | +| Linearizable Read | Throughput | 508,264 ops/s | 630,789 ops/s | 586,767 ops/s | -7.0% → | +| | Avg Latency | 0.197 ms | 0.157 ms | 0.170 ms | +8.3% → | +| | p99 Latency | 0.710 ms | 0.367 ms | 0.483 ms | +31.6% ⚠️ | +| Lease Read | Throughput | 705,530 ops/s | 730,836 ops/s | 893,254 ops/s | **+22.2%** ✅ | +| | Avg Latency | 0.116 ms | 0.136 ms | 0.007 ms | **-94.9%** ✅ | +| | p99 Latency | 0.342 ms | 0.337 ms | 0.066 ms | **-80.4%** ✅ | +| Eventual Read | Throughput | 742,602 ops/s | 752,198 ops/s | 884,781 ops/s | **+17.6%** ✅ | +| | Avg Latency | 0.115 ms | 0.132 ms | 0.007 ms | **-94.7%** ✅ | +| | p99 Latency | 0.382 ms | 0.343 ms | 0.067 ms | **-80.5%** ✅ | +| Hot-Key (10 keys) | Throughput | 499,527 ops/s | 659,429 ops/s | 622,459 ops/s | -5.6% → | +| | Avg Latency | 0.205 ms | 0.153 ms | 0.160 ms | stable | +| | p99 Latency | 0.638 ms | 0.343 ms | 0.425 ms | +23.9% ⚠️ | **Notes**: -- Lease/Eventual Read improvement driven by ReadActor fast path (#392): dedicated task bypasses Raft loop entirely for Eventual/LeaseRead, eliminating channel contention under 100 concurrent clients. -- v0.2.4 had Lease/Eventual regression vs v0.2.3 re-measured baseline (705K/742K). v0.2.5 fully recovers: **+14.9%/+14.6% vs v0.2.3**. -- Lease Read run-to-run variance: 727K–865K across 3 rounds (3-round avg 810K). Rounds 1–2 avg ~851K; round 3 dropped to 727K (OS scheduler noise on a loaded Mac mini). -- Linearizable Read p99 +8.4% and Single Write p99 +9.6% are within local benchmark noise; both paths are unchanged from v0.2.4. -- Write throughput fully stable: HC Write within ±1% of v0.2.4. +- **Lease/Eventual Read: headline win vs v0.2.4** — ReadActor fast path (#392) reduces avg latency from ~0.130 ms to ~0.007 ms (**-94%+**), throughput +22.2%/+17.6%. Direct SM reads eliminate all Raft/channel hops for Eventual/LeaseRead under 100 concurrent clients. +- v0.2.3 Lease/Eventual throughput (705K/742K) is the re-measured baseline from the same machine; original v0.2.3 values (852K/859K) were not reproducible due to different system state at the time of that test. +- Lease Read run-to-run variance: 819K–1,001K across 6 rounds (6-round avg 893K). Round 5 reached 1,001K; round 4 dipped to 819K (OS scheduler noise on a loaded Mac mini). +- HC Write p99 **-21.6%** vs v0.2.4 — tail latency improvement despite slight avg regression; 6-round variance includes runs with max p99.9 up to 2,943 µs skewing avg higher. +- Linearizable Read p99 +31.6% and HC Write avg +4.9% are within local benchmark noise on a shared Mac mini; neither read-index nor write-path changed from v0.2.4. +- SC Write and Hot-Key throughput within ±6% of v0.2.4; consistent with normal run-to-run variance across 6 rounds. - Default config (`read_actor_channel_capacity = 512`) yields Lease/Eventual ~790K/~806K (+8%/+7% vs v0.2.4). Results above use tuned settings (see configuration). --- -### Standalone Mode: v0.2.5 vs v0.2.4 +### Standalone Mode: v0.2.5 vs v0.2.4 vs v0.2.3 + +_(v0.2.5: 5-round average; v0.2.4: 5-round average; v0.2.3: 5-round average. All manually collected.)_ + +| **Scenario** | **Metric** | **v0.2.3** | **v0.2.4** | **v0.2.5** | **Δ (v0.2.4→v0.2.5)** | +| ------------------- | ----------- | ------------ | ------------ | ------------ | --------------------- | +| Single Client Write | Throughput | 6,421 ops/s | 5,245 ops/s | 5,234 ops/s | stable | +| | Avg Latency | 0.155 ms | 0.190 ms | 0.190 ms | stable | +| | p99 Latency | 0.200 ms | 0.235 ms | 0.237 ms | stable | +| High Conc. Write | Throughput | 55,285 ops/s | 59,733 ops/s | 60,608 ops/s | +1.5% → | +| | Avg Latency | 3.610 ms | 3.346 ms | 3.297 ms | -1.5% → | +| | p99 Latency | 6.720 ms | 6.325 ms | 6.372 ms | stable | +| Linearizable Read | Throughput | 63,210 ops/s | 71,702 ops/s | 71,918 ops/s | stable | +| | Avg Latency | 3.160 ms | 2.791 ms | 2.781 ms | stable | +| | p99 Latency | 5.810 ms | 5.933 ms | 6.078 ms | stable | +| Lease Read | Throughput | 67,878 ops/s | 72,593 ops/s | 80,449 ops/s | **+10.8%** ✅ | +| | Avg Latency | 2.950 ms | 2.756 ms | 2.493 ms | **-9.5%** ✅ | +| | p99 Latency | 6.200 ms | 5.762 ms | 5.848 ms | stable | +| Eventual Read | Throughput | 91,174 ops/s | 94,956 ops/s | 97,188 ops/s | +2.4% → | +| | Avg Latency | 2.190 ms | 2.103 ms | 2.054 ms | -2.3% → | +| | p99 Latency | 13.970 ms | 9.762 ms | 10.084 ms | stable | +| Hot-Key (10 keys) | Throughput | 74,017 ops/s | 84,863 ops/s | 84,911 ops/s | stable | +| | Avg Latency | 2.700 ms | 2.360 ms | 2.356 ms | stable | +| | p99 Latency | 5.490 ms | 5.602 ms | 5.492 ms | -2.0% → | -_(TBD — not yet collected)_ +**Notes**: + +- **v0.2.5 Standalone is stable vs v0.2.4** — all write and read scenarios within ±2%, confirming ReadActor fast path (#392) is additive and introduces no regressions in Standalone mode. +- **Lease Read: +10.8% throughput / -9.5% avg latency vs v0.2.4** — ReadActor shared infrastructure benefits Standalone mode; gRPC RTT masks the direct SM path, so improvement is smaller than Embedded. +- SC Write shows -18.3% vs v0.2.3 but is stable vs v0.2.4; the latency floor shift (155 µs → 190 µs) was introduced before v0.2.4, not a #392 regression. +- Eventual Read p99 has high run-to-run variance (~±1 ms) due to Mac mini OS scheduler noise under 1000 concurrent clients; the improvement trend from v0.2.3 (13.97 ms) to v0.2.4 (9.76 ms) is the meaningful signal. +- Lease Read round-to-run variance: ~75K–91K across 5 rounds (round 4 reached 91K; other rounds avg ~78K). 5-round avg 80K. --- -## AWS 3-Node Cluster: d-engine v0.2.5 vs v0.2.4 +## AWS 3-Node Cluster: d-engine v0.2.5 vs v0.2.4 / etcd 3.2.0 + +**Hardware**: AWS EC2 c5.2xlarge (8 vCPUs, 16GB RAM, 50GB SSD) × 3 nodes +**Date**: June 2, 2026 | 2 × 5-round average (10 rounds total) | Key/Value: 8 bytes / 256 bytes +**etcd reference**: Official etcd benchmark (GCE, 8 vCPUs + 16GB + SSD × 3 nodes, etcd 3.2.0)² + +![d-engine v0.2.5 vs v0.2.4 Embedded Mode](d-engine_v0.2.5_vs_v0.2.4_embedded_mode.png) + +![d-engine v0.2.5 vs v0.2.4 Standalone Mode](d-engine_v0.2.5_vs_v0.2.4_standalone_mode.png) + +![d-engine v0.2.5 vs etcd 3.2.0](d-engine_comparison_v0.2.5.png) + +### Embedded Mode: v0.2.5 vs v0.2.4 / etcd 3.2.0 + +| **Scenario** | **Metric** | **v0.2.4 (AWS)** | **v0.2.5 (AWS)** | **Δ vs v0.2.4** | **etcd 3.2.0²** | **Δ vs etcd** | +| ------------------- | ----------- | ---------------- | ---------------- | --------------- | --------------- | ------------- | +| Single Client Write | Throughput | 4,398 ops/s | 4,428 ops/s | +0.7% → | 583 ops/s | **+7.6x** ✅ | +| | Avg Latency | 0.227 ms | 0.225 ms | stable | 1.6 ms | **-86%** ✅ | +| | p99 Latency | 0.316 ms | 0.303 ms | -4.1% → | — | — | +| High Conc. Write | Throughput | 110,798 ops/s | 111,618 ops/s | +0.7% → | 44,341 ops/s | **+152%** ✅ | +| | Avg Latency | 0.902 ms | 0.897 ms | stable | 22.0 ms | **-95.9%** ✅ | +| | p99 Latency | 1.063 ms | 1.060 ms | stable | — | — | +| Linearizable Read | Throughput | 327,355 ops/s | 345,872 ops/s | +5.7% → | 141,578 ops/s | **+144%** ✅ | +| | Avg Latency | 0.305 ms | 0.289 ms | -5.2% → | 5.5 ms | **-94.7%** ✅ | +| | p99 Latency | 0.374 ms | 0.348 ms | -7.0% → | — | — | +| Lease Read | Throughput | 341,254 ops/s | 1,231,541 ops/s | **+260.9%** ✅ | —³ | — | +| | Avg Latency | 0.293 ms | 0.005 ms | **-98.3%** ✅ | — | — | +| | p99 Latency | 0.367 ms | 0.018 ms | **-95.1%** ✅ | — | — | +| Eventual Read | Throughput | 363,407 ops/s | 1,235,832 ops/s | **+240.1%** ✅ | 185,758 ops/s | **+6.7x** ✅ | +| | Avg Latency | 0.274 ms | 0.005 ms | **-98.2%** ✅ | 2.2 ms | **-99.8%** ✅ | +| | p99 Latency | 0.343 ms | 0.019 ms | **-94.5%** ✅ | — | — | +| Hot-Key (10 keys) | Throughput | 319,957 ops/s | 346,830 ops/s | **+8.4%** ✅ | —³ | — | +| | Avg Latency | 0.313 ms | 0.288 ms | -8.0% → | — | — | +| | p99 Latency | 0.360 ms | 0.331 ms | -8.1% → | — | — | + +**Key Findings**: + +- **Lease/Eventual Read: ~3.6x throughput improvement vs v0.2.4** — ReadActor fast path (#392) delivers 261%/240% throughput gain and 95%+ latency reduction. On AWS, this is the headline win: zero-channel direct SM reads eliminate all Raft/channel contention. +- **Write performance stable vs v0.2.4** — HC Write +0.7%, SC Write +0.7%, within AWS noise tolerance. +- **Linearizable Read +5.7% vs v0.2.4** — Read-index optimization in ReadActor provides consistent improvement. +- **vs etcd 3.2.0** — Embedded mode outperforms etcd across all comparable metrics: SC Write **+7.6x**, HC Write **+152%**, Lin Read **+144%**, Eventual Read **+6.7x** throughput; avg latency **-86~99%** lower. +- **v0.2.5 vs v0.2.3 baseline** — v0.2.4 had Lease/Eventual regressions vs v0.2.3 (378K/395K). v0.2.5 with #392 ReadActor achieves **+3.3x** vs v0.2.3. + +--- -_(TBD — not yet collected)_ +### Standalone Mode: v0.2.5 vs v0.2.4 / etcd 3.2.0 + +| **Scenario** | **Metric** | **v0.2.4 (AWS)** | **v0.2.5 (AWS)** | **Δ vs v0.2.4** | **etcd 3.2.0²** | **Δ vs etcd** | +| ------------------- | ----------- | ---------------- | ---------------- | --------------- | --------------- | ------------- | +| Single Client Write | Throughput | 2,305 ops/s | 2,095 ops/s | -9.1% ⚠️ | 583 ops/s | **+3.6x** ✅ | +| | Avg Latency | 0.433 ms | 0.480 ms | +10.9% ⚠️ | 1.6 ms | **-70%** ✅ | +| | p99 Latency | 0.316 ms | 0.600 ms | +89.9% ⚠️ | — | — | +| High Conc. Write | Throughput | 59,687 ops/s | 53,338 ops/s | -10.6% ⚠️ | 44,341 ops/s | +20% → | +| | Avg Latency | 0.40 ms | 4.353 ms | +988% ⚠️ | 22.0 ms | **-80.2%** ✅ | +| | p99 Latency | 1.20 ms | 12.923 ms | +977% ⚠️ | — | — | +| Linearizable Read | Throughput | 77,907 ops/s | 80,145 ops/s | +2.9% → | 141,578 ops/s | -43% ⚠️ | +| | Avg Latency | 2.79 ms | 2.495 ms | -10.6% → | 5.5 ms | **-54.6%** ✅ | +| | p99 Latency | 5.93 ms | 5.913 ms | stable | — | — | +| Lease Read | Throughput | 76,144 ops/s | 86,466 ops/s | **+13.6%** ✅ | —³ | — | +| | Avg Latency | 2.76 ms | 2.311 ms | -16.3% ✅ | — | — | +| | p99 Latency | 5.76 ms | 5.957 ms | stable | — | — | +| Eventual Read | Throughput | 170,000 ops/s | 157,358 ops/s | -7.4% ⚠️ | 185,758 ops/s | -15% ⚠️ | +| | Avg Latency | 2.10 ms | 1.539 ms | -26.7% ✅ | 2.2 ms | -30% → | +| | p99 Latency | 9.76 ms | 6.674 ms | **-31.6%** ✅ | — | — | +| Hot-Key (10 keys) | Throughput | 90,609 ops/s | 92,711 ops/s | +2.3% → | —³ | — | +| | Avg Latency | 2.36 ms | 2.154 ms | -8.7% → | — | — | +| | p99 Latency | 5.60 ms | 5.922 ms | +5.8% → | — | — | + +**Key Findings**: + +- **Lease Read +13.6% vs v0.2.4** — ReadActor fast path benefit carries to Standalone mode (ReadActor is shared infrastructure). +- **Eventual Read: Mixed results vs v0.2.4** — Throughput -7.4%, but latency **-26.7%** avg / **-31.6%** p99, indicating improved tail behavior. +- **HC Write regression severe** — Latency spike 0.4ms → 4.4ms; ConnectionTimeout errors observed in raw rounds, suggesting network saturation or TCP pressure on c5.2xlarge under high concurrency. +- **SC Write regression** — -9.1% throughput vs v0.2.4, correlated with HC Write contention overhead. +- **vs etcd 3.2.0** — SC Write **+3.6x** and all latency metrics significantly better; Lin Read throughput below etcd (-43%) but latency -54.6% lower; HC Write and Eventual Read throughput regressions (vs v0.2.4) pull both metrics near or below etcd level. + +² etcd data sourced from [etcd official benchmark documentation](https://etcd.io/docs/v3.6/op-guide/performance/), tested on GCE infrastructure. Different cloud platform; results are for reference only. +³ etcd does not have an equivalent mode. --- ## Key Changes Driving Results -| Change | Impact | -| ---------------------------------------- | ------------------------------------------------------------------------- | -| ReadActor fast path (#392) | Lease/Eventual Read +10.9%/+13.1% vs v0.2.4; bypasses Raft loop entirely | -| ReadLease.revoke() (#392) | Atomic lease invalidation on leader demotion; replaces `invalidate()` | -| Configurable ReadActor (#392) | `read_actor_channel_capacity` and `read_actor_max_drain` in `[raft]` | -| Fix: RocksDB LOCK on stop() (#392) | ReadActor is sole `Arc` holder; LOCK released before Raft shutdown | +| Change | Impact | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------ | +| ReadActor fast path (#392) | Lease/Eventual Read avg latency -94%+ vs v0.2.4; throughput +22.2%/+17.6%; bypasses Raft loop entirely | +| ReadLease.revoke() (#392) | Atomic lease invalidation on leader demotion; replaces `invalidate()` | +| Configurable ReadActor (#392) | `read_actor_channel_capacity` and `read_actor_max_drain` in `[raft]` | +| Fix: RocksDB LOCK on stop() (#392) | ReadActor is sole `Arc` holder; LOCK released before Raft shutdown | --- @@ -79,12 +184,12 @@ _(TBD — not yet collected)_ Four configurations tested to characterize `read_actor_channel_capacity` and `read_actor_max_drain` sensitivity: -| Config | cap / drain / batch | Lease Read | Eventual Read | HC Write | vs v0.2.3 (705K/742K) | -| ------ | ------------------- | ---------- | ------------- | -------- | --------------------- | -| C1 | 1024 / 1000 / 200 | ~790K | ~806K | ~232K | +12% / +9% | -| C2 | 1024 / 1000 / 300 | ~785K | ~803K | ~231K | +11% / +8% | -| C3 | 1024 / 2000 / 200 | ~756K | ~789K | ~227K | +7% / +6% | -| **C4** | **10240 / 2000 / 200** | **~810K** | **~851K** | **~232K** | **+15% / +15%** | +| Config | cap / drain / batch | Lease Read | Eventual Read | HC Write | vs v0.2.3 (705K/742K) | +| ------ | ---------------------- | ---------- | ------------- | --------- | --------------------- | +| C1 | 1024 / 1000 / 200 | ~790K | ~806K | ~232K | +12% / +9% | +| C2 | 1024 / 1000 / 300 | ~785K | ~803K | ~231K | +11% / +8% | +| C3 | 1024 / 2000 / 200 | ~756K | ~789K | ~227K | +7% / +6% | +| **C4** | **10240 / 2000 / 200** | **~810K** | **~851K** | **~232K** | **+15% / +15%** | **Key findings**: diff --git a/benches/reports/v0.2.5/d-engine_comparison_v0.2.5.png b/benches/reports/v0.2.5/d-engine_comparison_v0.2.5.png new file mode 100644 index 0000000000000000000000000000000000000000..48d6aed83cbd92c342fc5798b29b86a00dac6800 GIT binary patch literal 465422 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 SqWC39=BUx#Fpxy@c!{Bk}1LZxuB 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

mN(*ZMjb(m}V%hw`Z=z=$Fzrl` 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�gH8++lwY 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 Xr0dUJ+OOKKIwu|{c8{0O+ literal 0 HcmV?d00001 diff --git a/benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_standalone_mode.png b/benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_standalone_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..bd60e8a43672b7d5602c1298296e6fc7f44378c3 GIT binary patch literal 453026 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%0AObj3WBs^b7x_;KJlu)j7dXLA;mk~D} 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�RLhYLgxee~TKm#<2E_;xO>rwzM$1Ah4#Q|ky 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⪙^9?dc#iTo8Hj73+@LY;j4|uGel~u0a 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

8kgIDev(X)te7PIQqb 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 literal 0 HcmV?d00001 diff --git a/benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_embedded_mode.png b/benches/reports/v0.2.5/d-engine_v0.2.5_vs_v0.2.4_embedded_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..a1851edaaf8136355695e78719603d560c9f793d GIT binary patch literal 458216 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�h*vAa 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