From 522e00f48df759ae812c18e656e3a7797bc3f83c Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Sat, 28 Jun 2025 05:01:46 +1000 Subject: [PATCH] Fix incorrect `waker` update condition (#7656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This bug was first found and partially fixed by @VolodymyrBg in #7317 - this PR applies the same fix everywhere else. The old logic updated the waker when it already matched the context, and did nothing when it was stale: ```rust if waker.will_wake(cx.waker()) { self.waker = Some(cx.waker().clone()); } ``` This is the wrong way around. We only want to update the waker if it doesn't match the current context: ```rust if !waker.will_wake(cx.waker()) { self.waker = Some(cx.waker().clone()); } ``` I don't think we've ever noticed any issues, but it’s a subtle bug that could lead to missed wakeups. --- beacon_node/lighthouse_network/src/rpc/handler.rs | 2 +- beacon_node/network/src/subnet_service/attestation_subnets.rs | 2 +- beacon_node/network/src/subnet_service/mod.rs | 2 +- beacon_node/network/src/subnet_service/sync_subnets.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/beacon_node/lighthouse_network/src/rpc/handler.rs b/beacon_node/lighthouse_network/src/rpc/handler.rs index 8c35bf7145..396d390b00 100644 --- a/beacon_node/lighthouse_network/src/rpc/handler.rs +++ b/beacon_node/lighthouse_network/src/rpc/handler.rs @@ -377,7 +377,7 @@ where ConnectionHandlerEvent, > { if let Some(waker) = &self.waker { - if waker.will_wake(cx.waker()) { + if !waker.will_wake(cx.waker()) { self.waker = Some(cx.waker().clone()); } } else { diff --git a/beacon_node/network/src/subnet_service/attestation_subnets.rs b/beacon_node/network/src/subnet_service/attestation_subnets.rs index dd4724b261..0da27c6a21 100644 --- a/beacon_node/network/src/subnet_service/attestation_subnets.rs +++ b/beacon_node/network/src/subnet_service/attestation_subnets.rs @@ -600,7 +600,7 @@ impl Stream for AttestationService { fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { // Update the waker if needed. if let Some(waker) = &self.waker { - if waker.will_wake(cx.waker()) { + if !waker.will_wake(cx.waker()) { self.waker = Some(cx.waker().clone()); } } else { diff --git a/beacon_node/network/src/subnet_service/mod.rs b/beacon_node/network/src/subnet_service/mod.rs index b47b1ab99f..a8ea6ed518 100644 --- a/beacon_node/network/src/subnet_service/mod.rs +++ b/beacon_node/network/src/subnet_service/mod.rs @@ -663,7 +663,7 @@ impl Stream for SubnetService { fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { // Update the waker if needed. if let Some(waker) = &self.waker { - if waker.will_wake(cx.waker()) { + if !waker.will_wake(cx.waker()) { self.waker = Some(cx.waker().clone()); } } else { diff --git a/beacon_node/network/src/subnet_service/sync_subnets.rs b/beacon_node/network/src/subnet_service/sync_subnets.rs index 59ec278a95..6b3834e195 100644 --- a/beacon_node/network/src/subnet_service/sync_subnets.rs +++ b/beacon_node/network/src/subnet_service/sync_subnets.rs @@ -319,7 +319,7 @@ impl Stream for SyncCommitteeService { fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { // update the waker if needed if let Some(waker) = &self.waker { - if waker.will_wake(cx.waker()) { + if !waker.will_wake(cx.waker()) { self.waker = Some(cx.waker().clone()); } } else {