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);