@@ -202,16 +202,24 @@ where
202
202
& self , counterparty_node_id : PublicKey ,
203
203
) -> Result < ( ) , lightning:: io:: Error > {
204
204
let encoded = {
205
- let outer_state_lock = self . per_peer_state . read ( ) . unwrap ( ) ;
206
- match outer_state_lock. get ( & counterparty_node_id) {
205
+ let mut outer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
206
+ match outer_state_lock. get_mut ( & counterparty_node_id) {
207
207
None => {
208
208
let err = lightning:: io:: Error :: new (
209
209
lightning:: io:: ErrorKind :: Other ,
210
210
"Failed to get peer entry" ,
211
211
) ;
212
212
return Err ( err) ;
213
213
} ,
214
- Some ( entry) => entry. encode ( ) ,
214
+ Some ( entry) => {
215
+ if !entry. needs_persist {
216
+ // We already have persisted otherwise by now.
217
+ return Ok ( ( ) ) ;
218
+ } else {
219
+ entry. needs_persist = false ;
220
+ entry. encode ( )
221
+ }
222
+ } ,
215
223
}
216
224
} ;
217
225
@@ -225,6 +233,14 @@ where
225
233
encoded,
226
234
)
227
235
. await
236
+ . map_err ( |e| {
237
+ self . per_peer_state
238
+ . write ( )
239
+ . unwrap ( )
240
+ . get_mut ( & counterparty_node_id)
241
+ . map ( |p| p. needs_persist = true ) ;
242
+ e
243
+ } )
228
244
}
229
245
230
246
pub ( crate ) async fn persist ( & self ) -> Result < ( ) , lightning:: io:: Error > {
@@ -233,7 +249,10 @@ where
233
249
// time.
234
250
let need_persist: Vec < PublicKey > = {
235
251
let outer_state_lock = self . per_peer_state . read ( ) . unwrap ( ) ;
236
- outer_state_lock. iter ( ) . filter_map ( |( k, v) | Some ( * k) ) . collect ( )
252
+ outer_state_lock
253
+ . iter ( )
254
+ . filter_map ( |( k, v) | if v. needs_persist { Some ( * k) } else { None } )
255
+ . collect ( )
237
256
} ;
238
257
239
258
for counterparty_node_id in need_persist. into_iter ( ) {
@@ -260,6 +279,7 @@ where
260
279
// Don't prune clients with open channels
261
280
return true ;
262
281
}
282
+ // TODO: Remove peer state entry from the KVStore
263
283
!peer_state. prune_stale_webhooks ( now)
264
284
} ) ;
265
285
* last_pruning = Some ( now) ;
@@ -290,6 +310,7 @@ where
290
310
webhook. url = params. webhook . clone ( ) ;
291
311
webhook. last_used = now;
292
312
webhook. last_notification_sent = None ;
313
+ peer_state. needs_persist |= true ;
293
314
}
294
315
} else {
295
316
if num_webhooks >= self . config . max_webhooks_per_client as usize {
@@ -650,22 +671,28 @@ where
650
671
}
651
672
}
652
673
653
- #[ derive( Debug , Default ) ]
674
+ #[ derive( Debug ) ]
654
675
pub ( crate ) struct PeerState {
655
676
webhooks : Vec < ( LSPS5AppName , Webhook ) > ,
677
+ needs_persist : bool ,
656
678
}
657
679
658
680
impl PeerState {
659
681
fn webhook_mut ( & mut self , name : & LSPS5AppName ) -> Option < & mut Webhook > {
660
- self . webhooks . iter_mut ( ) . find_map ( |( n, h) | if n == name { Some ( h) } else { None } )
682
+ let res =
683
+ self . webhooks . iter_mut ( ) . find_map ( |( n, h) | if n == name { Some ( h) } else { None } ) ;
684
+ self . needs_persist |= true ;
685
+ res
661
686
}
662
687
663
688
fn webhooks ( & self ) -> & Vec < ( LSPS5AppName , Webhook ) > {
664
689
& self . webhooks
665
690
}
666
691
667
692
fn webhooks_mut ( & mut self ) -> & mut Vec < ( LSPS5AppName , Webhook ) > {
668
- & mut self . webhooks
693
+ let res = & mut self . webhooks ;
694
+ self . needs_persist |= true ;
695
+ res
669
696
}
670
697
671
698
fn webhooks_len ( & self ) -> usize {
@@ -685,6 +712,7 @@ impl PeerState {
685
712
}
686
713
687
714
self . webhooks . push ( ( name, hook) ) ;
715
+ self . needs_persist |= true ;
688
716
}
689
717
690
718
fn remove_webhook ( & mut self , name : & LSPS5AppName ) -> bool {
@@ -697,13 +725,15 @@ impl PeerState {
697
725
false
698
726
}
699
727
} ) ;
728
+ self . needs_persist |= true ;
700
729
removed
701
730
}
702
731
703
732
fn reset_notification_cooldown ( & mut self ) {
704
733
for ( _, h) in self . webhooks . iter_mut ( ) {
705
734
h. last_notification_sent = None ;
706
735
}
736
+ self . needs_persist |= true ;
707
737
}
708
738
709
739
// Returns whether the entire state is empty and can be pruned.
@@ -716,6 +746,16 @@ impl PeerState {
716
746
}
717
747
}
718
748
749
+ impl Default for PeerState {
750
+ fn default ( ) -> Self {
751
+ let webhooks = Vec :: new ( ) ;
752
+ let needs_persist = true ;
753
+ Self { webhooks, needs_persist }
754
+ }
755
+ }
756
+
719
757
impl_writeable_tlv_based ! ( PeerState , {
720
758
( 0 , webhooks, required) ,
759
+ ( _unused, needs_persist, ( static_value, false ) ) ,
760
+
721
761
} ) ;
0 commit comments