Skip to content

Commit 30ebc8d

Browse files
committed
fix: correctly handle disconnect from only peer
1 parent 212ca55 commit 30ebc8d

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

modules/peer_network_interface/src/chain_state.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ impl ChainState {
192192
}
193193
}
194194

195+
pub fn clear_preferred_upstream(&mut self) {
196+
self.preferred_upstream = None;
197+
}
198+
195199
pub fn next_unpublished_block(&self) -> Option<(&Header, &[u8], bool)> {
196200
let (slot, hash) = self.unpublished_blocks.front()?;
197201
let slot_blocks = self.blocks.get(slot)?;

modules/peer_network_interface/src/network.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -177,11 +177,13 @@ impl NetworkManager {
177177
};
178178
warn!("disconnected from {}", peer.conn.address);
179179
let was_preferred = self.chain.preferred_upstream.is_some_and(|i| i == id);
180-
if was_preferred && let Some(new_preferred) = self.peers.keys().next().copied() {
181-
self.set_preferred_upstream(new_preferred);
182-
}
183-
if self.peers.is_empty() {
184-
warn!("no upstream peers!");
180+
if was_preferred {
181+
if let Some(new_preferred) = self.peers.keys().next().copied() {
182+
self.set_preferred_upstream(new_preferred);
183+
} else {
184+
warn!("no upstream peers!");
185+
self.clear_preferred_upstream();
186+
}
185187
}
186188
for (requested_hash, requested_slot) in peer.reqs {
187189
let announcers = self.chain.block_announcers(requested_slot, requested_hash);
@@ -214,6 +216,10 @@ impl NetworkManager {
214216
self.chain.handle_new_preferred_upstream(id);
215217
}
216218

219+
fn clear_preferred_upstream(&mut self) {
220+
self.chain.clear_preferred_upstream();
221+
}
222+
217223
async fn publish_blocks(&mut self) -> Result<()> {
218224
while let Some((header, body, rolled_back)) = self.chain.next_unpublished_block() {
219225
self.block_sink.announce(header, body, rolled_back).await?;

0 commit comments

Comments
 (0)