Skip to content

Commit 6f11f70

Browse files
committed
EventHandler decorator for applying NetworkUpdate
PaymentFailed events contain an optional NetworkUpdate describing changes to the NetworkGraph as conveyed by a node along a failed payment path according to BOLT 4. An EventHandler should apply the update to the graph so that future routing decisions can account for it. Provide an EventHandler decorator that updates the NetworkGraph and then delegates Event handling to the decorated EventHandler. Previously, NetGraphMsgHandler::handle_htlc_fail_channel_update implemented this behavior.
1 parent 76962bb commit 6f11f70

File tree

8 files changed

+244
-94
lines changed

8 files changed

+244
-94
lines changed

fuzz/src/full_stack.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,Ig
3838
use lightning::ln::msgs::DecodeError;
3939
use lightning::ln::script::ShutdownScript;
4040
use lightning::routing::router::get_route;
41-
use lightning::routing::network_graph::NetGraphMsgHandler;
41+
use lightning::routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
4242
use lightning::util::config::UserConfig;
4343
use lightning::util::errors::APIError;
44-
use lightning::util::events::Event;
44+
use lightning::util::events::{Event, EventHandler};
4545
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
4646
use lightning::util::logger::Logger;
4747
use lightning::util::ser::Readable;
@@ -160,12 +160,12 @@ type ChannelMan = ChannelManager<
160160
EnforcingSigner,
161161
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
162162
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
163-
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
163+
type PeerMan<'a, E> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<dyn chain::Access>, Arc<dyn Logger>, E>>, Arc<dyn Logger>, IgnoringMessageHandler>;
164164

165-
struct MoneyLossDetector<'a> {
165+
struct MoneyLossDetector<'a, E: EventHandler> {
166166
manager: Arc<ChannelMan>,
167167
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
168-
handler: PeerMan<'a>,
168+
handler: PeerMan<'a, E>,
169169

170170
peers: &'a RefCell<[bool; 256]>,
171171
funding_txn: Vec<Transaction>,
@@ -175,11 +175,11 @@ struct MoneyLossDetector<'a> {
175175
max_height: usize,
176176
blocks_connected: u32,
177177
}
178-
impl<'a> MoneyLossDetector<'a> {
178+
impl<'a, E: EventHandler> MoneyLossDetector<'a, E> {
179179
pub fn new(peers: &'a RefCell<[bool; 256]>,
180180
manager: Arc<ChannelMan>,
181181
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
182-
handler: PeerMan<'a>) -> Self {
182+
handler: PeerMan<'a, E>) -> Self {
183183
MoneyLossDetector {
184184
manager,
185185
monitor,
@@ -238,7 +238,7 @@ impl<'a> MoneyLossDetector<'a> {
238238
}
239239
}
240240

241-
impl<'a> Drop for MoneyLossDetector<'a> {
241+
impl<'a, E: EventHandler> Drop for MoneyLossDetector<'a, E> {
242242
fn drop(&mut self) {
243243
if !::std::thread::panicking() {
244244
// Disconnect all peers
@@ -378,7 +378,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
378378
};
379379
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params));
380380
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
381-
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(genesis_block(network).block_hash(), None, Arc::clone(&logger)));
381+
let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
382+
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger), |_: &_| {}));
382383

383384
let peers = RefCell::new([false; 256]);
384385
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {

lightning-net-tokio/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@
3737
//! type DataPersister = dyn lightning::chain::channelmonitor::Persist<lightning::chain::keysinterface::InMemorySigner> + Send + Sync;
3838
//! type ChainMonitor = lightning::chain::chainmonitor::ChainMonitor<lightning::chain::keysinterface::InMemorySigner, Arc<ChainFilter>, Arc<TxBroadcaster>, Arc<FeeEstimator>, Arc<Logger>, Arc<DataPersister>>;
3939
//! type ChannelManager = Arc<lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor, TxBroadcaster, FeeEstimator, Logger>>;
40-
//! type PeerManager = Arc<lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChainMonitor, TxBroadcaster, FeeEstimator, ChainAccess, Logger>>;
40+
//! type PeerManager<E> = Arc<lightning::ln::peer_handler::SimpleArcPeerManager<lightning_net_tokio::SocketDescriptor, ChainMonitor, TxBroadcaster, FeeEstimator, ChainAccess, Logger, E>>;
4141
//!
4242
//! // Connect to node with pubkey their_node_id at addr:
43-
//! async fn connect_to_node(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, their_node_id: PublicKey, addr: SocketAddr) {
43+
//! async fn connect_to_node<E: 'static + EventHandler + Send + Sync>(peer_manager: PeerManager<E>, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, their_node_id: PublicKey, addr: SocketAddr) {
4444
//! lightning_net_tokio::connect_outbound(peer_manager, their_node_id, addr).await;
4545
//! loop {
4646
//! let event_handler = |event: &Event| {
@@ -53,7 +53,7 @@
5353
//! }
5454
//!
5555
//! // Begin reading from a newly accepted socket and talk to the peer:
56-
//! async fn accept_socket(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, socket: TcpStream) {
56+
//! async fn accept_socket<E: 'static + EventHandler + Send + Sync>(peer_manager: PeerManager<E>, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, socket: TcpStream) {
5757
//! lightning_net_tokio::setup_inbound(peer_manager, socket);
5858
//! loop {
5959
//! let event_handler = |event: &Event| {

lightning/src/ln/functional_test_utils.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
208208
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
209209
pub keys_manager: &'b test_utils::TestKeysInterface,
210210
pub node: &'a ChannelManager<EnforcingSigner, &'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger>,
211-
pub net_graph_msg_handler: NetGraphMsgHandler<&'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
211+
pub net_graph_msg_handler: NetGraphMsgHandler<&'c test_utils::TestChainSource, &'c test_utils::TestLogger, test_utils::TestEventHandler>,
212212
pub node_seed: [u8; 32],
213213
pub network_payment_count: Rc<RefCell<u8>>,
214214
pub network_chan_count: Rc<RefCell<u32>>,
@@ -243,8 +243,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
243243
network_graph_ser.write(&mut w).unwrap();
244244
let network_graph_deser = <NetworkGraph>::read(&mut io::Cursor::new(&w.0)).unwrap();
245245
assert!(network_graph_deser == self.net_graph_msg_handler.network_graph);
246-
let net_graph_msg_handler = NetGraphMsgHandler::from_net_graph(
247-
Some(self.chain_source), self.logger, network_graph_deser
246+
let net_graph_msg_handler = NetGraphMsgHandler::new(
247+
network_graph_deser, Some(self.chain_source), self.logger, test_utils::TestEventHandler {}
248248
);
249249
let mut chan_progress = 0;
250250
loop {
@@ -1441,7 +1441,8 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
14411441
let connect_style = Rc::new(RefCell::new(ConnectStyle::FullBlockViaListen));
14421442

14431443
for i in 0..node_count {
1444-
let net_graph_msg_handler = NetGraphMsgHandler::new(cfgs[i].chain_source.genesis_hash, None, cfgs[i].logger);
1444+
let network_graph = NetworkGraph::new(cfgs[i].chain_source.genesis_hash);
1445+
let net_graph_msg_handler = NetGraphMsgHandler::new(network_graph, None, cfgs[i].logger, test_utils::TestEventHandler {});
14451446
nodes.push(Node{ chain_source: cfgs[i].chain_source,
14461447
tx_broadcaster: cfgs[i].tx_broadcaster, chain_monitor: &cfgs[i].chain_monitor,
14471448
keys_manager: &cfgs[i].keys_manager, node: &chan_mgrs[i], net_graph_msg_handler,

lightning/src/ln/peer_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,15 +354,15 @@ fn _check_usize_is_32_or_64() {
354354
/// lifetimes). Other times you can afford a reference, which is more efficient, in which case
355355
/// SimpleRefPeerManager is the more appropriate type. Defining these type aliases prevents
356356
/// issues such as overly long function definitions.
357-
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<NetGraphMsgHandler<Arc<C>, Arc<L>>>, Arc<L>, Arc<IgnoringMessageHandler>>;
357+
pub type SimpleArcPeerManager<SD, M, T, F, C, L, E> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<NetGraphMsgHandler<Arc<C>, Arc<L>, E>>, Arc<L>, Arc<IgnoringMessageHandler>>;
358358

359359
/// SimpleRefPeerManager is a type alias for a PeerManager reference, and is the reference
360360
/// counterpart to the SimpleArcPeerManager type alias. Use this type by default when you don't
361361
/// need a PeerManager with a static lifetime. You'll need a static lifetime in cases such as
362362
/// usage of lightning-net-tokio (since tokio::spawn requires parameters with static lifetimes).
363363
/// But if this is not necessary, using a reference is more efficient. Defining these type aliases
364364
/// helps with issues such as long function definitions.
365-
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e NetGraphMsgHandler<&'g C, &'f L>, &'f L, IgnoringMessageHandler>;
365+
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, SD, M, T, F, C, L, E> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e NetGraphMsgHandler<&'g C, &'f L, E>, &'f L, IgnoringMessageHandler>;
366366

367367
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
368368
/// socket events into messages which it passes on to its [`MessageHandler`].

0 commit comments

Comments
 (0)