Skip to content

Commit bece44c

Browse files
committed
Reduce chan state logic from ChannelManager when reconnecting
After #3513 we have a bit more encapsulation of channel logic in channel.rs with channelmanager.rs needing a bit less knowledge of which specific state a channel is in. This continues that trend slightly when a peer reconnects.
1 parent e3325a2 commit bece44c

File tree

2 files changed

+44
-39
lines changed

2 files changed

+44
-39
lines changed

lightning/src/ln/channel.rs

+25-15
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,13 @@ pub(super) struct ReestablishResponses {
933933
pub shutdown_msg: Option<msgs::Shutdown>,
934934
}
935935

936+
/// The first message we send to our peer after connection
937+
pub(super) enum ReconnectionMsg {
938+
Reestablish(msgs::ChannelReestablish),
939+
Open(OpenChannelMessage),
940+
None,
941+
}
942+
936943
/// The result of a shutdown that should be handled.
937944
#[must_use]
938945
pub(crate) struct ShutdownResult {
@@ -1286,7 +1293,8 @@ impl<SP: Deref> Channel<SP> where
12861293
}
12871294

12881295
/// Should be called when the peer is disconnected. Returns true if the channel can be resumed
1289-
/// when the peer reconnects. If not, the channel must be immediately closed.
1296+
/// when the peer reconnects (via [`Self::peer_connected_get_handshake`]). If not, the channel
1297+
/// must be immediately closed.
12901298
pub fn peer_disconnected_is_resumable<L: Deref>(&mut self, logger: &L) -> bool where L::Target: Logger {
12911299
match &mut self.phase {
12921300
ChannelPhase::Undefined => unreachable!(),
@@ -1303,41 +1311,43 @@ impl<SP: Deref> Channel<SP> where
13031311
}
13041312
}
13051313

1306-
pub fn maybe_get_open_channel<L: Deref>(
1314+
/// Should be called when the peer re-connects, returning an initial message which we should
1315+
/// send our peer to begin the channel reconnection process.
1316+
pub fn peer_connected_get_handshake<L: Deref>(
13071317
&mut self, chain_hash: ChainHash, logger: &L,
1308-
) -> Option<OpenChannelMessage> where L::Target: Logger {
1318+
) -> ReconnectionMsg where L::Target: Logger {
13091319
match &mut self.phase {
13101320
ChannelPhase::Undefined => unreachable!(),
1311-
ChannelPhase::Funded(_) => None,
1321+
ChannelPhase::Funded(chan) =>
1322+
ReconnectionMsg::Reestablish(chan.get_channel_reestablish(logger)),
13121323
ChannelPhase::UnfundedOutboundV1(chan) => {
1313-
let logger = WithChannelContext::from(logger, &chan.context, None);
1314-
chan.get_open_channel(chain_hash, &&logger)
1315-
.map(|msg| OpenChannelMessage::V1(msg))
1324+
chan.get_open_channel(chain_hash, logger)
1325+
.map(|msg| ReconnectionMsg::Open(OpenChannelMessage::V1(msg)))
1326+
.unwrap_or(ReconnectionMsg::None)
13161327
},
13171328
ChannelPhase::UnfundedInboundV1(_) => {
13181329
// Since unfunded inbound channel maps are cleared upon disconnecting a peer,
13191330
// they are not persisted and won't be recovered after a crash.
13201331
// Therefore, they shouldn't exist at this point.
13211332
debug_assert!(false);
1322-
None
1333+
ReconnectionMsg::None
13231334
},
13241335
#[cfg(dual_funding)]
13251336
ChannelPhase::UnfundedV2(chan) => {
13261337
if chan.context.is_outbound() {
1327-
Some(OpenChannelMessage::V2(chan.get_open_channel_v2(chain_hash)))
1338+
ReconnectionMsg::Open(OpenChannelMessage::V2(
1339+
chan.get_open_channel_v2(chain_hash)
1340+
))
13281341
} else {
13291342
// Since unfunded inbound channel maps are cleared upon disconnecting a peer,
13301343
// they are not persisted and won't be recovered after a crash.
13311344
// Therefore, they shouldn't exist at this point.
13321345
debug_assert!(false);
1333-
None
1346+
ReconnectionMsg::None
13341347
}
13351348
},
13361349
#[cfg(not(dual_funding))]
1337-
ChannelPhase::UnfundedV2(_) => {
1338-
debug_assert!(false);
1339-
None
1340-
},
1350+
ChannelPhase::UnfundedV2(_) => ReconnectionMsg::None,
13411351
}
13421352
}
13431353

@@ -8100,7 +8110,7 @@ impl<SP: Deref> FundedChannel<SP> where
81008110

81018111
/// May panic if called on a channel that wasn't immediately-previously
81028112
/// self.remove_uncommitted_htlcs_and_mark_paused()'d
8103-
pub fn get_channel_reestablish<L: Deref>(&mut self, logger: &L) -> msgs::ChannelReestablish where L::Target: Logger {
8113+
fn get_channel_reestablish<L: Deref>(&mut self, logger: &L) -> msgs::ChannelReestablish where L::Target: Logger {
81048114
assert!(self.context.channel_state.is_peer_disconnected());
81058115
assert_ne!(self.context.cur_counterparty_commitment_transaction_number, INITIAL_COMMITMENT_NUMBER);
81068116
// This is generally the first function which gets called on any given channel once we're

lightning/src/ln/channelmanager.rs

+19-24
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::events::{self, Event, EventHandler, EventsProvider, InboundChannelFun
4848
use crate::ln::inbound_payment;
4949
use crate::ln::types::ChannelId;
5050
use crate::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
51-
use crate::ln::channel::{self, Channel, ChannelError, ChannelUpdateStatus, FundedChannel, ShutdownResult, UpdateFulfillCommitFetch, OutboundV1Channel, InboundV1Channel, WithChannelContext};
51+
use crate::ln::channel::{self, Channel, ChannelError, ChannelUpdateStatus, FundedChannel, ShutdownResult, UpdateFulfillCommitFetch, OutboundV1Channel, ReconnectionMsg, InboundV1Channel, WithChannelContext};
5252
#[cfg(any(dual_funding, splicing))]
5353
use crate::ln::channel::PendingV2Channel;
5454
use crate::ln::channel_state::ChannelDetails;
@@ -11646,30 +11646,25 @@ where
1164611646
let pending_msg_events = &mut peer_state.pending_msg_events;
1164711647

1164811648
for (_, chan) in peer_state.channel_by_id.iter_mut() {
11649-
match chan.as_funded_mut() {
11650-
Some(funded_chan) => {
11651-
let logger = WithChannelContext::from(&self.logger, &funded_chan.context, None);
11649+
let logger = WithChannelContext::from(&self.logger, &chan.context(), None);
11650+
match chan.peer_connected_get_handshake(self.chain_hash, &&logger) {
11651+
ReconnectionMsg::Reestablish(msg) =>
1165211652
pending_msg_events.push(events::MessageSendEvent::SendChannelReestablish {
11653-
node_id: funded_chan.context.get_counterparty_node_id(),
11654-
msg: funded_chan.get_channel_reestablish(&&logger),
11655-
});
11656-
},
11657-
None => match chan.maybe_get_open_channel(self.chain_hash, &self.logger) {
11658-
Some(OpenChannelMessage::V1(msg)) => {
11659-
pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
11660-
node_id: chan.context().get_counterparty_node_id(),
11661-
msg,
11662-
});
11663-
},
11664-
#[cfg(dual_funding)]
11665-
Some(OpenChannelMessage::V2(msg)) => {
11666-
pending_msg_events.push(events::MessageSendEvent::SendOpenChannelV2 {
11667-
node_id: chan.context().get_counterparty_node_id(),
11668-
msg,
11669-
});
11670-
},
11671-
None => {},
11672-
},
11653+
node_id: chan.context().get_counterparty_node_id(),
11654+
msg,
11655+
}),
11656+
ReconnectionMsg::Open(OpenChannelMessage::V1(msg)) =>
11657+
pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
11658+
node_id: chan.context().get_counterparty_node_id(),
11659+
msg,
11660+
}),
11661+
#[cfg(dual_funding)]
11662+
ReconnectionMsg::Open(OpenChannelMessage::V2(msg)) =>
11663+
pending_msg_events.push(events::MessageSendEvent::SendOpenChannelV2 {
11664+
node_id: chan.context().get_counterparty_node_id(),
11665+
msg,
11666+
}),
11667+
ReconnectionMsg::None => {},
1167311668
}
1167411669
}
1167511670
}

0 commit comments

Comments
 (0)