Skip to content

Commit 44e62dd

Browse files
committed
Rewrite ChannelManager::handle_error
Exposing ChannelPhase in ChannelManager has led to verbose match statements, which need to be modified each time a ChannelPhase is added. Making ChannelPhase an implementation detail of Channel would help avoid this. As a step in this direction, update ChannelManager::handle_error to use a new ChannelPhase::maybe_handle_error_without_close.
1 parent 8b3573b commit 44e62dd

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

lightning/src/ln/channel.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,38 @@ impl<'a, SP: Deref> ChannelPhase<SP> where
12791279
},
12801280
}
12811281
}
1282+
1283+
pub fn maybe_handle_error_without_close<F: Deref, L: Deref>(
1284+
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
1285+
) -> Result<Option<OpenChannelMessage>, ()>
1286+
where
1287+
F::Target: FeeEstimator,
1288+
L::Target: Logger,
1289+
{
1290+
match self {
1291+
ChannelPhase::Funded(_) => Ok(None),
1292+
ChannelPhase::UnfundedOutboundV1(chan) => {
1293+
let logger = WithChannelContext::from(logger, &chan.context, None);
1294+
chan.maybe_handle_error_without_close(chain_hash, fee_estimator, &&logger)
1295+
.map(|msg| Some(OpenChannelMessage::V1(msg)))
1296+
},
1297+
ChannelPhase::UnfundedInboundV1(_) => Ok(None),
1298+
#[cfg(dual_funding)]
1299+
ChannelPhase::UnfundedV2(chan) => {
1300+
if chan.context.is_outbound() {
1301+
chan.maybe_handle_error_without_close(chain_hash, fee_estimator)
1302+
.map(|msg| Some(OpenChannelMessage::V2(msg)))
1303+
} else {
1304+
Ok(None)
1305+
}
1306+
},
1307+
#[cfg(not(dual_funding))]
1308+
ChannelPhase::UnfundedV2(_) => {
1309+
debug_assert!(false);
1310+
Ok(None)
1311+
},
1312+
}
1313+
}
12821314
}
12831315

12841316
/// Contains all state common to unfunded inbound/outbound channels.
@@ -8979,6 +9011,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
89799011
/// If we receive an error message, it may only be a rejection of the channel type we tried,
89809012
/// not of our ability to open any channel at all. Thus, on error, we should first call this
89819013
/// and see if we get a new `OpenChannelV2` message, otherwise the channel is failed.
9014+
#[cfg(dual_funding)]
89829015
pub(crate) fn maybe_handle_error_without_close<F: Deref>(
89839016
&mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
89849017
) -> Result<msgs::OpenChannelV2, ()>
@@ -8989,6 +9022,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
89899022
Ok(self.get_open_channel_v2(chain_hash))
89909023
}
89919024

9025+
#[cfg(dual_funding)]
89929026
pub fn get_open_channel_v2(&self, chain_hash: ChainHash) -> msgs::OpenChannelV2 {
89939027
if !self.context.is_outbound() {
89949028
debug_assert!(false, "Tried to send open_channel2 for an inbound channel?");

lightning/src/ln/channelmanager.rs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11760,28 +11760,27 @@ where
1176011760
let mut peer_state_lock = peer_state_mutex_opt.unwrap().lock().unwrap();
1176111761
let peer_state = &mut *peer_state_lock;
1176211762
match peer_state.channel_by_id.get_mut(&msg.channel_id) {
11763-
Some(ChannelPhase::UnfundedOutboundV1(ref mut chan)) => {
11764-
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
11765-
if let Ok(msg) = chan.maybe_handle_error_without_close(self.chain_hash, &self.fee_estimator, &&logger) {
11763+
Some(chan) => match chan.maybe_handle_error_without_close(
11764+
self.chain_hash, &self.fee_estimator, &self.logger,
11765+
) {
11766+
Ok(Some(OpenChannelMessage::V1(msg))) => {
1176611767
peer_state.pending_msg_events.push(events::MessageSendEvent::SendOpenChannel {
1176711768
node_id: counterparty_node_id,
1176811769
msg,
1176911770
});
1177011771
return;
11771-
}
11772-
},
11773-
Some(ChannelPhase::UnfundedV2(ref mut chan)) => {
11774-
if chan.context.is_outbound() {
11775-
if let Ok(msg) = chan.maybe_handle_error_without_close(self.chain_hash, &self.fee_estimator) {
11776-
peer_state.pending_msg_events.push(events::MessageSendEvent::SendOpenChannelV2 {
11777-
node_id: counterparty_node_id,
11778-
msg,
11779-
});
11780-
return;
11781-
}
11782-
}
11772+
},
11773+
#[cfg(dual_funding)]
11774+
Ok(Some(OpenChannelMessage::V2(msg))) => {
11775+
peer_state.pending_msg_events.push(events::MessageSendEvent::SendOpenChannelV2 {
11776+
node_id: counterparty_node_id,
11777+
msg,
11778+
});
11779+
return;
11780+
},
11781+
Ok(None) | Err(()) => {},
1178311782
},
11784-
None | Some(ChannelPhase::UnfundedInboundV1(_) | ChannelPhase::Funded(_)) => (),
11783+
None => {},
1178511784
}
1178611785
}
1178711786

0 commit comments

Comments
 (0)