@@ -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,12 @@ 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 =
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+ }
789793 }
790794 Ok ( res)
791795 }
@@ -922,9 +926,30 @@ where
922926 pub async fn read_channel_monitor_with_updates (
923927 & self , monitor_key : & str ,
924928 ) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
929+ {
930+ match self . maybe_read_channel_monitor_with_updates ( monitor_key) . await ? {
931+ Some ( res) => Ok ( res) ,
932+ None => {
933+ Err ( io:: Error :: new (
934+ io:: ErrorKind :: InvalidData ,
935+ "ChannelMonitor was stale, with no updates since LDK 0.0.118.\
936+ It cannot be read by modern versions of LDK, though also does not contain any funds left to sweep.\
937+ You should manually delete it instead",
938+ ) )
939+ } ,
940+ }
941+ }
942+
943+ async fn maybe_read_channel_monitor_with_updates (
944+ & self , monitor_key : & str ,
945+ ) -> Result < Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > , io:: Error >
925946 {
926947 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+ } ;
928953 let mut current_update_id = monitor. get_latest_update_id ( ) ;
929954 // TODO: Parallelize this loop by speculatively reading a batch of updates
930955 loop {
@@ -955,13 +980,13 @@ where
955980 io:: Error :: new ( io:: ErrorKind :: Other , "Monitor update failed" )
956981 } ) ?;
957982 }
958- Ok ( ( block_hash, monitor) )
983+ Ok ( Some ( ( block_hash, monitor) ) )
959984 }
960985
961986 /// Read a channel monitor.
962- async fn read_monitor (
987+ async fn maybe_read_monitor (
963988 & self , monitor_name : & MonitorName , monitor_key : & str ,
964- ) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
989+ ) -> Result < Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > , io:: Error >
965990 {
966991 let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ;
967992 let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
@@ -971,11 +996,12 @@ where
971996 if monitor_cursor. get_ref ( ) . starts_with ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL ) {
972997 monitor_cursor. set_position ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL . len ( ) as u64 ) ;
973998 }
974- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
999+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
9751000 & mut monitor_cursor,
9761001 ( & * self . entropy_source , & * self . signer_provider ) ,
9771002 ) {
978- Ok ( ( blockhash, channel_monitor) ) => {
1003+ Ok ( None ) => Ok ( None ) ,
1004+ Ok ( Some ( ( blockhash, channel_monitor) ) ) => {
9791005 if channel_monitor. persistence_key ( ) != * monitor_name {
9801006 log_error ! (
9811007 self . logger,
@@ -987,7 +1013,7 @@ where
9871013 "ChannelMonitor was stored under the wrong key" ,
9881014 ) )
9891015 } else {
990- Ok ( ( blockhash, channel_monitor) )
1016+ Ok ( Some ( ( blockhash, channel_monitor) ) )
9911017 }
9921018 } ,
9931019 Err ( e) => {
@@ -1027,9 +1053,14 @@ where
10271053 let monitor_keys = self . kv_store . list ( primary, secondary) . await ?;
10281054 for monitor_key in monitor_keys {
10291055 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 ?;
1056+ let maybe_monitor = self . maybe_read_monitor ( & monitor_name, & monitor_key) . await ?;
1057+ if let Some ( ( _, current_monitor) ) = maybe_monitor {
1058+ let latest_update_id = current_monitor. get_latest_update_id ( ) ;
1059+ self . cleanup_stale_updates_for_monitor_to ( & monitor_key, latest_update_id) . await ?;
1060+ } else {
1061+ // TODO: Also clean up super stale monitors (created pre-0.0.110 and last updated
1062+ // pre-0.0.116).
1063+ }
10331064 }
10341065 Ok ( ( ) )
10351066 }
0 commit comments