pub fn validate_token_coverage(peers: &[Peer]) -> Result<(), TokenCoverageError>Expand description
Validate that every (dc, rack) in peers produces a usable
ring under crate::cluster::vnode::dispatch semantics.
The check is per-rack: a fault in DC2 still rejects even if
DC1 is fully populated, because the dispatcher walks each
rack independently when planning ([collect_routable]
pushes one entry per (dc, rack)).
Returns the first fault encountered. The traversal order is
the natural BTreeMap order over (dc, rack) strings, which
is stable across runs given identical input.
§Errors
TokenCoverageError::EmptyRackif any(dc, rack)contributes zero tokens.TokenCoverageError::Overlapif two peers in the same rack claim the same token value.
§Examples
use dynomite::cluster::coverage::{validate_token_coverage, TokenCoverageError};
use dynomite::cluster::peer::{Peer, PeerEndpoint};
use dynomite::hashkit::DynToken;
let a = Peer::new(
0, PeerEndpoint::tcp("a".into(), 8101),
"r".into(), "d".into(),
vec![DynToken::from_u32(7)], true, true, false,
);
let b = Peer::new(
1, PeerEndpoint::tcp("b".into(), 8101),
"r".into(), "d".into(),
vec![DynToken::from_u32(7)], false, true, false,
);
assert!(matches!(
validate_token_coverage(&[a, b]),
Err(TokenCoverageError::Overlap { .. })
));