Skip to content

Commit 2552104

Browse files
committed
Avoid persisting ChannelManager on handle_tx_* errors
These errors will only ever affect our in-memory state, so there's no need to persist the ChannelManager when we come across one. Note that `tx_abort` is not included here because there is a possibility we force close the channel, which we should persist.
1 parent e93d745 commit 2552104

File tree

1 file changed

+43
-19
lines changed

1 file changed

+43
-19
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11196,7 +11196,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1119611196
>(
1119711197
&self, counterparty_node_id: &PublicKey, channel_id: ChannelId,
1119811198
tx_msg_handler: HandleTxMsgFn,
11199-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11199+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1120011200
let per_peer_state = self.per_peer_state.read().unwrap();
1120111201
let peer_state_mutex = per_peer_state.get(counterparty_node_id).ok_or_else(|| {
1120211202
debug_assert!(false);
@@ -11211,7 +11211,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1121111211
Ok(msg_send) => {
1121211212
let msg_send_event = msg_send.into_msg_send_event(*counterparty_node_id);
1121311213
peer_state.pending_msg_events.push(msg_send_event);
11214-
Ok(NotifyOption::SkipPersistHandleEvents)
11214+
Ok(())
1121511215
},
1121611216
Err(InteractiveTxMsgError {
1121711217
err,
@@ -11251,31 +11251,31 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1125111251

1125211252
fn internal_tx_add_input(
1125311253
&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddInput,
11254-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11254+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1125511255
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1125611256
channel.tx_add_input(msg, &self.logger)
1125711257
})
1125811258
}
1125911259

1126011260
fn internal_tx_add_output(
1126111261
&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddOutput,
11262-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11262+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1126311263
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1126411264
channel.tx_add_output(msg, &self.logger)
1126511265
})
1126611266
}
1126711267

1126811268
fn internal_tx_remove_input(
1126911269
&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveInput,
11270-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11270+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1127111271
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1127211272
channel.tx_remove_input(msg, &self.logger)
1127311273
})
1127411274
}
1127511275

1127611276
fn internal_tx_remove_output(
1127711277
&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveOutput,
11278-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11278+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1127911279
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1128011280
channel.tx_remove_output(msg, &self.logger)
1128111281
})
@@ -15995,11 +15995,16 @@ impl<
1599515995
fn handle_tx_add_input(&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddInput) {
1599615996
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1599715997
let res = self.internal_tx_add_input(counterparty_node_id, msg);
15998-
let (mut persist, exited_quiescence) = match &res {
15999-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16000-
Ok(persist) => (*persist, false),
15998+
let exited_quiescence = match &res {
15999+
Err((err, exited_quiescence)) => {
16000+
debug_assert!(!err.closes_channel());
16001+
*exited_quiescence
16002+
},
16003+
Ok(_) => false,
1600116004
};
1600216005
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16006+
16007+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1600316008
if exited_quiescence {
1600416009
// Note that we're not able to do this inline in `internal_tx_add_input` as we
1600516010
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16015,11 +16020,16 @@ impl<
1601516020
fn handle_tx_add_output(&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddOutput) {
1601616021
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1601716022
let res = self.internal_tx_add_output(counterparty_node_id, msg);
16018-
let (mut persist, exited_quiescence) = match &res {
16019-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16020-
Ok(persist) => (*persist, false),
16023+
let exited_quiescence = match &res {
16024+
Err((err, exited_quiescence)) => {
16025+
debug_assert!(!err.closes_channel());
16026+
*exited_quiescence
16027+
},
16028+
Ok(_) => false,
1602116029
};
1602216030
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16031+
16032+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1602316033
if exited_quiescence {
1602416034
// Note that we're not able to do this inline in `internal_tx_add_output` as we
1602516035
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16035,11 +16045,16 @@ impl<
1603516045
fn handle_tx_remove_input(&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveInput) {
1603616046
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1603716047
let res = self.internal_tx_remove_input(counterparty_node_id, msg);
16038-
let (mut persist, exited_quiescence) = match &res {
16039-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16040-
Ok(persist) => (*persist, false),
16048+
let exited_quiescence = match &res {
16049+
Err((err, exited_quiescence)) => {
16050+
debug_assert!(!err.closes_channel());
16051+
*exited_quiescence
16052+
},
16053+
Ok(_) => false,
1604116054
};
1604216055
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16056+
16057+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1604316058
if exited_quiescence {
1604416059
// Note that we're not able to do this inline in `internal_tx_remove_input` as we
1604516060
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16055,11 +16070,16 @@ impl<
1605516070
fn handle_tx_remove_output(&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveOutput) {
1605616071
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1605716072
let res = self.internal_tx_remove_output(counterparty_node_id, msg);
16058-
let (mut persist, exited_quiescence) = match &res {
16059-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16060-
Ok(persist) => (*persist, false),
16073+
let exited_quiescence = match &res {
16074+
Err((err, exited_quiescence)) => {
16075+
debug_assert!(!err.closes_channel());
16076+
*exited_quiescence
16077+
},
16078+
Ok(_) => false,
1606116079
};
1606216080
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16081+
16082+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1606316083
if exited_quiescence {
1606416084
// Note that we're not able to do this inline in `internal_tx_remove_output` as we
1606516085
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16076,10 +16096,14 @@ impl<
1607616096
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1607716097
let res = self.internal_tx_complete(counterparty_node_id, msg);
1607816098
let (mut persist, exited_quiescence) = match &res {
16079-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16099+
Err((err, exited_quiescence)) => {
16100+
debug_assert!(!err.closes_channel());
16101+
(NotifyOption::SkipPersistHandleEvents, *exited_quiescence)
16102+
},
1608016103
Ok(persist) => (*persist, false),
1608116104
};
1608216105
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16106+
1608316107
if exited_quiescence {
1608416108
// Note that we're not able to do this inline in `internal_tx_complete` as we
1608516109
// usually do because we first need to send the `tx_abort` in `handle_error` above

0 commit comments

Comments
 (0)