Skip to main content

cdrs_tokio/
load_balancing.rs

1mod initializing_wrapper;
2pub mod node_distance_evaluator;
3mod random;
4mod request;
5mod round_robin;
6mod topology_aware;
7
8pub(crate) use self::initializing_wrapper::InitializingWrapperLoadBalancingStrategy;
9pub use self::random::RandomLoadBalancingStrategy;
10pub use self::request::Request;
11pub use self::round_robin::RoundRobinLoadBalancingStrategy;
12pub use self::topology_aware::TopologyAwareLoadBalancingStrategy;
13use crate::cluster::topology::Node;
14use crate::cluster::{ClusterMetadata, ConnectionManager};
15use crate::transport::CdrsTransport;
16use derive_more::Constructor;
17use std::sync::Arc;
18
19#[derive(Debug, Constructor, Default)]
20pub struct QueryPlan<T: CdrsTransport + 'static, CM: ConnectionManager<T> + 'static> {
21    pub nodes: Vec<Arc<Node<T, CM>>>,
22}
23
24impl<T: CdrsTransport, CM: ConnectionManager<T>> Clone for QueryPlan<T, CM> {
25    fn clone(&self) -> Self {
26        QueryPlan::new(self.nodes.clone())
27    }
28}
29
30/// Load balancing strategy, usually used for managing target node connections.
31pub trait LoadBalancingStrategy<T: CdrsTransport, CM: ConnectionManager<T>> {
32    /// Returns query plan for given request.  If no request is given, return a generic plan for
33    /// establishing connection(s) to node(s).
34    fn query_plan(
35        &self,
36        request: Option<Request>,
37        cluster: &ClusterMetadata<T, CM>,
38    ) -> QueryPlan<T, CM>;
39}