@@ -350,7 +350,7 @@ where
350350 L :: Target : Logger ,
351351 O :: Target : OutputSpender ,
352352{
353- sweeper_state : Mutex < SweeperState > ,
353+ sweeper_state : Mutex < RuntimeSweeperState > ,
354354 broadcaster : B ,
355355 fee_estimator : E ,
356356 chain_data_source : Option < F > ,
@@ -497,7 +497,10 @@ where
497497 output_spender : O , change_destination_source : D , kv_store : K , logger : L ,
498498 ) -> Self {
499499 let outputs = Vec :: new ( ) ;
500- let sweeper_state = Mutex :: new ( SweeperState { outputs, best_block, sweep_pending : false } ) ;
500+ let sweeper_state = Mutex :: new ( RuntimeSweeperState {
501+ persistent : SweeperState { outputs, best_block } ,
502+ sweep_pending : false ,
503+ } ) ;
501504 Self {
502505 sweeper_state,
503506 broadcaster,
@@ -541,7 +544,7 @@ where
541544 return Ok ( ( ) ) ;
542545 }
543546
544- let mut state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
547+ let state_lock = & mut self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
545548 for descriptor in relevant_descriptors {
546549 let output_info = TrackedSpendableOutput {
547550 descriptor,
@@ -558,20 +561,20 @@ where
558561
559562 state_lock. outputs . push ( output_info) ;
560563 }
561- self . persist_state ( & * state_lock) . map_err ( |e| {
564+ self . persist_state ( & state_lock) . map_err ( |e| {
562565 log_error ! ( self . logger, "Error persisting OutputSweeper: {:?}" , e) ;
563566 } )
564567 }
565568
566569 /// Returns a list of the currently tracked spendable outputs.
567570 pub fn tracked_spendable_outputs ( & self ) -> Vec < TrackedSpendableOutput > {
568- self . sweeper_state . lock ( ) . unwrap ( ) . outputs . clone ( )
571+ self . sweeper_state . lock ( ) . unwrap ( ) . persistent . outputs . clone ( )
569572 }
570573
571574 /// Gets the latest best block which was connected either via the [`Listen`] or
572575 /// [`Confirm`] interfaces.
573576 pub fn current_best_block ( & self ) -> BestBlock {
574- self . sweeper_state . lock ( ) . unwrap ( ) . best_block
577+ self . sweeper_state . lock ( ) . unwrap ( ) . persistent . best_block
575578 }
576579
577580 /// Regenerates and broadcasts the spending transaction for any outputs that are pending
@@ -604,8 +607,9 @@ where
604607 return Ok ( ( ) ) ;
605608 }
606609
607- let cur_height = sweeper_state. best_block . height ;
608- let has_respends = sweeper_state. outputs . iter ( ) . any ( |o| filter_fn ( o, cur_height) ) ;
610+ let cur_height = sweeper_state. persistent . best_block . height ;
611+ let has_respends =
612+ sweeper_state. persistent . outputs . iter ( ) . any ( |o| filter_fn ( o, cur_height) ) ;
609613 if !has_respends {
610614 return Ok ( ( ) ) ;
611615 }
@@ -620,10 +624,12 @@ where
620624
621625 // Sweep the outputs.
622626 {
623- let mut sweeper_state = self . sweeper_state . lock ( ) . unwrap ( ) ;
627+ let mut runtime_sweeper_state = self . sweeper_state . lock ( ) . unwrap ( ) ;
624628
625629 // Always allow a new sweep after this spend, also in the error case.
626- sweeper_state. sweep_pending = false ;
630+ runtime_sweeper_state. sweep_pending = false ;
631+
632+ let sweeper_state = & mut runtime_sweeper_state. persistent ;
627633
628634 let change_destination_script = change_destination_script_result?;
629635
@@ -643,7 +649,7 @@ where
643649 }
644650
645651 let spending_tx = match self . spend_outputs (
646- & * sweeper_state,
652+ sweeper_state,
647653 & respend_descriptors,
648654 change_destination_script,
649655 ) {
@@ -674,7 +680,7 @@ where
674680 output_info. status . broadcast ( cur_hash, cur_height, spending_tx. clone ( ) ) ;
675681 }
676682
677- self . persist_state ( & * sweeper_state) . map_err ( |e| {
683+ self . persist_state ( & sweeper_state) . map_err ( |e| {
678684 log_error ! ( self . logger, "Error persisting OutputSweeper: {:?}" , e) ;
679685 } ) ?;
680686
@@ -779,22 +785,22 @@ where
779785 fn filtered_block_connected (
780786 & self , header : & Header , txdata : & chain:: transaction:: TransactionData , height : u32 ,
781787 ) {
782- let mut state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
788+ let state_lock = & mut self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
783789 assert_eq ! ( state_lock. best_block. block_hash, header. prev_blockhash,
784790 "Blocks must be connected in chain-order - the connected header must build on the last connected header" ) ;
785791 assert_eq ! ( state_lock. best_block. height, height - 1 ,
786792 "Blocks must be connected in chain-order - the connected block height must be one greater than the previous height" ) ;
787793
788- self . transactions_confirmed_internal ( & mut * state_lock, header, txdata, height) ;
789- self . best_block_updated_internal ( & mut * state_lock, header, height) ;
794+ self . transactions_confirmed_internal ( state_lock, header, txdata, height) ;
795+ self . best_block_updated_internal ( state_lock, header, height) ;
790796
791- let _ = self . persist_state ( & * state_lock) . map_err ( |e| {
797+ let _ = self . persist_state ( & state_lock) . map_err ( |e| {
792798 log_error ! ( self . logger, "Error persisting OutputSweeper: {:?}" , e) ;
793799 } ) ;
794800 }
795801
796802 fn block_disconnected ( & self , header : & Header , height : u32 ) {
797- let mut state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
803+ let state_lock = & mut self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
798804
799805 let new_height = height - 1 ;
800806 let block_hash = header. block_hash ( ) ;
@@ -832,15 +838,15 @@ where
832838 fn transactions_confirmed (
833839 & self , header : & Header , txdata : & chain:: transaction:: TransactionData , height : u32 ,
834840 ) {
835- let mut state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
836- self . transactions_confirmed_internal ( & mut * state_lock, header, txdata, height) ;
837- self . persist_state ( & * state_lock) . unwrap_or_else ( |e| {
841+ let state_lock = & mut self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
842+ self . transactions_confirmed_internal ( state_lock, header, txdata, height) ;
843+ self . persist_state ( state_lock) . unwrap_or_else ( |e| {
838844 log_error ! ( self . logger, "Error persisting OutputSweeper: {:?}" , e) ;
839845 } ) ;
840846 }
841847
842848 fn transaction_unconfirmed ( & self , txid : & Txid ) {
843- let mut state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
849+ let state_lock = & mut self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
844850
845851 // Get what height was unconfirmed.
846852 let unconf_height = state_lock
@@ -857,22 +863,22 @@ where
857863 . filter ( |o| o. status . confirmation_height ( ) >= Some ( unconf_height) )
858864 . for_each ( |o| o. status . unconfirmed ( ) ) ;
859865
860- self . persist_state ( & * state_lock) . unwrap_or_else ( |e| {
866+ self . persist_state ( state_lock) . unwrap_or_else ( |e| {
861867 log_error ! ( self . logger, "Error persisting OutputSweeper: {:?}" , e) ;
862868 } ) ;
863869 }
864870 }
865871
866872 fn best_block_updated ( & self , header : & Header , height : u32 ) {
867- let mut state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
868- self . best_block_updated_internal ( & mut * state_lock, header, height) ;
869- let _ = self . persist_state ( & * state_lock) . map_err ( |e| {
873+ let state_lock = & mut self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
874+ self . best_block_updated_internal ( state_lock, header, height) ;
875+ let _ = self . persist_state ( state_lock) . map_err ( |e| {
870876 log_error ! ( self . logger, "Error persisting OutputSweeper: {:?}" , e) ;
871877 } ) ;
872878 }
873879
874880 fn get_relevant_txids ( & self ) -> Vec < ( Txid , u32 , Option < BlockHash > ) > {
875- let state_lock = self . sweeper_state . lock ( ) . unwrap ( ) ;
881+ let state_lock = & self . sweeper_state . lock ( ) . unwrap ( ) . persistent ;
876882 state_lock
877883 . outputs
878884 . iter ( )
@@ -893,19 +899,21 @@ where
893899 }
894900}
895901
902+ #[ derive( Debug , Clone ) ]
903+ struct RuntimeSweeperState {
904+ persistent : SweeperState ,
905+ sweep_pending : bool ,
906+ }
907+
896908#[ derive( Debug , Clone ) ]
897909struct SweeperState {
898910 outputs : Vec < TrackedSpendableOutput > ,
899911 best_block : BestBlock ,
900- sweep_pending : bool ,
901912}
902913
903914impl_writeable_tlv_based ! ( SweeperState , {
904915 ( 0 , outputs, required_vec) ,
905916 ( 2 , best_block, required) ,
906-
907- // TODO: Do not persist this field.
908- ( 4 , sweep_pending, required) ,
909917} ) ;
910918
911919/// A `enum` signalling to the [`OutputSweeper`] that it should delay spending an output until a
@@ -959,7 +967,8 @@ where
959967 }
960968 }
961969
962- let sweeper_state = Mutex :: new ( state) ;
970+ let sweeper_state =
971+ Mutex :: new ( RuntimeSweeperState { persistent : state, sweep_pending : false } ) ;
963972 Ok ( Self {
964973 sweeper_state,
965974 broadcaster,
@@ -1007,7 +1016,8 @@ where
10071016 }
10081017 }
10091018
1010- let sweeper_state = Mutex :: new ( state) ;
1019+ let sweeper_state =
1020+ Mutex :: new ( RuntimeSweeperState { persistent : state, sweep_pending : false } ) ;
10111021 Ok ( (
10121022 best_block,
10131023 OutputSweeper {
0 commit comments