use super::DIST_RANGE_SLOT_COUNT_DEFAULT;
#[derive(Clone, Debug, Default)]
pub struct Range {
slot: u64,
interval: u64,
shards: usize,
}
impl Range {
pub fn from(slot: Option<u64>, shards: usize) -> Self {
let slot = slot.unwrap_or(DIST_RANGE_SLOT_COUNT_DEFAULT);
assert!(shards > 0 && slot >= shards as u64);
Range {
slot,
interval: slot / shards as u64,
shards,
}
}
pub fn index(&self, hash: i64) -> usize {
let mut val = hash
.wrapping_div(self.slot as i64)
.wrapping_rem(self.slot as i64);
if val < 0 {
tracing::warn!("found negative crc range pre hash:{:?}", val);
val = val.wrapping_abs();
}
let rs = val as u64 / self.interval;
if rs >= self.shards as u64 {
tracing::warn!(
"found range slot out of bound, rs:{}, shards:{}",
rs,
self.shards
);
return self.shards - 1;
}
rs as usize
}
}