@@ -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,11 @@ 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 = self . maybe_read_channel_monitor_with_updates ( monitor_key. as_str ( ) ) . await ?;
789
+ if let Some ( read_res) = result {
790
+ res. push ( read_res) ;
791
+ }
789
792
}
790
793
Ok ( res)
791
794
}
@@ -922,9 +925,30 @@ where
922
925
pub async fn read_channel_monitor_with_updates (
923
926
& self , monitor_key : & str ,
924
927
) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
928
+ {
929
+ match self . maybe_read_channel_monitor_with_updates ( monitor_key) . await ? {
930
+ Some ( res) => Ok ( res) ,
931
+ None => {
932
+ 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
+
942
+ async fn maybe_read_channel_monitor_with_updates (
943
+ & self , monitor_key : & str ,
944
+ ) -> Result < Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > , io:: Error >
925
945
{
926
946
let monitor_name = MonitorName :: from_str ( monitor_key) ?;
927
- let ( block_hash, monitor) = self . read_monitor ( & monitor_name, monitor_key) . await ?;
947
+ let read_res = self . maybe_read_monitor ( & monitor_name, monitor_key) . await ?;
948
+ let ( block_hash, monitor) = match read_res {
949
+ Some ( res) => res,
950
+ None => return Ok ( None ) ,
951
+ } ;
928
952
let mut current_update_id = monitor. get_latest_update_id ( ) ;
929
953
// TODO: Parallelize this loop by speculatively reading a batch of updates
930
954
loop {
@@ -955,13 +979,13 @@ where
955
979
io:: Error :: new ( io:: ErrorKind :: Other , "Monitor update failed" )
956
980
} ) ?;
957
981
}
958
- Ok ( ( block_hash, monitor) )
982
+ Ok ( Some ( ( block_hash, monitor) ) )
959
983
}
960
984
961
985
/// Read a channel monitor.
962
- async fn read_monitor (
986
+ async fn maybe_read_monitor (
963
987
& self , monitor_name : & MonitorName , monitor_key : & str ,
964
- ) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
988
+ ) -> Result < Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > , io:: Error >
965
989
{
966
990
let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ;
967
991
let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
@@ -971,11 +995,12 @@ where
971
995
if monitor_cursor. get_ref ( ) . starts_with ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL ) {
972
996
monitor_cursor. set_position ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL . len ( ) as u64 ) ;
973
997
}
974
- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
998
+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
975
999
& mut monitor_cursor,
976
1000
( & * self . entropy_source , & * self . signer_provider ) ,
977
1001
) {
978
- Ok ( ( blockhash, channel_monitor) ) => {
1002
+ Ok ( None ) => Ok ( None ) ,
1003
+ Ok ( Some ( ( blockhash, channel_monitor) ) ) => {
979
1004
if channel_monitor. persistence_key ( ) != * monitor_name {
980
1005
log_error ! (
981
1006
self . logger,
@@ -987,7 +1012,7 @@ where
987
1012
"ChannelMonitor was stored under the wrong key" ,
988
1013
) )
989
1014
} else {
990
- Ok ( ( blockhash, channel_monitor) )
1015
+ Ok ( Some ( ( blockhash, channel_monitor) ) )
991
1016
}
992
1017
} ,
993
1018
Err ( e) => {
@@ -1027,9 +1052,14 @@ where
1027
1052
let monitor_keys = self . kv_store . list ( primary, secondary) . await ?;
1028
1053
for monitor_key in monitor_keys {
1029
1054
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 ?;
1055
+ let maybe_monitor = self . maybe_read_monitor ( & monitor_name, & monitor_key) . await ?;
1056
+ if let Some ( ( _, current_monitor) ) = maybe_monitor {
1057
+ let latest_update_id = current_monitor. get_latest_update_id ( ) ;
1058
+ self . cleanup_stale_updates_for_monitor_to ( & monitor_key, latest_update_id) . await ?;
1059
+ } else {
1060
+ // TODO: Also clean up super stale monitors (created pre-0.0.110 and last updated
1061
+ // pre-0.0.116).
1062
+ }
1033
1063
}
1034
1064
Ok ( ( ) )
1035
1065
}
0 commit comments