Skip to content

Commit 341f115

Browse files
fix: break infinite loop when consensus channels are dropped
1 parent 6c306c9 commit 341f115

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

core/src/client/node.rs

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,34 +59,45 @@ impl<N: NetworkSpec, C: Consensus<N::BlockResponse>, E: ExecutionProvider<N>> No
5959
loop {
6060
select! {
6161
block = block_recv.recv() => {
62-
if let Some(block) = block {
63-
let block_number = block.header().number();
64-
let timestamp = block.header().timestamp();
62+
match block {
63+
Some(block) => {
64+
let block_number = block.header().number();
65+
let timestamp = block.header().timestamp();
6566

66-
// Calculate age of the block
67-
let current_time = SystemTime::now()
68-
.duration_since(UNIX_EPOCH)
69-
.unwrap_or_default()
70-
.as_secs();
67+
// Calculate age of the block
68+
let current_time = SystemTime::now()
69+
.duration_since(UNIX_EPOCH)
70+
.unwrap_or_default()
71+
.as_secs();
7172

72-
let age = current_time.saturating_sub(timestamp);
73+
let age = current_time.saturating_sub(timestamp);
7374

74-
info!(
75-
target: "helios::client",
76-
"latest block number={} age={}s",
77-
block_number,
78-
age
79-
);
75+
info!(
76+
target: "helios::client",
77+
"latest block number={} age={}s",
78+
block_number,
79+
age
80+
);
8081

81-
execution_ref.push_block(
82-
block.clone(),
83-
BlockId::Number(BlockNumberOrTag::Latest)
84-
).await;
82+
execution_ref.push_block(
83+
block.clone(),
84+
BlockId::Number(BlockNumberOrTag::Latest)
85+
).await;
8586

86-
_ = block_broadcast_ref.send(SubscriptionEvent::NewHeads(block));
87+
_ = block_broadcast_ref.send(SubscriptionEvent::NewHeads(block));
88+
}
89+
None => {
90+
// Sender dropped, consensus task has exited - client is no longer usable
91+
warn!(target: "helios::client", "consensus client stopped, shut Helios down manually");
92+
break;
93+
}
8794
}
8895
},
89-
_ = finalized_block_recv.changed() => {
96+
finalized_changed = finalized_block_recv.changed() => {
97+
if finalized_changed.is_err() {
98+
warn!(target: "helios::client", "consensus client stopped, shut Helios down manually");
99+
break;
100+
}
90101
let block = finalized_block_recv.borrow_and_update().clone();
91102
if let Some(block) = block {
92103
let block_number = block.header().number();

0 commit comments

Comments
 (0)