Skip to content

Commit 42766a1

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 b87e63f commit 42766a1

File tree

1 file changed

+43
-43
lines changed

1 file changed

+43
-43
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2935,6 +2935,22 @@ impl<'a> PersistenceNotifierGuard<'a, fn() -> NotifyOption> {
29352935
Self::optionally_notify(cm, || -> NotifyOption { NotifyOption::DoPersist })
29362936
}
29372937

2938+
fn manually_notify<F: FnOnce(), C: AChannelManager>(
2939+
cm: &'a C, f: F,
2940+
) -> PersistenceNotifierGuard<'a, impl FnOnce() -> NotifyOption> {
2941+
let read_guard = cm.get_cm().total_consistency_lock.read().unwrap();
2942+
let force_notify = cm.get_cm().process_background_events();
2943+
2944+
f();
2945+
2946+
PersistenceNotifierGuard {
2947+
event_persist_notifier: &cm.get_cm().event_persist_notifier,
2948+
needs_persist_flag: &cm.get_cm().needs_persist_flag,
2949+
should_persist: Some(move || force_notify),
2950+
_read_guard: read_guard,
2951+
}
2952+
}
2953+
29382954
fn optionally_notify<F: FnOnce() -> NotifyOption, C: AChannelManager>(
29392955
cm: &'a C, persist_check: F,
29402956
) -> PersistenceNotifierGuard<'a, impl FnOnce() -> NotifyOption> {
@@ -11250,7 +11266,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1125011266
>(
1125111267
&self, counterparty_node_id: &PublicKey, channel_id: ChannelId,
1125211268
tx_msg_handler: HandleTxMsgFn,
11253-
) -> Result<NotifyOption, MsgHandleErrInternal> {
11269+
) -> Result<(), MsgHandleErrInternal> {
1125411270
let per_peer_state = self.per_peer_state.read().unwrap();
1125511271
let peer_state_mutex = per_peer_state.get(counterparty_node_id).ok_or_else(|| {
1125611272
debug_assert!(false);
@@ -11265,7 +11281,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1126511281
Ok(msg_send) => {
1126611282
let msg_send_event = msg_send.into_msg_send_event(*counterparty_node_id);
1126711283
peer_state.pending_msg_events.push(msg_send_event);
11268-
Ok(NotifyOption::SkipPersistHandleEvents)
11284+
Ok(())
1126911285
},
1127011286
Err(InteractiveTxMsgError {
1127111287
err,
@@ -11303,39 +11319,39 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1130311319

1130411320
fn internal_tx_add_input(
1130511321
&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddInput,
11306-
) -> Result<NotifyOption, MsgHandleErrInternal> {
11322+
) -> Result<(), MsgHandleErrInternal> {
1130711323
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1130811324
channel.tx_add_input(msg, &self.logger)
1130911325
})
1131011326
}
1131111327

1131211328
fn internal_tx_add_output(
1131311329
&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddOutput,
11314-
) -> Result<NotifyOption, MsgHandleErrInternal> {
11330+
) -> Result<(), MsgHandleErrInternal> {
1131511331
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1131611332
channel.tx_add_output(msg, &self.logger)
1131711333
})
1131811334
}
1131911335

1132011336
fn internal_tx_remove_input(
1132111337
&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveInput,
11322-
) -> Result<NotifyOption, MsgHandleErrInternal> {
11338+
) -> Result<(), MsgHandleErrInternal> {
1132311339
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1132411340
channel.tx_remove_input(msg, &self.logger)
1132511341
})
1132611342
}
1132711343

1132811344
fn internal_tx_remove_output(
1132911345
&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveOutput,
11330-
) -> Result<NotifyOption, MsgHandleErrInternal> {
11346+
) -> Result<(), MsgHandleErrInternal> {
1133111347
self.internal_tx_msg(&counterparty_node_id, msg.channel_id, |channel: &mut Channel<SP>| {
1133211348
channel.tx_remove_output(msg, &self.logger)
1133311349
})
1133411350
}
1133511351

1133611352
fn internal_tx_complete(
1133711353
&self, counterparty_node_id: PublicKey, msg: &msgs::TxComplete,
11338-
) -> Result<NotifyOption, MsgHandleErrInternal> {
11354+
) -> Result<(), MsgHandleErrInternal> {
1133911355
let per_peer_state = self.per_peer_state.read().unwrap();
1134011356
let peer_state_mutex = per_peer_state.get(&counterparty_node_id).ok_or_else(|| {
1134111357
debug_assert!(false);
@@ -11348,15 +11364,12 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1134811364
let chan = chan_entry.get_mut();
1134911365
match chan.tx_complete(msg, &self.fee_estimator, &self.logger) {
1135011366
Ok(tx_complete_result) => {
11351-
let mut persist = NotifyOption::SkipPersistNoEvents;
11352-
1135311367
if let Some(interactive_tx_msg_send) =
1135411368
tx_complete_result.interactive_tx_msg_send
1135511369
{
1135611370
let msg_send_event =
1135711371
interactive_tx_msg_send.into_msg_send_event(counterparty_node_id);
1135811372
peer_state.pending_msg_events.push(msg_send_event);
11359-
persist = NotifyOption::SkipPersistHandleEvents;
1136011373
};
1136111374

1136211375
if let Some(unsigned_transaction) = tx_complete_result.event_unsigned_tx {
@@ -11370,7 +11383,8 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1137011383
None,
1137111384
));
1137211385
// We have a successful signing session that we need to persist.
11373-
persist = NotifyOption::DoPersist;
11386+
self.needs_persist_flag.store(true, Ordering::Release);
11387+
self.event_persist_notifier.notify()
1137411388
}
1137511389

1137611390
if let Some(FundingTxSigned {
@@ -11415,10 +11429,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1141511429
}
1141611430

1141711431
// We have a successful signing session that we need to persist.
11418-
persist = NotifyOption::DoPersist;
11432+
self.needs_persist_flag.store(true, Ordering::Release);
11433+
self.event_persist_notifier.notify()
1141911434
}
1142011435

11421-
Ok(persist)
11436+
Ok(())
1142211437
},
1142311438
Err(InteractiveTxMsgError {
1142411439
err,
@@ -16016,62 +16031,47 @@ impl<
1601616031
}
1601716032

1601816033
fn handle_tx_add_input(&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddInput) {
16019-
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
16034+
let _persistence_guard = PersistenceNotifierGuard::manually_notify(self, || {
1602016035
let res = self.internal_tx_add_input(counterparty_node_id, msg);
16021-
let persist = match &res {
16022-
Err(_) => NotifyOption::DoPersist,
16023-
Ok(persist) => *persist,
16024-
};
16036+
debug_assert!(res.as_ref().err().map_or(true, |err| !err.closes_channel()));
1602516037
let _ = self.handle_error(res, counterparty_node_id);
16026-
persist
16038+
self.event_persist_notifier.notify();
1602716039
});
1602816040
}
1602916041

1603016042
fn handle_tx_add_output(&self, counterparty_node_id: PublicKey, msg: &msgs::TxAddOutput) {
16031-
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
16043+
let _persistence_guard = PersistenceNotifierGuard::manually_notify(self, || {
1603216044
let res = self.internal_tx_add_output(counterparty_node_id, msg);
16033-
let persist = match &res {
16034-
Err(_) => NotifyOption::DoPersist,
16035-
Ok(persist) => *persist,
16036-
};
16045+
debug_assert!(res.as_ref().err().map_or(true, |err| !err.closes_channel()));
1603716046
let _ = self.handle_error(res, counterparty_node_id);
16038-
persist
16047+
self.event_persist_notifier.notify();
1603916048
});
1604016049
}
1604116050

1604216051
fn handle_tx_remove_input(&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveInput) {
16043-
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
16052+
let _persistence_guard = PersistenceNotifierGuard::manually_notify(self, || {
1604416053
let res = self.internal_tx_remove_input(counterparty_node_id, msg);
16045-
let persist = match &res {
16046-
Err(_) => NotifyOption::DoPersist,
16047-
Ok(persist) => *persist,
16048-
};
16054+
debug_assert!(res.as_ref().err().map_or(true, |err| !err.closes_channel()));
1604916055
let _ = self.handle_error(res, counterparty_node_id);
16050-
persist
16056+
self.event_persist_notifier.notify();
1605116057
});
1605216058
}
1605316059

1605416060
fn handle_tx_remove_output(&self, counterparty_node_id: PublicKey, msg: &msgs::TxRemoveOutput) {
16055-
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
16061+
let _persistence_guard = PersistenceNotifierGuard::manually_notify(self, || {
1605616062
let res = self.internal_tx_remove_output(counterparty_node_id, msg);
16057-
let persist = match &res {
16058-
Err(_) => NotifyOption::DoPersist,
16059-
Ok(persist) => *persist,
16060-
};
16063+
debug_assert!(res.as_ref().err().map_or(true, |err| !err.closes_channel()));
1606116064
let _ = self.handle_error(res, counterparty_node_id);
16062-
persist
16065+
self.event_persist_notifier.notify();
1606316066
});
1606416067
}
1606516068

1606616069
fn handle_tx_complete(&self, counterparty_node_id: PublicKey, msg: &msgs::TxComplete) {
16067-
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
16070+
let _persistence_guard = PersistenceNotifierGuard::manually_notify(self, || {
1606816071
let res = self.internal_tx_complete(counterparty_node_id, msg);
16069-
let persist = match &res {
16070-
Err(_) => NotifyOption::DoPersist,
16071-
Ok(persist) => *persist,
16072-
};
16072+
debug_assert!(res.as_ref().err().map_or(true, |err| !err.closes_channel()));
1607316073
let _ = self.handle_error(res, counterparty_node_id);
16074-
persist
16074+
self.event_persist_notifier.notify();
1607516075
});
1607616076
}
1607716077

0 commit comments

Comments
 (0)