Skip to content

Commit efcb5e0

Browse files
committed
Move the pub wait methods from ChannelManager to Future
Rather than having three ways to await a `ChannelManager` being persistable, this moves to just exposing the awaitable `Future` and having sleep functions on that.
1 parent b455fb5 commit efcb5e0

File tree

3 files changed

+39
-58
lines changed

3 files changed

+39
-58
lines changed

lightning-background-processor/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ impl BackgroundProcessor {
643643
define_run_body!(persister, chain_monitor, chain_monitor.process_pending_events(&event_handler),
644644
channel_manager, channel_manager.process_pending_events(&event_handler),
645645
gossip_sync, peer_manager, logger, scorer, stop_thread.load(Ordering::Acquire),
646-
channel_manager.await_persistable_update_timeout(Duration::from_millis(100)),
646+
channel_manager.get_persistable_update_future().wait_timeout(Duration::from_millis(100)),
647647
|_| Instant::now(), |time: &Instant, dur| time.elapsed().as_secs() > dur)
648648
});
649649
Self { stop_thread: stop_thread_clone, thread_handle: Some(handle) }

lightning/src/ln/channelmanager.rs

+18-41
Original file line numberDiff line numberDiff line change
@@ -6147,34 +6147,11 @@ where
61476147
}
61486148
}
61496149

6150-
/// Blocks until ChannelManager needs to be persisted or a timeout is reached. It returns a bool
6151-
/// indicating whether persistence is necessary. Only one listener on
6152-
/// [`await_persistable_update`], [`await_persistable_update_timeout`], or a future returned by
6153-
/// [`get_persistable_update_future`] is guaranteed to be woken up.
6150+
/// Gets a [`Future`] that completes when this [`ChannelManager`] needs to be persisted.
61546151
///
6155-
/// Note that this method is not available with the `no-std` feature.
6152+
/// Note that callbacks registered on the [`Future`] MUST NOT call back into this
6153+
/// [`ChannelManager`] and should instead register actions to be taken later.
61566154
///
6157-
/// [`await_persistable_update`]: Self::await_persistable_update
6158-
/// [`await_persistable_update_timeout`]: Self::await_persistable_update_timeout
6159-
/// [`get_persistable_update_future`]: Self::get_persistable_update_future
6160-
#[cfg(any(test, feature = "std"))]
6161-
pub fn await_persistable_update_timeout(&self, max_wait: Duration) -> bool {
6162-
self.persistence_notifier.wait_timeout(max_wait)
6163-
}
6164-
6165-
/// Blocks until ChannelManager needs to be persisted. Only one listener on
6166-
/// [`await_persistable_update`], `await_persistable_update_timeout`, or a future returned by
6167-
/// [`get_persistable_update_future`] is guaranteed to be woken up.
6168-
///
6169-
/// [`await_persistable_update`]: Self::await_persistable_update
6170-
/// [`get_persistable_update_future`]: Self::get_persistable_update_future
6171-
pub fn await_persistable_update(&self) {
6172-
self.persistence_notifier.wait()
6173-
}
6174-
6175-
/// Gets a [`Future`] that completes when a persistable update is available. Note that
6176-
/// callbacks registered on the [`Future`] MUST NOT call back into this [`ChannelManager`] and
6177-
/// should instead register actions to be taken later.
61786155
pub fn get_persistable_update_future(&self) -> Future {
61796156
self.persistence_notifier.get_future()
61806157
}
@@ -7954,9 +7931,9 @@ mod tests {
79547931

79557932
// All nodes start with a persistable update pending as `create_network` connects each node
79567933
// with all other nodes to make most tests simpler.
7957-
assert!(nodes[0].node.await_persistable_update_timeout(Duration::from_millis(1)));
7958-
assert!(nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
7959-
assert!(nodes[2].node.await_persistable_update_timeout(Duration::from_millis(1)));
7934+
assert!(nodes[0].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7935+
assert!(nodes[1].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7936+
assert!(nodes[2].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
79607937

79617938
let mut chan = create_announced_chan_between_nodes(&nodes, 0, 1);
79627939

@@ -7970,28 +7947,28 @@ mod tests {
79707947
&nodes[0].node.get_our_node_id()).pop().unwrap();
79717948

79727949
// The first two nodes (which opened a channel) should now require fresh persistence
7973-
assert!(nodes[0].node.await_persistable_update_timeout(Duration::from_millis(1)));
7974-
assert!(nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
7950+
assert!(nodes[0].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7951+
assert!(nodes[1].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
79757952
// ... but the last node should not.
7976-
assert!(!nodes[2].node.await_persistable_update_timeout(Duration::from_millis(1)));
7953+
assert!(!nodes[2].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
79777954
// After persisting the first two nodes they should no longer need fresh persistence.
7978-
assert!(!nodes[0].node.await_persistable_update_timeout(Duration::from_millis(1)));
7979-
assert!(!nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
7955+
assert!(!nodes[0].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7956+
assert!(!nodes[1].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
79807957

79817958
// Node 3, unrelated to the only channel, shouldn't care if it receives a channel_update
79827959
// about the channel.
79837960
nodes[2].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &chan.0);
79847961
nodes[2].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &chan.1);
7985-
assert!(!nodes[2].node.await_persistable_update_timeout(Duration::from_millis(1)));
7962+
assert!(!nodes[2].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
79867963

79877964
// The nodes which are a party to the channel should also ignore messages from unrelated
79887965
// parties.
79897966
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan.0);
79907967
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan.1);
79917968
nodes[1].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan.0);
79927969
nodes[1].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan.1);
7993-
assert!(!nodes[0].node.await_persistable_update_timeout(Duration::from_millis(1)));
7994-
assert!(!nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
7970+
assert!(!nodes[0].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7971+
assert!(!nodes[1].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
79957972

79967973
// At this point the channel info given by peers should still be the same.
79977974
assert_eq!(nodes[0].node.list_channels()[0], node_a_chan_info);
@@ -8008,17 +7985,17 @@ mod tests {
80087985
// persisted and that its channel info remains the same.
80097986
nodes[0].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &as_update);
80107987
nodes[1].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &bs_update);
8011-
assert!(!nodes[0].node.await_persistable_update_timeout(Duration::from_millis(1)));
8012-
assert!(!nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
7988+
assert!(!nodes[0].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7989+
assert!(!nodes[1].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
80137990
assert_eq!(nodes[0].node.list_channels()[0], node_a_chan_info);
80147991
assert_eq!(nodes[1].node.list_channels()[0], node_b_chan_info);
80157992

80167993
// Finally, deliver the other peers' message, ensuring each node needs to be persisted and
80177994
// the channel info has updated.
80187995
nodes[0].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &bs_update);
80197996
nodes[1].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &as_update);
8020-
assert!(nodes[0].node.await_persistable_update_timeout(Duration::from_millis(1)));
8021-
assert!(nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
7997+
assert!(nodes[0].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
7998+
assert!(nodes[1].node.get_persistable_update_future().wait_timeout(Duration::from_millis(1)));
80227999
assert_ne!(nodes[0].node.list_channels()[0], node_a_chan_info);
80238000
assert_ne!(nodes[1].node.list_channels()[0], node_b_chan_info);
80248001
}

lightning/src/util/wakers.rs

+20-16
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,6 @@ impl Notifier {
3939
}
4040
}
4141

42-
pub(crate) fn wait(&self) {
43-
Sleeper::from_single_future(self.get_future()).wait();
44-
}
45-
46-
#[cfg(any(test, feature = "std"))]
47-
pub(crate) fn wait_timeout(&self, max_wait: Duration) -> bool {
48-
Sleeper::from_single_future(self.get_future()).wait_timeout(max_wait)
49-
}
50-
5142
/// Wake waiters, tracking that wake needs to occur even if there are currently no waiters.
5243
pub(crate) fn notify(&self) {
5344
let mut lock = self.notify_pending.lock().unwrap();
@@ -167,6 +158,19 @@ impl Future {
167158
pub fn register_callback_fn<F: 'static + FutureCallback>(&self, callback: F) {
168159
self.register_callback(Box::new(callback));
169160
}
161+
162+
/// Waits until this [`Future`] completes.
163+
pub fn wait(self) {
164+
Sleeper::from_single_future(self).wait();
165+
}
166+
167+
/// Waits until this [`Future`] completes or the given amount of time has elapsed.
168+
///
169+
/// Returns true if the [`Future`] completed, false if the time elapsed.
170+
#[cfg(any(test, feature = "std"))]
171+
pub fn wait_timeout(self, max_wait: Duration) -> bool {
172+
Sleeper::from_single_future(self).wait_timeout(max_wait)
173+
}
170174
}
171175

172176
use core::task::Waker;
@@ -369,12 +373,12 @@ mod tests {
369373
});
370374

371375
// Check that we can block indefinitely until updates are available.
372-
let _ = persistence_notifier.wait();
376+
let _ = persistence_notifier.get_future().wait();
373377

374378
// Check that the Notifier will return after the given duration if updates are
375379
// available.
376380
loop {
377-
if persistence_notifier.wait_timeout(Duration::from_millis(100)) {
381+
if persistence_notifier.get_future().wait_timeout(Duration::from_millis(100)) {
378382
break
379383
}
380384
}
@@ -384,7 +388,7 @@ mod tests {
384388
// Check that the Notifier will return after the given duration even if no updates
385389
// are available.
386390
loop {
387-
if !persistence_notifier.wait_timeout(Duration::from_millis(100)) {
391+
if !persistence_notifier.get_future().wait_timeout(Duration::from_millis(100)) {
388392
break
389393
}
390394
}
@@ -482,8 +486,8 @@ mod tests {
482486

483487
// If we get a future and don't touch it we're definitely still notify-required.
484488
notifier.get_future();
485-
assert!(notifier.wait_timeout(Duration::from_millis(1)));
486-
assert!(!notifier.wait_timeout(Duration::from_millis(1)));
489+
assert!(notifier.get_future().wait_timeout(Duration::from_millis(1)));
490+
assert!(!notifier.get_future().wait_timeout(Duration::from_millis(1)));
487491

488492
// Even if we poll'd once but didn't observe a `Ready`, we should be notify-required.
489493
let mut future = notifier.get_future();
@@ -492,7 +496,7 @@ mod tests {
492496

493497
notifier.notify();
494498
assert!(woken.load(Ordering::SeqCst));
495-
assert!(notifier.wait_timeout(Duration::from_millis(1)));
499+
assert!(notifier.get_future().wait_timeout(Duration::from_millis(1)));
496500

497501
// However, once we do poll `Ready` it should wipe the notify-required flag.
498502
let mut future = notifier.get_future();
@@ -502,7 +506,7 @@ mod tests {
502506
notifier.notify();
503507
assert!(woken.load(Ordering::SeqCst));
504508
assert_eq!(Pin::new(&mut future).poll(&mut Context::from_waker(&waker)), Poll::Ready(()));
505-
assert!(!notifier.wait_timeout(Duration::from_millis(1)));
509+
assert!(!notifier.get_future().wait_timeout(Duration::from_millis(1)));
506510
}
507511

508512
#[test]

0 commit comments

Comments
 (0)