uses Mutex instead of RwLock for ping_cache
This commit is contained in:
parent
d94e4ef7c9
commit
2231017b35
|
@ -211,7 +211,7 @@ pub struct ClusterInfo {
|
||||||
entrypoints: RwLock<Vec<ContactInfo>>,
|
entrypoints: RwLock<Vec<ContactInfo>>,
|
||||||
outbound_budget: DataBudget,
|
outbound_budget: DataBudget,
|
||||||
my_contact_info: RwLock<ContactInfo>,
|
my_contact_info: RwLock<ContactInfo>,
|
||||||
ping_cache: RwLock<PingCache>,
|
ping_cache: Mutex<PingCache>,
|
||||||
id: Pubkey,
|
id: Pubkey,
|
||||||
stats: GossipStats,
|
stats: GossipStats,
|
||||||
socket: UdpSocket,
|
socket: UdpSocket,
|
||||||
|
@ -478,7 +478,7 @@ impl ClusterInfo {
|
||||||
entrypoints: RwLock::new(vec![]),
|
entrypoints: RwLock::new(vec![]),
|
||||||
outbound_budget: DataBudget::default(),
|
outbound_budget: DataBudget::default(),
|
||||||
my_contact_info: RwLock::new(contact_info),
|
my_contact_info: RwLock::new(contact_info),
|
||||||
ping_cache: RwLock::new(PingCache::new(
|
ping_cache: Mutex::new(PingCache::new(
|
||||||
GOSSIP_PING_CACHE_TTL,
|
GOSSIP_PING_CACHE_TTL,
|
||||||
GOSSIP_PING_CACHE_CAPACITY,
|
GOSSIP_PING_CACHE_CAPACITY,
|
||||||
)),
|
)),
|
||||||
|
@ -513,7 +513,7 @@ impl ClusterInfo {
|
||||||
entrypoints: RwLock::new(self.entrypoints.read().unwrap().clone()),
|
entrypoints: RwLock::new(self.entrypoints.read().unwrap().clone()),
|
||||||
outbound_budget: self.outbound_budget.clone_non_atomic(),
|
outbound_budget: self.outbound_budget.clone_non_atomic(),
|
||||||
my_contact_info: RwLock::new(my_contact_info),
|
my_contact_info: RwLock::new(my_contact_info),
|
||||||
ping_cache: RwLock::new(self.ping_cache.read().unwrap().mock_clone()),
|
ping_cache: Mutex::new(self.ping_cache.lock().unwrap().mock_clone()),
|
||||||
id: *new_id,
|
id: *new_id,
|
||||||
stats: GossipStats::default(),
|
stats: GossipStats::default(),
|
||||||
socket: UdpSocket::bind("0.0.0.0:0").unwrap(),
|
socket: UdpSocket::bind("0.0.0.0:0").unwrap(),
|
||||||
|
@ -2047,7 +2047,7 @@ impl ClusterInfo {
|
||||||
{
|
{
|
||||||
let mut cache = HashMap::<(Pubkey, SocketAddr), bool>::new();
|
let mut cache = HashMap::<(Pubkey, SocketAddr), bool>::new();
|
||||||
let mut pingf = move || Ping::new_rand(&mut rng, &self.keypair).ok();
|
let mut pingf = move || Ping::new_rand(&mut rng, &self.keypair).ok();
|
||||||
let mut ping_cache = self.ping_cache.write().unwrap();
|
let mut ping_cache = self.ping_cache.lock().unwrap();
|
||||||
let mut hard_check = move |node| {
|
let mut hard_check = move |node| {
|
||||||
let (check, ping) = ping_cache.check(now, node, &mut pingf);
|
let (check, ping) = ping_cache.check(now, node, &mut pingf);
|
||||||
if let Some(ping) = ping {
|
if let Some(ping) = ping {
|
||||||
|
@ -2388,7 +2388,7 @@ impl ClusterInfo {
|
||||||
let _st = ScopedTimer::from(&self.stats.handle_batch_pong_messages_time);
|
let _st = ScopedTimer::from(&self.stats.handle_batch_pong_messages_time);
|
||||||
let mut pongs = pongs.into_iter().peekable();
|
let mut pongs = pongs.into_iter().peekable();
|
||||||
if pongs.peek().is_some() {
|
if pongs.peek().is_some() {
|
||||||
let mut ping_cache = self.ping_cache.write().unwrap();
|
let mut ping_cache = self.ping_cache.lock().unwrap();
|
||||||
for (addr, pong) in pongs {
|
for (addr, pong) in pongs {
|
||||||
ping_cache.add(&pong, addr, now);
|
ping_cache.add(&pong, addr, now);
|
||||||
}
|
}
|
||||||
|
@ -3199,7 +3199,7 @@ mod tests {
|
||||||
.take(128)
|
.take(128)
|
||||||
.collect();
|
.collect();
|
||||||
let pings: Vec<_> = {
|
let pings: Vec<_> = {
|
||||||
let mut ping_cache = cluster_info.ping_cache.write().unwrap();
|
let mut ping_cache = cluster_info.ping_cache.lock().unwrap();
|
||||||
let mut pingf = || Ping::new_rand(&mut rng, &this_node).ok();
|
let mut pingf = || Ping::new_rand(&mut rng, &this_node).ok();
|
||||||
remote_nodes
|
remote_nodes
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -3222,7 +3222,7 @@ mod tests {
|
||||||
cluster_info.handle_batch_pong_messages(pongs, now);
|
cluster_info.handle_batch_pong_messages(pongs, now);
|
||||||
// Assert that remote nodes now pass the ping/pong check.
|
// Assert that remote nodes now pass the ping/pong check.
|
||||||
{
|
{
|
||||||
let mut ping_cache = cluster_info.ping_cache.write().unwrap();
|
let mut ping_cache = cluster_info.ping_cache.lock().unwrap();
|
||||||
for (keypair, socket) in &remote_nodes {
|
for (keypair, socket) in &remote_nodes {
|
||||||
let node = (keypair.pubkey(), *socket);
|
let node = (keypair.pubkey(), *socket);
|
||||||
let (check, _) = ping_cache.check(now, node, || -> Option<Ping> { None });
|
let (check, _) = ping_cache.check(now, node, || -> Option<Ping> { None });
|
||||||
|
@ -3231,7 +3231,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
// Assert that a new random remote node still will not pass the check.
|
// Assert that a new random remote node still will not pass the check.
|
||||||
{
|
{
|
||||||
let mut ping_cache = cluster_info.ping_cache.write().unwrap();
|
let mut ping_cache = cluster_info.ping_cache.lock().unwrap();
|
||||||
let (keypair, socket) = new_rand_remote_node(&mut rng);
|
let (keypair, socket) = new_rand_remote_node(&mut rng);
|
||||||
let node = (keypair.pubkey(), socket);
|
let node = (keypair.pubkey(), socket);
|
||||||
let (check, _) = ping_cache.check(now, node, || -> Option<Ping> { None });
|
let (check, _) = ping_cache.check(now, node, || -> Option<Ping> { None });
|
||||||
|
|
Loading…
Reference in New Issue