Skip to content

Commit 5e7d9ba

Browse files
committed
create runtime state
1 parent 95cf5b6 commit 5e7d9ba

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

lightning/src/util/sweep.rs

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
897909
struct SweeperState {
898910
outputs: Vec<TrackedSpendableOutput>,
899911
best_block: BestBlock,
900-
sweep_pending: bool,
901912
}
902913

903914
impl_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

Comments
 (0)