removes RwLock on ClusterInfo.instance
This commit is contained in:
parent
542198180a
commit
895d7d6a65
|
@ -300,7 +300,7 @@ pub struct ClusterInfo {
|
||||||
socket: UdpSocket,
|
socket: UdpSocket,
|
||||||
local_message_pending_push_queue: RwLock<Vec<(CrdsValue, u64)>>,
|
local_message_pending_push_queue: RwLock<Vec<(CrdsValue, u64)>>,
|
||||||
contact_debug_interval: u64,
|
contact_debug_interval: u64,
|
||||||
instance: RwLock<NodeInstance>,
|
instance: NodeInstance,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ClusterInfo {
|
impl Default for ClusterInfo {
|
||||||
|
@ -557,7 +557,7 @@ impl ClusterInfo {
|
||||||
socket: UdpSocket::bind("0.0.0.0:0").unwrap(),
|
socket: UdpSocket::bind("0.0.0.0:0").unwrap(),
|
||||||
local_message_pending_push_queue: RwLock::new(vec![]),
|
local_message_pending_push_queue: RwLock::new(vec![]),
|
||||||
contact_debug_interval: DEFAULT_CONTACT_DEBUG_INTERVAL,
|
contact_debug_interval: DEFAULT_CONTACT_DEBUG_INTERVAL,
|
||||||
instance: RwLock::new(NodeInstance::new(id, timestamp())),
|
instance: NodeInstance::new(id, timestamp()),
|
||||||
};
|
};
|
||||||
{
|
{
|
||||||
let mut gossip = me.gossip.write().unwrap();
|
let mut gossip = me.gossip.write().unwrap();
|
||||||
|
@ -592,7 +592,7 @@ impl ClusterInfo {
|
||||||
.clone(),
|
.clone(),
|
||||||
),
|
),
|
||||||
contact_debug_interval: self.contact_debug_interval,
|
contact_debug_interval: self.contact_debug_interval,
|
||||||
instance: RwLock::new(NodeInstance::new(*new_id, timestamp())),
|
instance: NodeInstance::new(*new_id, timestamp()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,10 +617,9 @@ impl ClusterInfo {
|
||||||
) {
|
) {
|
||||||
let now = timestamp();
|
let now = timestamp();
|
||||||
self.my_contact_info.write().unwrap().wallclock = now;
|
self.my_contact_info.write().unwrap().wallclock = now;
|
||||||
self.instance.write().unwrap().update_wallclock(now);
|
|
||||||
let entries: Vec<_> = vec![
|
let entries: Vec<_> = vec![
|
||||||
CrdsData::ContactInfo(self.my_contact_info()),
|
CrdsData::ContactInfo(self.my_contact_info()),
|
||||||
CrdsData::NodeInstance(self.instance.read().unwrap().clone()),
|
CrdsData::NodeInstance(self.instance.with_wallclock(now)),
|
||||||
]
|
]
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|v| CrdsValue::new_signed(v, &self.keypair))
|
.map(|v| CrdsValue::new_signed(v, &self.keypair))
|
||||||
|
@ -1811,7 +1810,7 @@ impl ClusterInfo {
|
||||||
let recycler = PacketsRecycler::default();
|
let recycler = PacketsRecycler::default();
|
||||||
let crds_data = vec![
|
let crds_data = vec![
|
||||||
CrdsData::Version(Version::new(self.id())),
|
CrdsData::Version(Version::new(self.id())),
|
||||||
CrdsData::NodeInstance(self.instance.read().unwrap().clone()),
|
CrdsData::NodeInstance(self.instance.with_wallclock(timestamp())),
|
||||||
];
|
];
|
||||||
for value in crds_data {
|
for value in crds_data {
|
||||||
let value = CrdsValue::new_signed(value, &self.keypair);
|
let value = CrdsValue::new_signed(value, &self.keypair);
|
||||||
|
@ -2530,10 +2529,9 @@ impl ClusterInfo {
|
||||||
});
|
});
|
||||||
// Check if there is a duplicate instance of
|
// Check if there is a duplicate instance of
|
||||||
// this node with more recent timestamp.
|
// this node with more recent timestamp.
|
||||||
let self_instance = self.instance.read().unwrap().clone();
|
|
||||||
let check_duplicate_instance = |values: &[CrdsValue]| {
|
let check_duplicate_instance = |values: &[CrdsValue]| {
|
||||||
for value in values {
|
for value in values {
|
||||||
if self_instance.check_duplicate(value) {
|
if self.instance.check_duplicate(value) {
|
||||||
return Err(Error::DuplicateNodeInstance);
|
return Err(Error::DuplicateNodeInstance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -343,9 +343,11 @@ impl NodeInstance {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_wallclock(&mut self, now: u64) {
|
// Clones the value with an updated wallclock.
|
||||||
if self.wallclock < now {
|
pub fn with_wallclock(&self, now: u64) -> Self {
|
||||||
self.wallclock = now;
|
Self {
|
||||||
|
wallclock: now,
|
||||||
|
..*self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -896,6 +898,18 @@ mod test {
|
||||||
timestamp: now - 1,
|
timestamp: now - 1,
|
||||||
token: rng.gen(),
|
token: rng.gen(),
|
||||||
})));
|
})));
|
||||||
|
// Updated wallclock is not a duplicate.
|
||||||
|
let other = node.with_wallclock(now + 8);
|
||||||
|
assert_eq!(
|
||||||
|
other,
|
||||||
|
NodeInstance {
|
||||||
|
from: pubkey,
|
||||||
|
wallclock: now + 8,
|
||||||
|
timestamp: now,
|
||||||
|
token: node.token,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert!(!node.check_duplicate(&make_crds_value(other)));
|
||||||
// Duplicate instance.
|
// Duplicate instance.
|
||||||
assert!(node.check_duplicate(&make_crds_value(NodeInstance {
|
assert!(node.check_duplicate(&make_crds_value(NodeInstance {
|
||||||
from: pubkey,
|
from: pubkey,
|
||||||
|
|
Loading…
Reference in New Issue