aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm
diff options
context:
space:
mode:
Diffstat (limited to 'src/swarm')
-rw-r--r--src/swarm/peer/inbound.rs15
-rw-r--r--src/swarm/peer/keepalive.rs6
2 files changed, 19 insertions, 2 deletions
diff --git a/src/swarm/peer/inbound.rs b/src/swarm/peer/inbound.rs
index 28066cb..cfafbd3 100644
--- a/src/swarm/peer/inbound.rs
+++ b/src/swarm/peer/inbound.rs
@@ -68,13 +68,19 @@ pub(crate) async fn handle_message(
// one does). When we heard from it before tells a restarted peer how long it was
// away (in our HELLO_REPLY).
let peer_state = state.get_or_create_peer_state(&peer).await;
+ let mut hello_now = false;
let (reactivated, previously_seen) =
heard_from(state, &peer, &peer_state, Instant::now(), |peer_state| {
- if let Some(run) = run {
- peer_state.returned(run);
+ match run {
+ Some(run) => peer_state.returned(run),
+ // Up and reaching us, while we wait for its HELLO_REPLY.
+ None => hello_now = peer_state.hello_again_now(Instant::now()),
}
})
.await;
+ if hello_now {
+ state.peers_due.now();
+ }
let same_epoch = observe_peer_epoch(state, &peer, epoch, epoch_seq, run).await;
match message {
@@ -83,7 +89,12 @@ pub(crate) async fn handle_message(
// restart. It becomes a member right away; our reply makes us one for it.
let Some(swarm_id) = state.swarm_id().await else {
// We are joining ourselves; the peer retries until we know our swarm.
+ // It is up and reaches us: if we wait for its HELLO_REPLY, our HELLO or
+ // the reply was lost, and ours goes again now.
debug!(peer = %peer, "HELLO before we know our swarm; not answering yet");
+ if peer_state.lock().await.hello_again_now(Instant::now()) {
+ state.peers_due.now();
+ }
return Ok(());
};
if let Some(theirs) = &hello.swarm_id
diff --git a/src/swarm/peer/keepalive.rs b/src/swarm/peer/keepalive.rs
index 0f34eb8..aa34e70 100644
--- a/src/swarm/peer/keepalive.rs
+++ b/src/swarm/peer/keepalive.rs
@@ -84,7 +84,10 @@ pub(super) async fn note_alive(state: &AppState, peer: &str, message: &ParsedMes
return;
};
let ping = matches!(message, ParsedMessage::Ping(_));
+ let mut hello_now = false;
let (reactivated, _) = heard_from(state, peer, &peer_state, now, |peer_state| {
+ // Up and reaching us, while we wait for its HELLO_REPLY.
+ hello_now = peer_state.hello_again_now(now);
if ping {
// Its keepalive (or a path probe): the next is ours.
peer_state.keepalive_received_at = Some(now);
@@ -94,6 +97,9 @@ pub(super) async fn note_alive(state: &AppState, peer: &str, message: &ParsedMes
}
})
.await;
+ if hello_now {
+ state.peers_due.now();
+ }
if reactivated {
ensure_handshake(state, peer).await;
}