node: Don't announce inventory redundantly
Keep track of last announcement timestamp and don't re-announce if it matches.
This commit is contained in:
parent
81f94d0cff
commit
50379548c2
|
|
@ -448,7 +448,7 @@ pub struct Service<D, S, G> {
|
||||||
/// Last time the service routing table was pruned.
|
/// Last time the service routing table was pruned.
|
||||||
last_prune: LocalTime,
|
last_prune: LocalTime,
|
||||||
/// Last time the inventory was announced.
|
/// Last time the inventory was announced.
|
||||||
last_announce: LocalTime,
|
last_inventory: LocalTime,
|
||||||
/// Last timestamp used for announcements.
|
/// Last timestamp used for announcements.
|
||||||
last_timestamp: Timestamp,
|
last_timestamp: Timestamp,
|
||||||
/// Time when the service was initialized, or `None` if it wasn't initialized.
|
/// Time when the service was initialized, or `None` if it wasn't initialized.
|
||||||
|
|
@ -526,7 +526,7 @@ where
|
||||||
last_sync: LocalTime::default(),
|
last_sync: LocalTime::default(),
|
||||||
last_prune: LocalTime::default(),
|
last_prune: LocalTime::default(),
|
||||||
last_timestamp,
|
last_timestamp,
|
||||||
last_announce: LocalTime::default(),
|
last_inventory: LocalTime::default(),
|
||||||
started_at: None, // Updated on initialize.
|
started_at: None, // Updated on initialize.
|
||||||
last_online_at: None, // Updated on initialize.
|
last_online_at: None, // Updated on initialize.
|
||||||
emitter,
|
emitter,
|
||||||
|
|
@ -815,7 +815,7 @@ where
|
||||||
self.outbox.wakeup(SYNC_INTERVAL);
|
self.outbox.wakeup(SYNC_INTERVAL);
|
||||||
self.last_sync = now;
|
self.last_sync = now;
|
||||||
}
|
}
|
||||||
if now - self.last_announce >= ANNOUNCE_INTERVAL {
|
if now - self.last_inventory >= ANNOUNCE_INTERVAL {
|
||||||
trace!(target: "service", "Running 'announce' task...");
|
trace!(target: "service", "Running 'announce' task...");
|
||||||
|
|
||||||
self.announce_inventory();
|
self.announce_inventory();
|
||||||
|
|
@ -1942,10 +1942,7 @@ where
|
||||||
|
|
||||||
let removed = self.db.routing_mut().remove_inventory(rid, &node)?;
|
let removed = self.db.routing_mut().remove_inventory(rid, &node)?;
|
||||||
if removed {
|
if removed {
|
||||||
// Update cached inventory message.
|
self.refresh_and_announce_inventory(now)?;
|
||||||
let inventory = self.inventory()?;
|
|
||||||
self.inventory = gossip::inventory(now, inventory);
|
|
||||||
self.announce_inventory();
|
|
||||||
}
|
}
|
||||||
Ok(removed)
|
Ok(removed)
|
||||||
}
|
}
|
||||||
|
|
@ -1964,14 +1961,21 @@ where
|
||||||
let updated = !updates.is_empty();
|
let updated = !updates.is_empty();
|
||||||
|
|
||||||
if updated {
|
if updated {
|
||||||
let inventory = self.inventory()?;
|
self.refresh_and_announce_inventory(now)?;
|
||||||
|
|
||||||
self.inventory = gossip::inventory(now, inventory);
|
|
||||||
self.announce_inventory();
|
|
||||||
}
|
}
|
||||||
Ok(updated)
|
Ok(updated)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Update cached inventory message, and announce new inventory to peers.
|
||||||
|
fn refresh_and_announce_inventory(&mut self, time: Timestamp) -> Result<(), Error> {
|
||||||
|
let inventory = self.inventory()?;
|
||||||
|
|
||||||
|
self.inventory = gossip::inventory(time, inventory);
|
||||||
|
self.announce_inventory();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Get our local inventory.
|
/// Get our local inventory.
|
||||||
///
|
///
|
||||||
/// A node's inventory is the advertized list of repositories offered by a node.
|
/// A node's inventory is the advertized list of repositories offered by a node.
|
||||||
|
|
@ -2294,10 +2298,14 @@ where
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Announce our inventory to all connected peers.
|
/// Announce our inventory to all connected peers, unless it was already announced.
|
||||||
fn announce_inventory(&mut self) {
|
fn announce_inventory(&mut self) {
|
||||||
// TODO: If we're going to announce soon, skip this.
|
let timestamp = self.inventory.timestamp.to_local_time();
|
||||||
// TODO: If we just announced this exact inventory, also skip.
|
|
||||||
|
if self.last_inventory == timestamp {
|
||||||
|
debug!(target: "service", "Skipping redundant inventory announcement (t={})", self.inventory.timestamp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
let msg = AnnouncementMessage::from(self.inventory.clone());
|
let msg = AnnouncementMessage::from(self.inventory.clone());
|
||||||
|
|
||||||
self.outbox.announce(
|
self.outbox.announce(
|
||||||
|
|
@ -2305,7 +2313,7 @@ where
|
||||||
self.sessions.connected().map(|(_, p)| p),
|
self.sessions.connected().map(|(_, p)| p),
|
||||||
self.db.gossip_mut(),
|
self.db.gossip_mut(),
|
||||||
);
|
);
|
||||||
self.last_announce = self.clock;
|
self.last_inventory = timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prune_routing_entries(&mut self, now: &LocalTime) -> Result<(), routing::Error> {
|
fn prune_routing_entries(&mut self, now: &LocalTime) -> Result<(), routing::Error> {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue