pub type CoreId = u16;
pub type ShardId = u16;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ThreadCoreRequest {
pub core_id: CoreId,
pub shard_count: u16,
}
impl Default for ThreadCoreRequest {
fn default() -> Self {
Self {
core_id: 0,
shard_count: 1,
}
}
}
impl ThreadCoreRequest {
pub fn owned_shard(&self) -> ShardId {
if self.shard_count == 0 {
return 0;
}
self.core_id % self.shard_count
}
}
pub fn shard_for_node(node_id: u64, shard_count: u16) -> ShardId {
if shard_count == 0 {
return 0;
}
(node_id % shard_count as u64) as u16
}
pub fn request_owns_node(request: &ThreadCoreRequest, node_id: u64) -> bool {
shard_for_node(node_id, request.shard_count) == request.owned_shard()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn shard_routing_is_deterministic() {
assert_eq!(shard_for_node(1, 4), 1);
assert_eq!(shard_for_node(2, 4), 2);
assert_eq!(shard_for_node(5, 4), 1);
}
#[test]
fn core_request_maps_to_owned_shard() {
let request = ThreadCoreRequest {
core_id: 5,
shard_count: 4,
};
assert_eq!(request.owned_shard(), 1);
assert!(request_owns_node(&request, 9));
assert!(!request_owns_node(&request, 10));
}
}