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