@@ -372,15 +372,15 @@ where
372
372
CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ,
373
373
CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ,
374
374
) ? {
375
- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
375
+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
376
376
& mut io:: Cursor :: new ( kv_store. read (
377
377
CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ,
378
378
CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ,
379
379
& stored_key,
380
380
) ?) ,
381
381
( & * entropy_source, & * signer_provider) ,
382
382
) {
383
- Ok ( ( block_hash, channel_monitor) ) => {
383
+ Ok ( Some ( ( block_hash, channel_monitor) ) ) => {
384
384
let monitor_name = MonitorName :: from_str ( & stored_key) ?;
385
385
if channel_monitor. persistence_key ( ) != monitor_name {
386
386
return Err ( io:: Error :: new (
@@ -391,6 +391,7 @@ where
391
391
392
392
res. push ( ( block_hash, channel_monitor) ) ;
393
393
} ,
394
+ Ok ( None ) => { } ,
394
395
Err ( _) => {
395
396
return Err ( io:: Error :: new (
396
397
io:: ErrorKind :: InvalidData ,
@@ -783,9 +784,12 @@ where
783
784
let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
784
785
let monitor_list = self . 0 . kv_store . list ( primary, secondary) . await ?;
785
786
let mut res = Vec :: with_capacity ( monitor_list. len ( ) ) ;
786
- // TODO: Parallelize this loop
787
787
for monitor_key in monitor_list {
788
- res. push ( self . read_channel_monitor_with_updates ( monitor_key. as_str ( ) ) . await ?)
788
+ let result =
789
+ self . 0 . maybe_read_channel_monitor_with_updates ( monitor_key. as_str ( ) ) . await ?;
790
+ if let Some ( read_res) = result {
791
+ res. push ( read_res) ;
792
+ }
789
793
}
790
794
Ok ( res)
791
795
}
@@ -923,8 +927,29 @@ where
923
927
& self , monitor_key : & str ,
924
928
) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
925
929
{
930
+ match self . maybe_read_channel_monitor_with_updates ( monitor_key) . await ? {
931
+ Some ( res) => Ok ( res) ,
932
+ None => Err ( io:: Error :: new (
933
+ io:: ErrorKind :: InvalidData ,
934
+ "ChannelMonitor was stale, with no updates since LDK 0.0.118. \
935
+ It cannot be read by modern versions of LDK, though also does not contain any funds left to sweep. \
936
+ You should manually delete it instead",
937
+ ) ) ,
938
+ }
939
+ }
940
+
941
+ async fn maybe_read_channel_monitor_with_updates (
942
+ & self , monitor_key : & str ,
943
+ ) -> Result <
944
+ Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > ,
945
+ io:: Error ,
946
+ > {
926
947
let monitor_name = MonitorName :: from_str ( monitor_key) ?;
927
- let ( block_hash, monitor) = self . read_monitor ( & monitor_name, monitor_key) . await ?;
948
+ let read_res = self . maybe_read_monitor ( & monitor_name, monitor_key) . await ?;
949
+ let ( block_hash, monitor) = match read_res {
950
+ Some ( res) => res,
951
+ None => return Ok ( None ) ,
952
+ } ;
928
953
let mut current_update_id = monitor. get_latest_update_id ( ) ;
929
954
// TODO: Parallelize this loop by speculatively reading a batch of updates
930
955
loop {
@@ -955,14 +980,16 @@ where
955
980
io:: Error :: new ( io:: ErrorKind :: Other , "Monitor update failed" )
956
981
} ) ?;
957
982
}
958
- Ok ( ( block_hash, monitor) )
983
+ Ok ( Some ( ( block_hash, monitor) ) )
959
984
}
960
985
961
986
/// Read a channel monitor.
962
- async fn read_monitor (
987
+ async fn maybe_read_monitor (
963
988
& self , monitor_name : & MonitorName , monitor_key : & str ,
964
- ) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
965
- {
989
+ ) -> Result <
990
+ Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > ,
991
+ io:: Error ,
992
+ > {
966
993
let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ;
967
994
let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
968
995
let monitor_bytes = self . kv_store . read ( primary, secondary, monitor_key) . await ?;
@@ -971,11 +998,12 @@ where
971
998
if monitor_cursor. get_ref ( ) . starts_with ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL ) {
972
999
monitor_cursor. set_position ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL . len ( ) as u64 ) ;
973
1000
}
974
- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
1001
+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
975
1002
& mut monitor_cursor,
976
1003
( & * self . entropy_source , & * self . signer_provider ) ,
977
1004
) {
978
- Ok ( ( blockhash, channel_monitor) ) => {
1005
+ Ok ( None ) => Ok ( None ) ,
1006
+ Ok ( Some ( ( blockhash, channel_monitor) ) ) => {
979
1007
if channel_monitor. persistence_key ( ) != * monitor_name {
980
1008
log_error ! (
981
1009
self . logger,
@@ -987,7 +1015,7 @@ where
987
1015
"ChannelMonitor was stored under the wrong key" ,
988
1016
) )
989
1017
} else {
990
- Ok ( ( blockhash, channel_monitor) )
1018
+ Ok ( Some ( ( blockhash, channel_monitor) ) )
991
1019
}
992
1020
} ,
993
1021
Err ( e) => {
@@ -1027,9 +1055,14 @@ where
1027
1055
let monitor_keys = self . kv_store . list ( primary, secondary) . await ?;
1028
1056
for monitor_key in monitor_keys {
1029
1057
let monitor_name = MonitorName :: from_str ( & monitor_key) ?;
1030
- let ( _, current_monitor) = self . read_monitor ( & monitor_name, & monitor_key) . await ?;
1031
- let latest_update_id = current_monitor. get_latest_update_id ( ) ;
1032
- self . cleanup_stale_updates_for_monitor_to ( & monitor_key, latest_update_id) . await ?;
1058
+ let maybe_monitor = self . maybe_read_monitor ( & monitor_name, & monitor_key) . await ?;
1059
+ if let Some ( ( _, current_monitor) ) = maybe_monitor {
1060
+ let latest_update_id = current_monitor. get_latest_update_id ( ) ;
1061
+ self . cleanup_stale_updates_for_monitor_to ( & monitor_key, latest_update_id) . await ?;
1062
+ } else {
1063
+ // TODO: Also clean up super stale monitors (created pre-0.0.110 and last updated
1064
+ // pre-0.0.116).
1065
+ }
1033
1066
}
1034
1067
Ok ( ( ) )
1035
1068
}
0 commit comments