95 lines
3.5 KiB
Rust
95 lines
3.5 KiB
Rust
|
|
//! Factory for creating load balancing policies
|
||
|
|
|
||
|
|
use super::{
|
||
|
|
CacheAwareConfig, CacheAwarePolicy, LoadBalancingPolicy, PowerOfTwoPolicy, RandomPolicy,
|
||
|
|
RoundRobinPolicy,
|
||
|
|
};
|
||
|
|
use crate::config::PolicyConfig;
|
||
|
|
use std::sync::Arc;
|
||
|
|
|
||
|
|
/// Factory for creating policy instances
|
||
|
|
pub struct PolicyFactory;
|
||
|
|
|
||
|
|
impl PolicyFactory {
|
||
|
|
/// Create a policy from configuration
|
||
|
|
pub fn create_from_config(config: &PolicyConfig) -> Arc<dyn LoadBalancingPolicy> {
|
||
|
|
match config {
|
||
|
|
PolicyConfig::Random => Arc::new(RandomPolicy::new()),
|
||
|
|
PolicyConfig::RoundRobin => Arc::new(RoundRobinPolicy::new()),
|
||
|
|
PolicyConfig::PowerOfTwo { .. } => Arc::new(PowerOfTwoPolicy::new()),
|
||
|
|
PolicyConfig::CacheAware {
|
||
|
|
cache_threshold,
|
||
|
|
balance_abs_threshold,
|
||
|
|
balance_rel_threshold,
|
||
|
|
eviction_interval_secs,
|
||
|
|
max_tree_size,
|
||
|
|
} => {
|
||
|
|
let config = CacheAwareConfig {
|
||
|
|
cache_threshold: *cache_threshold,
|
||
|
|
balance_abs_threshold: *balance_abs_threshold,
|
||
|
|
balance_rel_threshold: *balance_rel_threshold,
|
||
|
|
eviction_interval_secs: *eviction_interval_secs,
|
||
|
|
max_tree_size: *max_tree_size,
|
||
|
|
};
|
||
|
|
Arc::new(CacheAwarePolicy::with_config(config))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Create a policy by name (for dynamic loading)
|
||
|
|
pub fn create_by_name(name: &str) -> Option<Arc<dyn LoadBalancingPolicy>> {
|
||
|
|
match name.to_lowercase().as_str() {
|
||
|
|
"random" => Some(Arc::new(RandomPolicy::new())),
|
||
|
|
"round_robin" | "roundrobin" => Some(Arc::new(RoundRobinPolicy::new())),
|
||
|
|
"power_of_two" | "poweroftwo" => Some(Arc::new(PowerOfTwoPolicy::new())),
|
||
|
|
"cache_aware" | "cacheaware" => Some(Arc::new(CacheAwarePolicy::new())),
|
||
|
|
_ => None,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[cfg(test)]
|
||
|
|
mod tests {
|
||
|
|
use super::*;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_create_from_config() {
|
||
|
|
// Test Random
|
||
|
|
let policy = PolicyFactory::create_from_config(&PolicyConfig::Random);
|
||
|
|
assert_eq!(policy.name(), "random");
|
||
|
|
|
||
|
|
// Test RoundRobin
|
||
|
|
let policy = PolicyFactory::create_from_config(&PolicyConfig::RoundRobin);
|
||
|
|
assert_eq!(policy.name(), "round_robin");
|
||
|
|
|
||
|
|
// Test PowerOfTwo
|
||
|
|
let policy = PolicyFactory::create_from_config(&PolicyConfig::PowerOfTwo {
|
||
|
|
load_check_interval_secs: 60,
|
||
|
|
});
|
||
|
|
assert_eq!(policy.name(), "power_of_two");
|
||
|
|
|
||
|
|
// Test CacheAware
|
||
|
|
let policy = PolicyFactory::create_from_config(&PolicyConfig::CacheAware {
|
||
|
|
cache_threshold: 0.7,
|
||
|
|
balance_abs_threshold: 10,
|
||
|
|
balance_rel_threshold: 1.5,
|
||
|
|
eviction_interval_secs: 30,
|
||
|
|
max_tree_size: 1000,
|
||
|
|
});
|
||
|
|
assert_eq!(policy.name(), "cache_aware");
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_create_by_name() {
|
||
|
|
assert!(PolicyFactory::create_by_name("random").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("RANDOM").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("round_robin").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("RoundRobin").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("power_of_two").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("PowerOfTwo").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("cache_aware").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("CacheAware").is_some());
|
||
|
|
assert!(PolicyFactory::create_by_name("unknown").is_none());
|
||
|
|
}
|
||
|
|
}
|