From c0c764377cafa98864b690475a12f4ea113753fa Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 4 Jun 2021 15:54:00 +0000 Subject: [PATCH] excludes caller's crds values from pull responses (#17542) (#17744) If the crds entry belongs to the caller itself, then the caller will always have the more recent version of it, regardless of it being filtered out by the bloom filter or not. The exception is node-instance types which are meant to detect duplicate running instances, and those are exempted. (cherry picked from commit 7cf6e66ddd023fb8976177251bd1a672555e26dc) Co-authored-by: behzad nouri --- gossip/src/crds_gossip_pull.rs | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/gossip/src/crds_gossip_pull.rs b/gossip/src/crds_gossip_pull.rs index d01e8887d2..8b5b1cad70 100644 --- a/gossip/src/crds_gossip_pull.rs +++ b/gossip/src/crds_gossip_pull.rs @@ -13,7 +13,7 @@ use { crate::{ cluster_info::{Ping, CRDS_UNIQUE_PUBKEY_CAPACITY}, contact_info::ContactInfo, - crds::Crds, + crds::{Crds, VersionedCrdsValue}, crds_gossip::{get_stake, get_weight}, crds_gossip_error::CrdsGossipError, crds_value::CrdsValue, @@ -499,21 +499,24 @@ impl CrdsGossipPull { dropped_requests += 1; return Some(vec![]); } + let caller_pubkey = caller.pubkey(); let caller_wallclock = caller_wallclock.checked_add(jitter).unwrap_or(0); + let pred = |entry: &&VersionedCrdsValue| { + debug_assert!(filter.test_mask(&entry.value_hash)); + // Skip values that are too new. + if entry.value.wallclock() > caller_wallclock { + total_skipped += 1; + false + } else { + !filter.filter_contains(&entry.value_hash) + && (entry.value.pubkey() != caller_pubkey + || entry.value.should_force_push(&caller_pubkey)) + } + }; let out: Vec<_> = crds .filter_bitmask(filter.mask, filter.mask_bits) - .filter_map(|item| { - debug_assert!(filter.test_mask(&item.value_hash)); - //skip values that are too new - if item.value.wallclock() > caller_wallclock { - total_skipped += 1; - None - } else if filter.filter_contains(&item.value_hash) { - None - } else { - Some(item.value.clone()) - } - }) + .filter(pred) + .map(|entry| entry.value.clone()) .take(output_size_limit) .collect(); output_size_limit -= out.len();