Skip to content

Commit d1ea893

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 4d72cbe commit d1ea893

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 = match per_peer_state.get(counterparty_node_id) {
1120211202
Some(peer_state_mutex) => peer_state_mutex,
@@ -11217,7 +11217,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1121711217
Ok(msg_send) => {
1121811218
let msg_send_event = msg_send.into_msg_send_event(*counterparty_node_id);
1121911219
peer_state.pending_msg_events.push(msg_send_event);
11220-
Ok(NotifyOption::SkipPersistHandleEvents)
11220+
Ok(())
1122111221
},
1122211222
Err(InteractiveTxMsgError {
1122311223
err,
@@ -11257,31 +11257,31 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1125711257

1125811258
fn internal_tx_add_input(
1125911259
&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddInput,
11260-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11260+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1126111261
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1126211262
channel.tx_add_input(msg, &self.logger)
1126311263
})
1126411264
}
1126511265

1126611266
fn internal_tx_add_output(
1126711267
&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddOutput,
11268-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11268+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1126911269
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1127011270
channel.tx_add_output(msg, &self.logger)
1127111271
})
1127211272
}
1127311273

1127411274
fn internal_tx_remove_input(
1127511275
&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveInput,
11276-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11276+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1127711277
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1127811278
channel.tx_remove_input(msg, &self.logger)
1127911279
})
1128011280
}
1128111281

1128211282
fn internal_tx_remove_output(
1128311283
&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveOutput,
11284-
) -> Result<NotifyOption, (MsgHandleErrInternal, bool)> {
11284+
) -> Result<(), (MsgHandleErrInternal, bool)> {
1128511285
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1128611286
channel.tx_remove_output(msg, &self.logger)
1128711287
})
@@ -16007,11 +16007,16 @@ impl<
1600716007
fn handle_tx_add_input(&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddInput) {
1600816008
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1600916009
let res = self.internal_tx_add_input(counterparty_node_id, msg);
16010-
let (mut persist, exited_quiescence) = match &res {
16011-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16012-
Ok(persist) => (*persist, false),
16010+
let exited_quiescence = match &res {
16011+
Err((err, exited_quiescence)) => {
16012+
debug_assert!(!err.closes_channel());
16013+
*exited_quiescence
16014+
},
16015+
Ok(_) => false,
1601316016
};
1601416017
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16018+
16019+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1601516020
if exited_quiescence {
1601616021
// Note that we're not able to do this inline in `internal_tx_add_input` as we
1601716022
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16027,11 +16032,16 @@ impl<
1602716032
fn handle_tx_add_output(&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddOutput) {
1602816033
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1602916034
let res = self.internal_tx_add_output(counterparty_node_id, msg);
16030-
let (mut persist, exited_quiescence) = match &res {
16031-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16032-
Ok(persist) => (*persist, false),
16035+
let exited_quiescence = match &res {
16036+
Err((err, exited_quiescence)) => {
16037+
debug_assert!(!err.closes_channel());
16038+
*exited_quiescence
16039+
},
16040+
Ok(_) => false,
1603316041
};
1603416042
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16043+
16044+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1603516045
if exited_quiescence {
1603616046
// Note that we're not able to do this inline in `internal_tx_add_output` as we
1603716047
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16047,11 +16057,16 @@ impl<
1604716057
fn handle_tx_remove_input(&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveInput) {
1604816058
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1604916059
let res = self.internal_tx_remove_input(counterparty_node_id, msg);
16050-
let (mut persist, exited_quiescence) = match &res {
16051-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16052-
Ok(persist) => (*persist, false),
16060+
let exited_quiescence = match &res {
16061+
Err((err, exited_quiescence)) => {
16062+
debug_assert!(!err.closes_channel());
16063+
*exited_quiescence
16064+
},
16065+
Ok(_) => false,
1605316066
};
1605416067
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16068+
16069+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1605516070
if exited_quiescence {
1605616071
// Note that we're not able to do this inline in `internal_tx_remove_input` as we
1605716072
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16067,11 +16082,16 @@ impl<
1606716082
fn handle_tx_remove_output(&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveOutput) {
1606816083
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1606916084
let res = self.internal_tx_remove_output(counterparty_node_id, msg);
16070-
let (mut persist, exited_quiescence) = match &res {
16071-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16072-
Ok(persist) => (*persist, false),
16085+
let exited_quiescence = match &res {
16086+
Err((err, exited_quiescence)) => {
16087+
debug_assert!(!err.closes_channel());
16088+
*exited_quiescence
16089+
},
16090+
Ok(_) => false,
1607316091
};
1607416092
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16093+
16094+
let mut persist = NotifyOption::SkipPersistHandleEvents;
1607516095
if exited_quiescence {
1607616096
// Note that we're not able to do this inline in `internal_tx_remove_output` as we
1607716097
// usually do because we first need to send the `tx_abort` in `handle_error` above
@@ -16088,10 +16108,14 @@ impl<
1608816108
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
1608916109
let res = self.internal_tx_complete(counterparty_node_id, msg);
1609016110
let (mut persist, exited_quiescence) = match &res {
16091-
Err((_, exited_quiescence)) => (NotifyOption::DoPersist, *exited_quiescence),
16111+
Err((err, exited_quiescence)) => {
16112+
debug_assert!(!err.closes_channel());
16113+
(NotifyOption::SkipPersistHandleEvents, *exited_quiescence)
16114+
},
1609216115
Ok(persist) => (*persist, false),
1609316116
};
1609416117
let _ = self.handle_error(res.map_err(|(err, _)| err), counterparty_node_id);
16118+
1609516119
if exited_quiescence {
1609616120
// Note that we're not able to do this inline in `internal_tx_complete` as we
1609716121
// usually do because we first need to send the `tx_abort` in `handle_error` above

0 commit comments

Comments
 (0)