@@ -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 }
@@ -923,8 +927,29 @@ where
923927 & self , monitor_key : & str ,
924928 ) -> Result < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) , io:: Error >
925929 {
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+ > {
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,14 +980,16 @@ 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 >
965- {
989+ ) -> Result <
990+ Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > ,
991+ io:: Error ,
992+ > {
966993 let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE ;
967994 let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE ;
968995 let monitor_bytes = self . kv_store . read ( primary, secondary, monitor_key) . await ?;
@@ -971,11 +998,12 @@ where
971998 if monitor_cursor. get_ref ( ) . starts_with ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL ) {
972999 monitor_cursor. set_position ( MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL . len ( ) as u64 ) ;
9731000 }
974- match <( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) >:: read (
1001+ match <Option < ( BlockHash , ChannelMonitor < <SP :: Target as SignerProvider >:: EcdsaSigner > ) > >:: read (
9751002 & mut monitor_cursor,
9761003 ( & * self . entropy_source , & * self . signer_provider ) ,
9771004 ) {
978- Ok ( ( blockhash, channel_monitor) ) => {
1005+ Ok ( None ) => Ok ( None ) ,
1006+ Ok ( Some ( ( blockhash, channel_monitor) ) ) => {
9791007 if channel_monitor. persistence_key ( ) != * monitor_name {
9801008 log_error ! (
9811009 self . logger,
@@ -987,7 +1015,7 @@ where
9871015 "ChannelMonitor was stored under the wrong key" ,
9881016 ) )
9891017 } else {
990- Ok ( ( blockhash, channel_monitor) )
1018+ Ok ( Some ( ( blockhash, channel_monitor) ) )
9911019 }
9921020 } ,
9931021 Err ( e) => {
@@ -1027,9 +1055,14 @@ where
10271055 let monitor_keys = self . kv_store . list ( primary, secondary) . await ?;
10281056 for monitor_key in monitor_keys {
10291057 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+ }
10331066 }
10341067 Ok ( ( ) )
10351068 }
0 commit comments