feat: change how region id maps to region worker (#3384)

* feat: change how region id maps to region worker

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* add overflow test

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

---------

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
This commit is contained in:
Ruihang Xia
2024-02-26 16:42:29 +08:00
committed by GitHub
parent 26011ed0b6
commit ce397ebcc6

View File

@@ -25,8 +25,6 @@ mod handle_open;
mod handle_truncate;
mod handle_write;
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::time::Duration;
@@ -207,10 +205,7 @@ impl WorkerGroup {
/// Get worker for specific `region_id`.
fn worker(&self, region_id: RegionId) -> &RegionWorker {
let mut hasher = DefaultHasher::new();
region_id.hash(&mut hasher);
let value = hasher.finish() as usize;
let index = value_to_index(value, self.workers.len());
let index = region_id_to_index(region_id, self.workers.len());
&self.workers[index]
}
@@ -278,8 +273,9 @@ impl WorkerGroup {
}
}
fn value_to_index(value: usize, num_workers: usize) -> usize {
value % num_workers
fn region_id_to_index(id: RegionId, num_workers: usize) -> usize {
((id.table_id() as usize % num_workers) + (id.region_number() as usize % num_workers))
% num_workers
}
async fn write_cache_from_config(
@@ -770,16 +766,16 @@ mod tests {
use crate::test_util::TestEnv;
#[test]
fn test_value_to_index() {
let num_workers = 1;
for i in 0..10 {
assert_eq!(0, value_to_index(i, num_workers));
}
fn test_region_id_to_index() {
let num_workers = 4;
for i in 0..10 {
assert_eq!(i % 4, value_to_index(i, num_workers));
}
let region_id = RegionId::new(1, 2);
let index = region_id_to_index(region_id, num_workers);
assert_eq!(index, 3);
let region_id = RegionId::new(2, 3);
let index = region_id_to_index(region_id, num_workers);
assert_eq!(index, 1);
}
#[tokio::test]