@@ -372,15 +372,15 @@ where
372372 CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ,
373373 CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ,
374374 ) ? {
375- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
375+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
376376 & mut io:: Cursor :: new ( kv_store. read (
377377 CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ,
378378 CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ,
379379 & stored_key,
380380 ) ?) ,
381381 ( & * entropy_source, & * signer_provider) ,
382382 ) {
383- Ok ( ( block_hash, channel_monitor) ) => {
383+ Ok ( Some ( ( block_hash, channel_monitor) ) ) => {
384384 let monitor_name = MonitorName :: from_str ( & stored_key) ?;
385385 if channel_monitor. persistence_key ( ) != monitor_name {
386386 return Err ( io:: Error :: new (
@@ -391,6 +391,7 @@ where
391391
392392 res. push ( ( block_hash, channel_monitor) ) ;
393393 } ,
394+ Ok ( None ) => { } ,
394395 Err ( _) => {
395396 return Err ( io:: Error :: new (
396397 io:: ErrorKind :: InvalidData ,
@@ -783,9 +784,11 @@ where
783784 let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
784785 let monitor_list = self . 0 . kv_store . list ( primary, secondary) . await ?;
785786 let mut res = Vec :: with_capacity ( monitor_list. len ( ) ) ;
786- // TODO: Parallelize this loop
787787 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+ }
789792 }
790793 Ok ( res)
791794 }
@@ -922,9 +925,30 @@ where
922925 pub async fn read_channel_monitor_with_updates (
923926 & self , monitor_key : & str ,
924927 ) -> 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 >
925945 {
926946 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+ } ;
928952 let mut current_update_id = monitor. get_latest_update_id ( ) ;
929953 // TODO: Parallelize this loop by speculatively reading a batch of updates
930954 loop {
@@ -955,13 +979,13 @@ where
955979 io:: Error :: new ( io:: ErrorKind :: Other , "Monitor update failed" )
956980 } ) ?;
957981 }
958- Ok ( ( block_hash, monitor) )
982+ Ok ( Some ( ( block_hash, monitor) ) )
959983 }
960984
961985 /// Read a channel monitor.
962- async fn read_monitor (
986+ async fn maybe_read_monitor (
963987 & 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 >
965989 {
966990 let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ;
967991 let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
@@ -971,11 +995,12 @@ where
971995 if monitor_cursor. get_ref ( ) . starts_with ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL ) {
972996 monitor_cursor. set_position ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL . len ( ) as u64 ) ;
973997 }
974- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
998+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
975999 & mut monitor_cursor,
9761000 ( & * self . entropy_source , & * self . signer_provider ) ,
9771001 ) {
978- Ok ( ( blockhash, channel_monitor) ) => {
1002+ Ok ( None ) => Ok ( None ) ,
1003+ Ok ( Some ( ( blockhash, channel_monitor) ) ) => {
9791004 if channel_monitor. persistence_key ( ) != * monitor_name {
9801005 log_error ! (
9811006 self . logger,
@@ -987,7 +1012,7 @@ where
9871012 "ChannelMonitor was stored under the wrong key" ,
9881013 ) )
9891014 } else {
990- Ok ( ( blockhash, channel_monitor) )
1015+ Ok ( Some ( ( blockhash, channel_monitor) ) )
9911016 }
9921017 } ,
9931018 Err ( e) => {
@@ -1027,9 +1052,14 @@ where
10271052 let monitor_keys = self . kv_store . list ( primary, secondary) . await ?;
10281053 for monitor_key in monitor_keys {
10291054 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+ }
10331063 }
10341064 Ok ( ( ) )
10351065 }
0 commit comments