@@ -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