pub struct ServerPool { /* private fields */ }Expand description
Cluster-wide owner.
Holds the topology (datacenters, racks), the peer list (peer index 0 is always the local node, mirroring the reference engine), and the per-peer auto-eject decision state.
peers and datacenters live behind RwLocks so the
dispatcher can hold a read lock while gossip occasionally
upgrades to write.
§Examples
use dynomite::cluster::pool::{PoolConfig, ServerPool};
use dynomite::cluster::peer::{Peer, PeerEndpoint};
use dynomite::hashkit::DynToken;
let cfg = PoolConfig {
dc: "dc1".into(),
rack: "r1".into(),
..PoolConfig::default()
};
let local = Peer::new(
0, PeerEndpoint::tcp("127.0.0.1".into(), 8101), "r1".into(), "dc1".into(),
vec![DynToken::from_u32(1)], true, true, false,
);
let pool = ServerPool::new(cfg, vec![local]);
assert_eq!(pool.peers().read().len(), 1);Implementations§
Source§impl ServerPool
impl ServerPool
Sourcepub fn new(config: PoolConfig, peers: Vec<Peer>) -> Self
pub fn new(config: PoolConfig, peers: Vec<Peer>) -> Self
Build a fresh pool from a PoolConfig and an initial peer
list (peer index 0 is the local node).
Datacenters and racks are populated automatically from the
supplied peers; their continuum is rebuilt by
ServerPool::rebuild_ring.
§Examples
use dynomite::cluster::pool::{PoolConfig, ServerPool};
let pool = ServerPool::new(cfg, vec![local]);
pool.rebuild_ring();
assert_eq!(pool.datacenters().read().len(), 1);Sourcepub fn config(&self) -> &PoolConfig
pub fn config(&self) -> &PoolConfig
Configuration block.
Sourcepub fn datacenters(&self) -> &RwLock<Vec<Datacenter>>
pub fn datacenters(&self) -> &RwLock<Vec<Datacenter>>
Borrow the datacenter list.
Sourcepub fn auto_eject(&self) -> &RwLock<Vec<AutoEject>>
pub fn auto_eject(&self) -> &RwLock<Vec<AutoEject>>
Borrow the per-peer auto-eject deciders.
Sourcepub fn rebuild_ring(&self)
pub fn rebuild_ring(&self)
Rebuild the per-rack token continuum from the current peer
table. Mirrors vnode_update. When the configured
distribution is
crate::conf::Distribution::RandomSlicing, a
crate::hashkit::random_slicing::RandomSlices table is
installed on each rack alongside the continuum so the
shadow-distribution path can still walk the vnode view.
Sourcepub fn preselect_remote_racks(&self)
pub fn preselect_remote_racks(&self)
Walk the datacenters and choose, for each remote DC, a rack
for cross-DC replication. Mirrors
preselect_remote_rack_for_replication.
Sourcepub fn init_response_mgrs(&self, req: &Msg) -> Vec<ResponseMgr>
pub fn init_response_mgrs(&self, req: &Msg) -> Vec<ResponseMgr>
Initialise a per-DC crate::msg::ResponseMgr vector for
the supplied request. The walker visits every datacenter
and produces one manager per DC sized to the rack count.
Mirrors init_response_mgr_all_dcs.
§Examples
let pool = ServerPool::new(cfg, vec![local]);
let req = Msg::new(1, MsgType::ReqRedisGet, true);
let mgrs = pool.init_response_mgrs(&req);
assert_eq!(mgrs.len(), 1);Trait Implementations§
Auto Trait Implementations§
impl Freeze for ServerPool
impl !RefUnwindSafe for ServerPool
impl Send for ServerPool
impl Sync for ServerPool
impl Unpin for ServerPool
impl UnsafeUnpin for ServerPool
impl !UnwindSafe for ServerPool
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.