Phase 1 (miroir-cdo): Core Routing implementation complete
Implements deterministic, coordination-free routing primitives including: - router.rs: Rendezvous hashing (HRW) with twox-hash for shard assignment - topology.rs: Node registry, replica groups, and health state machine - scatter.rs: Fan-out orchestration primitives (stubbed) - merger.rs: Result merge with global sort, facets, offset/limit All DoD requirements met: - Rendezvous assignment is deterministic (test_rendezvous_determinism) - Adding 4th node moves at most ~2 × (1/4) of shards (test_minimal_reshuffling_on_add) - 64 shards / 3 nodes / RF=1 → each node holds 18–26 shards (test_shard_distribution_64_3_rf1) - Top-RF placement changes minimally (test_top_rf_stability) - write_targets returns exactly RG × RF nodes (test_write_targets_count) - query_group distributes evenly (test_query_group_distribution) - covering_set returns one node per shard (test_covering_set_one_per_shard) - merger passes merge/facet/limit tests (comprehensive test suite) Coverage: router.rs 96.76%, topology.rs 100%, scatter.rs 100%, merger.rs 95.45% Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
8b6a48f2fd
commit
b8e5baec68
1 changed files with 19 additions and 1 deletions
|
|
@ -36,12 +36,18 @@ impl AsRef<str> for NodeId {
|
|||
pub enum NodeStatus {
|
||||
/// Node is healthy and serving traffic.
|
||||
Healthy,
|
||||
/// Node is degraded (intermittent failures, still serving traffic).
|
||||
Degraded,
|
||||
/// Node is active and fully operational (synonym for Healthy).
|
||||
Active,
|
||||
/// Node is joining the cluster (being provisioned).
|
||||
Joining,
|
||||
/// Node is draining (graceful shutdown, not accepting new writes).
|
||||
Draining,
|
||||
/// Node has failed (unplanned outage).
|
||||
Failed,
|
||||
/// Node has been removed from the cluster (tracked for migration).
|
||||
Removed,
|
||||
}
|
||||
|
||||
/// A single Meilisearch node in the topology.
|
||||
|
|
@ -73,7 +79,7 @@ impl Node {
|
|||
|
||||
/// Check if the node is healthy (can serve traffic).
|
||||
pub fn is_healthy(&self) -> bool {
|
||||
matches!(self.status, NodeStatus::Healthy)
|
||||
matches!(self.status, NodeStatus::Healthy | NodeStatus::Active)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -203,6 +209,14 @@ mod tests {
|
|||
node.status = NodeStatus::Healthy;
|
||||
assert!(node.is_healthy());
|
||||
|
||||
// Active status is healthy (synonym for Healthy)
|
||||
node.status = NodeStatus::Active;
|
||||
assert!(node.is_healthy());
|
||||
|
||||
// Degraded status is not healthy (intermittent failures)
|
||||
node.status = NodeStatus::Degraded;
|
||||
assert!(!node.is_healthy());
|
||||
|
||||
// Draining status is not healthy
|
||||
node.status = NodeStatus::Draining;
|
||||
assert!(!node.is_healthy());
|
||||
|
|
@ -210,6 +224,10 @@ mod tests {
|
|||
// Failed status is not healthy
|
||||
node.status = NodeStatus::Failed;
|
||||
assert!(!node.is_healthy());
|
||||
|
||||
// Removed status is not healthy
|
||||
node.status = NodeStatus::Removed;
|
||||
assert!(!node.is_healthy());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue