Skip to content

Commit dc75436

Browse files
committed
Remove Persister
In preparation for the addition of an async KVStore, we here remove the Persister pseudo-wrapper. The wrapper is thin, would need to be duplicated for async, and KVStore isn't fully abstracted anyway anymore because the sweeper takes it directly.
1 parent 20e51fe commit dc75436

File tree

4 files changed

+97
-94
lines changed

4 files changed

+97
-94
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 78 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ mod fwd_batch;
3030

3131
use fwd_batch::BatchDelay;
3232

33+
use crate::lightning::util::ser::Writeable;
3334
use lightning::chain;
3435
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
3536
use lightning::chain::chainmonitor::{ChainMonitor, Persist};
@@ -53,7 +54,13 @@ use lightning::sign::ChangeDestinationSourceSync;
5354
use lightning::sign::EntropySource;
5455
use lightning::sign::OutputSpender;
5556
use lightning::util::logger::Logger;
56-
use lightning::util::persist::{KVStore, Persister};
57+
use lightning::util::persist::{
58+
KVStore, CHANNEL_MANAGER_PERSISTENCE_KEY, CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
59+
CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_KEY,
60+
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE,
61+
SCORER_PERSISTENCE_KEY, SCORER_PERSISTENCE_PRIMARY_NAMESPACE,
62+
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
63+
};
5764
use lightning::util::sweep::OutputSweeper;
5865
#[cfg(feature = "std")]
5966
use lightning::util::sweep::OutputSweeperSync;
@@ -326,7 +333,8 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
326333

327334
macro_rules! define_run_body {
328335
(
329-
$persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
336+
$kv_store: ident,
337+
$chain_monitor: ident, $process_chain_monitor_events: expr,
330338
$channel_manager: ident, $process_channel_manager_events: expr,
331339
$onion_messenger: ident, $process_onion_message_handler_events: expr,
332340
$peer_manager: ident, $gossip_sync: ident,
@@ -404,7 +412,12 @@ macro_rules! define_run_body {
404412

405413
if $channel_manager.get_cm().get_and_clear_needs_persistence() {
406414
log_trace!($logger, "Persisting ChannelManager...");
407-
$persister.persist_manager(&$channel_manager)?;
415+
$kv_store.write(
416+
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
417+
CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE,
418+
CHANNEL_MANAGER_PERSISTENCE_KEY,
419+
&$channel_manager.get_cm().encode(),
420+
)?;
408421
log_trace!($logger, "Done persisting ChannelManager.");
409422
}
410423
if $timer_elapsed(&mut last_freshness_call, FRESHNESS_TIMER) {
@@ -465,7 +478,12 @@ macro_rules! define_run_body {
465478
log_trace!($logger, "Persisting network graph.");
466479
}
467480

468-
if let Err(e) = $persister.persist_graph(network_graph) {
481+
if let Err(e) = $kv_store.write(
482+
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE,
483+
NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE,
484+
NETWORK_GRAPH_PERSISTENCE_KEY,
485+
&network_graph.encode(),
486+
) {
469487
log_error!($logger, "Error: Failed to persist network graph, check your disk and permissions {}", e)
470488
}
471489

@@ -493,7 +511,12 @@ macro_rules! define_run_body {
493511
} else {
494512
log_trace!($logger, "Persisting scorer");
495513
}
496-
if let Err(e) = $persister.persist_scorer(&scorer) {
514+
if let Err(e) = $kv_store.write(
515+
SCORER_PERSISTENCE_PRIMARY_NAMESPACE,
516+
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
517+
SCORER_PERSISTENCE_KEY,
518+
&scorer.encode(),
519+
) {
497520
log_error!($logger, "Error: Failed to persist scorer, check your disk and permissions {}", e)
498521
}
499522
}
@@ -516,16 +539,31 @@ macro_rules! define_run_body {
516539
// After we exit, ensure we persist the ChannelManager one final time - this avoids
517540
// some races where users quit while channel updates were in-flight, with
518541
// ChannelMonitor update(s) persisted without a corresponding ChannelManager update.
519-
$persister.persist_manager(&$channel_manager)?;
542+
$kv_store.write(
543+
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
544+
CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE,
545+
CHANNEL_MANAGER_PERSISTENCE_KEY,
546+
&$channel_manager.get_cm().encode(),
547+
)?;
520548

521549
// Persist Scorer on exit
522550
if let Some(ref scorer) = $scorer {
523-
$persister.persist_scorer(&scorer)?;
551+
$kv_store.write(
552+
SCORER_PERSISTENCE_PRIMARY_NAMESPACE,
553+
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
554+
SCORER_PERSISTENCE_KEY,
555+
&scorer.encode(),
556+
)?;
524557
}
525558

526559
// Persist NetworkGraph on exit
527560
if let Some(network_graph) = $gossip_sync.network_graph() {
528-
$persister.persist_graph(network_graph)?;
561+
$kv_store.write(
562+
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE,
563+
NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE,
564+
NETWORK_GRAPH_PERSISTENCE_KEY,
565+
&network_graph.encode(),
566+
)?;
529567
}
530568

531569
Ok(())
@@ -723,7 +761,6 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
723761
/// # FE: lightning::chain::chaininterface::FeeEstimator + Send + Sync + 'static,
724762
/// # UL: lightning::routing::utxo::UtxoLookup + Send + Sync + 'static,
725763
/// # D: lightning::sign::ChangeDestinationSource + Send + Sync + 'static,
726-
/// # K: lightning::util::persist::KVStore + Send + Sync + 'static,
727764
/// # O: lightning::sign::OutputSpender + Send + Sync + 'static,
728765
/// # > {
729766
/// # peer_manager: Arc<PeerManager<B, F, FE, UL>>,
@@ -736,7 +773,7 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
736773
/// # persister: Arc<Store>,
737774
/// # logger: Arc<Logger>,
738775
/// # scorer: Arc<Scorer>,
739-
/// # sweeper: Arc<OutputSweeper<Arc<B>, Arc<D>, Arc<FE>, Arc<F>, Arc<K>, Arc<Logger>, Arc<O>>>,
776+
/// # sweeper: Arc<OutputSweeper<Arc<B>, Arc<D>, Arc<FE>, Arc<F>, Arc<Store>, Arc<Logger>, Arc<O>>>,
740777
/// # }
741778
/// #
742779
/// # async fn setup_background_processing<
@@ -745,9 +782,8 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
745782
/// # FE: lightning::chain::chaininterface::FeeEstimator + Send + Sync + 'static,
746783
/// # UL: lightning::routing::utxo::UtxoLookup + Send + Sync + 'static,
747784
/// # D: lightning::sign::ChangeDestinationSource + Send + Sync + 'static,
748-
/// # K: lightning::util::persist::KVStore + Send + Sync + 'static,
749785
/// # O: lightning::sign::OutputSpender + Send + Sync + 'static,
750-
/// # >(node: Node<B, F, FE, UL, D, K, O>) {
786+
/// # >(node: Node<B, F, FE, UL, D, O>) {
751787
/// let background_persister = Arc::clone(&node.persister);
752788
/// let background_event_handler = Arc::clone(&node.event_handler);
753789
/// let background_chain_mon = Arc::clone(&node.chain_monitor);
@@ -819,7 +855,6 @@ pub async fn process_events_async<
819855
P: 'static + Deref,
820856
EventHandlerFuture: core::future::Future<Output = Result<(), ReplayEvent>>,
821857
EventHandler: Fn(Event) -> EventHandlerFuture,
822-
PS: 'static + Deref + Send,
823858
ES: 'static + Deref + Send,
824859
M: 'static
825860
+ Deref<Target = ChainMonitor<<CM::Target as AChannelManager>::Signer, CF, T, F, L, P, ES>>
@@ -841,7 +876,7 @@ pub async fn process_events_async<
841876
Sleeper: Fn(Duration) -> SleepFuture,
842877
FetchTime: Fn() -> Option<Duration>,
843878
>(
844-
persister: PS, event_handler: EventHandler, chain_monitor: M, channel_manager: CM,
879+
kv_store: K, event_handler: EventHandler, chain_monitor: M, channel_manager: CM,
845880
onion_messenger: Option<OM>, gossip_sync: GossipSync<PGS, RGS, G, UL, L>, peer_manager: PM,
846881
liquidity_manager: Option<LM>, sweeper: Option<OS>, logger: L, scorer: Option<S>,
847882
sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime,
@@ -853,7 +888,6 @@ where
853888
F::Target: 'static + FeeEstimator,
854889
L::Target: 'static + Logger,
855890
P::Target: 'static + Persist<<CM::Target as AChannelManager>::Signer>,
856-
PS::Target: 'static + Persister<'a, CM, L, S>,
857891
ES::Target: 'static + EntropySource,
858892
CM::Target: AChannelManager,
859893
OM::Target: AOnionMessenger,
@@ -869,7 +903,7 @@ where
869903
let event_handler = &event_handler;
870904
let scorer = &scorer;
871905
let logger = &logger;
872-
let persister = &persister;
906+
let kv_store = &kv_store;
873907
let fetch_time = &fetch_time;
874908
// We should be able to drop the Box once our MSRV is 1.68
875909
Box::pin(async move {
@@ -880,7 +914,12 @@ where
880914
if let Some(duration_since_epoch) = fetch_time() {
881915
if update_scorer(scorer, &event, duration_since_epoch) {
882916
log_trace!(logger, "Persisting scorer after update");
883-
if let Err(e) = persister.persist_scorer(&*scorer) {
917+
if let Err(e) = kv_store.write(
918+
SCORER_PERSISTENCE_PRIMARY_NAMESPACE,
919+
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
920+
SCORER_PERSISTENCE_KEY,
921+
&scorer.encode(),
922+
) {
884923
log_error!(logger, "Error: Failed to persist scorer, check your disk and permissions {}", e);
885924
// We opt not to abort early on persistence failure here as persisting
886925
// the scorer is non-critical and we still hope that it will have
@@ -895,7 +934,7 @@ where
895934
};
896935
let mut batch_delay = BatchDelay::new();
897936
define_run_body!(
898-
persister,
937+
kv_store,
899938
chain_monitor,
900939
chain_monitor.process_pending_events_async(async_event_handler).await,
901940
channel_manager,
@@ -977,21 +1016,21 @@ impl BackgroundProcessor {
9771016
/// documentation].
9781017
///
9791018
/// The thread runs indefinitely unless the object is dropped, [`stop`] is called, or
980-
/// [`Persister::persist_manager`] returns an error. In case of an error, the error is retrieved by calling
1019+
/// [`KVStore`] returns an error. In case of an error, the error is retrieved by calling
9811020
/// either [`join`] or [`stop`].
9821021
///
9831022
/// # Data Persistence
9841023
///
985-
/// [`Persister::persist_manager`] is responsible for writing out the [`ChannelManager`] to disk, and/or
1024+
/// [`KVStore`] is responsible for writing out the [`ChannelManager`] to disk, and/or
9861025
/// uploading to one or more backup services. See [`ChannelManager::write`] for writing out a
9871026
/// [`ChannelManager`]. See the `lightning-persister` crate for LDK's
9881027
/// provided implementation.
9891028
///
990-
/// [`Persister::persist_graph`] is responsible for writing out the [`NetworkGraph`] to disk, if
1029+
/// [`KVStore`] is also responsible for writing out the [`NetworkGraph`] to disk, if
9911030
/// [`GossipSync`] is supplied. See [`NetworkGraph::write`] for writing out a [`NetworkGraph`].
9921031
/// See the `lightning-persister` crate for LDK's provided implementation.
9931032
///
994-
/// Typically, users should either implement [`Persister::persist_manager`] to never return an
1033+
/// Typically, users should either implement [`KVStore`] to never return an
9951034
/// error or call [`join`] and handle any error that may arise. For the latter case,
9961035
/// `BackgroundProcessor` must be restarted by calling `start` again after handling the error.
9971036
///
@@ -1013,8 +1052,6 @@ impl BackgroundProcessor {
10131052
/// [`stop`]: Self::stop
10141053
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
10151054
/// [`ChannelManager::write`]: lightning::ln::channelmanager::ChannelManager#impl-Writeable
1016-
/// [`Persister::persist_manager`]: lightning::util::persist::Persister::persist_manager
1017-
/// [`Persister::persist_graph`]: lightning::util::persist::Persister::persist_graph
10181055
/// [`NetworkGraph`]: lightning::routing::gossip::NetworkGraph
10191056
/// [`NetworkGraph::write`]: lightning::routing::gossip::NetworkGraph#impl-Writeable
10201057
pub fn start<
@@ -1027,7 +1064,6 @@ impl BackgroundProcessor {
10271064
L: 'static + Deref + Send,
10281065
P: 'static + Deref,
10291066
EH: 'static + EventHandler + Send,
1030-
PS: 'static + Deref + Send,
10311067
ES: 'static + Deref + Send,
10321068
M: 'static
10331069
+ Deref<
@@ -1045,10 +1081,10 @@ impl BackgroundProcessor {
10451081
SC: for<'b> WriteableScore<'b>,
10461082
D: 'static + Deref,
10471083
O: 'static + Deref,
1048-
K: 'static + Deref,
1084+
K: 'static + Deref + Send,
10491085
OS: 'static + Deref<Target = OutputSweeperSync<T, D, F, CF, K, L, O>> + Send,
10501086
>(
1051-
persister: PS, event_handler: EH, chain_monitor: M, channel_manager: CM,
1087+
kv_store: K, event_handler: EH, chain_monitor: M, channel_manager: CM,
10521088
onion_messenger: Option<OM>, gossip_sync: GossipSync<PGS, RGS, G, UL, L>, peer_manager: PM,
10531089
liquidity_manager: Option<LM>, sweeper: Option<OS>, logger: L, scorer: Option<S>,
10541090
) -> Self
@@ -1059,7 +1095,6 @@ impl BackgroundProcessor {
10591095
F::Target: 'static + FeeEstimator,
10601096
L::Target: 'static + Logger,
10611097
P::Target: 'static + Persist<<CM::Target as AChannelManager>::Signer>,
1062-
PS::Target: 'static + Persister<'a, CM, L, S>,
10631098
ES::Target: 'static + EntropySource,
10641099
CM::Target: AChannelManager,
10651100
OM::Target: AOnionMessenger,
@@ -1084,7 +1119,12 @@ impl BackgroundProcessor {
10841119
.expect("Time should be sometime after 1970");
10851120
if update_scorer(scorer, &event, duration_since_epoch) {
10861121
log_trace!(logger, "Persisting scorer after update");
1087-
if let Err(e) = persister.persist_scorer(&scorer) {
1122+
if let Err(e) = kv_store.write(
1123+
SCORER_PERSISTENCE_PRIMARY_NAMESPACE,
1124+
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
1125+
SCORER_PERSISTENCE_KEY,
1126+
&scorer.encode(),
1127+
) {
10881128
log_error!(logger, "Error: Failed to persist scorer, check your disk and permissions {}", e)
10891129
}
10901130
}
@@ -1093,7 +1133,7 @@ impl BackgroundProcessor {
10931133
};
10941134
let mut batch_delay = BatchDelay::new();
10951135
define_run_body!(
1096-
persister,
1136+
kv_store,
10971137
chain_monitor,
10981138
chain_monitor.process_pending_events(&event_handler),
10991139
channel_manager,
@@ -1314,7 +1354,7 @@ mod tests {
13141354
Arc<test_utils::TestBroadcaster>,
13151355
Arc<test_utils::TestFeeEstimator>,
13161356
Arc<test_utils::TestLogger>,
1317-
Arc<FilesystemStore>,
1357+
Arc<Persister>,
13181358
Arc<KeysManager>,
13191359
>;
13201360

@@ -1372,7 +1412,7 @@ mod tests {
13721412
>,
13731413
liquidity_manager: Arc<LM>,
13741414
chain_monitor: Arc<ChainMonitor>,
1375-
kv_store: Arc<FilesystemStore>,
1415+
kv_store: Arc<Persister>,
13761416
tx_broadcaster: Arc<test_utils::TestBroadcaster>,
13771417
network_graph: Arc<NetworkGraph<Arc<test_utils::TestLogger>>>,
13781418
logger: Arc<test_utils::TestLogger>,
@@ -1384,7 +1424,7 @@ mod tests {
13841424
Arc<TestWallet>,
13851425
Arc<test_utils::TestFeeEstimator>,
13861426
Arc<test_utils::TestChainSource>,
1387-
Arc<FilesystemStore>,
1427+
Arc<Persister>,
13881428
Arc<test_utils::TestLogger>,
13891429
Arc<KeysManager>,
13901430
>,
@@ -1476,6 +1516,10 @@ mod tests {
14761516
fn with_scorer_error(self, error: std::io::ErrorKind, message: &'static str) -> Self {
14771517
Self { scorer_error: Some((error, message)), ..self }
14781518
}
1519+
1520+
pub fn get_data_dir(&self) -> PathBuf {
1521+
self.kv_store.get_data_dir()
1522+
}
14791523
}
14801524

14811525
impl KVStore for Persister {
@@ -1720,7 +1764,7 @@ mod tests {
17201764
));
17211765
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Bitcoin));
17221766
let kv_store =
1723-
Arc::new(FilesystemStore::new(format!("{}_persister_{}", &persist_dir, i).into()));
1767+
Arc::new(Persister::new(format!("{}_persister_{}", &persist_dir, i).into()));
17241768
let now = Duration::from_secs(genesis_block.header.time as u64);
17251769
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
17261770
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(

lightning/src/ln/channelmanager.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,7 +1829,7 @@ where
18291829
/// - Perform any periodic channel and payment checks by calling [`timer_tick_occurred`] roughly
18301830
/// every minute
18311831
/// - Persist to disk whenever [`get_and_clear_needs_persistence`] returns `true` using a
1832-
/// [`Persister`] such as a [`KVStore`] implementation
1832+
/// [`KVStore`] implementation
18331833
/// - Handle [`Event`]s obtained via its [`EventsProvider`] implementation
18341834
///
18351835
/// The [`Future`] returned by [`get_event_or_persistence_needed_future`] is useful in determining
@@ -2411,7 +2411,6 @@ where
24112411
/// [`PeerManager::process_events`]: crate::ln::peer_handler::PeerManager::process_events
24122412
/// [`timer_tick_occurred`]: Self::timer_tick_occurred
24132413
/// [`get_and_clear_needs_persistence`]: Self::get_and_clear_needs_persistence
2414-
/// [`Persister`]: crate::util::persist::Persister
24152414
/// [`KVStore`]: crate::util::persist::KVStore
24162415
/// [`get_event_or_persistence_needed_future`]: Self::get_event_or_persistence_needed_future
24172416
/// [`lightning-block-sync`]: https://docs.rs/lightning_block_sync/latest/lightning_block_sync

0 commit comments

Comments
 (0)