diff --git a/src/reachability.rs b/src/reachability.rs index 0ed46adc47aedd9ff9a5da3cb08da2007e3ded00..ae195fb4f7148520a63857a0c4e702b634231736 100644 --- a/src/reachability.rs +++ b/src/reachability.rs @@ -2,7 +2,7 @@ use crate::storage; use crate::storage::Clusterwide; use crate::storage::PropertyName; use crate::traft::RaftId; -use std::cell::RefCell; +use crate::util::NoYieldsRefCell; use std::collections::HashMap; use std::collections::HashSet; use std::rc::Rc; @@ -18,13 +18,18 @@ use tarantool::time::Instant; /// all known instances. #[derive(Debug, Default)] pub struct InstanceReachabilityManager { - // TODO: Will be used to read configuration from - #[allow(unused)] storage: Option<Clusterwide>, infos: HashMap<RaftId, InstanceReachabilityInfo>, } -pub type InstanceReachabilityManagerRef = Rc<RefCell<InstanceReachabilityManager>>; +pub type InstanceReachabilityManagerRef = Rc<NoYieldsRefCell<InstanceReachabilityManager>>; + +#[inline(always)] +pub fn instance_reachability_manager(storage: Clusterwide) -> InstanceReachabilityManagerRef { + Rc::new(NoYieldsRefCell::new(InstanceReachabilityManager::new( + storage, + ))) +} impl InstanceReachabilityManager { pub fn new(storage: Clusterwide) -> Self { diff --git a/src/traft/node.rs b/src/traft/node.rs index 447ea419fd2a3fa89d8a9dab6657bb7fc5b264dc..2e0b7129f8487328f6db48be3a43745e7545ac82 100644 --- a/src/traft/node.rs +++ b/src/traft/node.rs @@ -12,7 +12,8 @@ use crate::instance::Instance; use crate::kvcell::KVCell; use crate::loop_start; use crate::r#loop::FlowControl; -use crate::reachability::InstanceReachabilityManager; +use crate::reachability::instance_reachability_manager; +use crate::reachability::InstanceReachabilityManagerRef; use crate::rpc; use crate::schema::{Distribution, IndexDef, TableDef}; use crate::sentinel; @@ -67,7 +68,6 @@ use ::tarantool::vclock::Vclock; use protobuf::Message as _; use std::cell::Cell; -use std::cell::RefCell; use std::cmp::Ordering; use std::collections::HashMap; use std::convert::TryFrom; @@ -185,9 +185,7 @@ impl Node { ..Default::default() }; let mut pool = ConnectionPool::new(storage.clone(), opts); - let instance_reachability = Rc::new(RefCell::new(InstanceReachabilityManager::new( - storage.clone(), - ))); + let instance_reachability = instance_reachability_manager(storage.clone()); pool.instance_reachability = instance_reachability.clone(); let pool = Rc::new(pool); @@ -430,7 +428,7 @@ pub(crate) struct NodeImpl { lc: LogicalClock, status: watch::Sender<Status>, applied: watch::Sender<RaftIndex>, - instance_reachability: Rc<RefCell<InstanceReachabilityManager>>, + instance_reachability: InstanceReachabilityManagerRef, } impl NodeImpl {