Skip to content

Commit e25da14

Browse files
committed
Reduce chan state logic from ChannelManager when reconnecting
After lightningdevkit#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 036871a commit e25da14

File tree

2 files changed

+42
-38
lines changed

2 files changed

+42
-38
lines changed

lightning/src/ln/channel.rs

+23-14
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,13 @@ pub(super) struct ReestablishResponses {
930930
pub shutdown_msg: Option<msgs::Shutdown>,
931931
}
932932

933+
/// The first message we send to our peer after connection
934+
pub(super) enum ReconnectionMsg {
935+
Reestablish(msgs::ChannelReestablish),
936+
Open(OpenChannelMessage),
937+
None,
938+
}
939+
933940
/// The result of a shutdown that should be handled.
934941
#[must_use]
935942
pub(crate) struct ShutdownResult {
@@ -1296,40 +1303,42 @@ impl<SP: Deref> Channel<SP> where
12961303
}
12971304
}
12981305

1299-
pub fn maybe_get_open_channel<L: Deref>(
1306+
/// Should be called when the peer re-connects, returning an initial message which we should
1307+
/// send our peer to begin the channel reconnection process.
1308+
pub fn peer_connected_get_handshake<L: Deref>(
13001309
&mut self, chain_hash: ChainHash, logger: &L,
1301-
) -> Option<OpenChannelMessage> where L::Target: Logger {
1310+
) -> ReconnectionMsg where L::Target: Logger {
13021311
match self {
1303-
Channel::Funded(_) => None,
1312+
Channel::Funded(chan) =>
1313+
ReconnectionMsg::Reestablish(chan.get_channel_reestablish(logger)),
13041314
Channel::UnfundedOutboundV1(chan) => {
1305-
let logger = WithChannelContext::from(logger, &chan.context, None);
1306-
chan.get_open_channel(chain_hash, &&logger)
1307-
.map(|msg| OpenChannelMessage::V1(msg))
1315+
chan.get_open_channel(chain_hash, logger)
1316+
.map(|msg| ReconnectionMsg::Open(OpenChannelMessage::V1(msg)))
1317+
.unwrap_or(ReconnectionMsg::None)
13081318
},
13091319
Channel::UnfundedInboundV1(_) => {
13101320
// Since unfunded inbound channel maps are cleared upon disconnecting a peer,
13111321
// they are not persisted and won't be recovered after a crash.
13121322
// Therefore, they shouldn't exist at this point.
13131323
debug_assert!(false);
1314-
None
1324+
ReconnectionMsg::None
13151325
},
13161326
#[cfg(dual_funding)]
13171327
Channel::UnfundedV2(chan) => {
13181328
if chan.context.is_outbound() {
1319-
Some(OpenChannelMessage::V2(chan.get_open_channel_v2(chain_hash)))
1329+
ReconnectionMsg::Open(OpenChannelMessage::V2(
1330+
chan.get_open_channel_v2(chain_hash)
1331+
))
13201332
} else {
13211333
// Since unfunded inbound channel maps are cleared upon disconnecting a peer,
13221334
// they are not persisted and won't be recovered after a crash.
13231335
// Therefore, they shouldn't exist at this point.
13241336
debug_assert!(false);
1325-
None
1337+
ReconnectionMsg::None
13261338
}
13271339
},
13281340
#[cfg(not(dual_funding))]
1329-
Channel::UnfundedV2(_) => {
1330-
debug_assert!(false);
1331-
None
1332-
},
1341+
Channel::UnfundedV2(_) => ReconnectionMsg::None,
13331342
}
13341343
}
13351344

@@ -7984,7 +7993,7 @@ impl<SP: Deref> FundedChannel<SP> where
79847993

79857994
/// May panic if called on a channel that wasn't immediately-previously
79867995
/// self.remove_uncommitted_htlcs_and_mark_paused()'d
7987-
pub fn get_channel_reestablish<L: Deref>(&mut self, logger: &L) -> msgs::ChannelReestablish where L::Target: Logger {
7996+
fn get_channel_reestablish<L: Deref>(&mut self, logger: &L) -> msgs::ChannelReestablish where L::Target: Logger {
79887997
assert!(self.context.channel_state.is_peer_disconnected());
79897998
assert_ne!(self.context.cur_counterparty_commitment_transaction_number, INITIAL_COMMITMENT_NUMBER);
79907999
// 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;
@@ -11620,30 +11620,25 @@ where
1162011620
let pending_msg_events = &mut peer_state.pending_msg_events;
1162111621

1162211622
for (_, phase) in peer_state.channel_by_id.iter_mut() {
11623-
match phase.as_funded_mut() {
11624-
Some(chan) => {
11625-
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
11623+
let logger = WithChannelContext::from(&self.logger, &phase.context(), None);
11624+
match phase.peer_connected_get_handshake(self.chain_hash, &&logger) {
11625+
ReconnectionMsg::Reestablish(msg) =>
1162611626
pending_msg_events.push(events::MessageSendEvent::SendChannelReestablish {
11627-
node_id: chan.context.get_counterparty_node_id(),
11628-
msg: chan.get_channel_reestablish(&&logger),
11629-
});
11630-
},
11631-
None => match phase.maybe_get_open_channel(self.chain_hash, &self.logger) {
11632-
Some(OpenChannelMessage::V1(msg)) => {
11633-
pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
11634-
node_id: phase.context().get_counterparty_node_id(),
11635-
msg,
11636-
});
11637-
},
11638-
#[cfg(dual_funding)]
11639-
Some(OpenChannelMessage::V2(msg)) => {
11640-
pending_msg_events.push(events::MessageSendEvent::SendOpenChannelV2 {
11641-
node_id: phase.context().get_counterparty_node_id(),
11642-
msg,
11643-
});
11644-
},
11645-
None => {},
11646-
},
11627+
node_id: phase.context().get_counterparty_node_id(),
11628+
msg,
11629+
}),
11630+
ReconnectionMsg::Open(OpenChannelMessage::V1(msg)) =>
11631+
pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
11632+
node_id: phase.context().get_counterparty_node_id(),
11633+
msg,
11634+
}),
11635+
#[cfg(dual_funding)]
11636+
ReconnectionMsg::Open(OpenChannelMessage::V2(msg)) =>
11637+
pending_msg_events.push(events::MessageSendEvent::SendOpenChannelV2 {
11638+
node_id: phase.context().get_counterparty_node_id(),
11639+
msg,
11640+
}),
11641+
ReconnectionMsg::None => {},
1164711642
}
1164811643
}
1164911644
}

0 commit comments

Comments
 (0)