@@ -30,6 +30,7 @@ mod fwd_batch;
3030
3131use fwd_batch:: BatchDelay ;
3232
33+ use crate :: lightning:: util:: ser:: Writeable ;
3334use lightning:: chain;
3435use lightning:: chain:: chaininterface:: { BroadcasterInterface , FeeEstimator } ;
3536use lightning:: chain:: chainmonitor:: { ChainMonitor , Persist } ;
@@ -53,7 +54,13 @@ use lightning::sign::ChangeDestinationSourceSync;
5354use lightning:: sign:: EntropySource ;
5455use lightning:: sign:: OutputSpender ;
5556use 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+ } ;
5764use lightning:: util:: sweep:: OutputSweeper ;
5865#[ cfg( feature = "std" ) ]
5966use lightning:: util:: sweep:: OutputSweeperSync ;
@@ -326,7 +333,8 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
326333
327334macro_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
405413if $channel_manager. get_cm( ) . get_and_clear_needs_persistence( ) {
406414log_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+ ) ?;
408421log_trace!( $logger, "Done persisting ChannelManager." ) ;
409422}
410423if $timer_elapsed( & mut last_freshness_call, FRESHNESS_TIMER ) {
@@ -465,7 +478,12 @@ macro_rules! define_run_body {
465478log_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+ ) {
469487log_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 {
494512log_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+ ) {
497520log_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
522550if 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
527560if 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
531569Ok ( ( ) )
@@ -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<
819855P : ' static + Deref ,
820856EventHandlerFuture : core:: future:: Future < Output = Result < ( ) , ReplayEvent > > ,
821857EventHandler : Fn ( Event ) -> EventHandlerFuture ,
822- PS : ' static + Deref + Send ,
823858ES : ' static + Deref + Send ,
824859M : ' 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<
841876Sleeper : Fn ( Duration ) -> SleepFuture ,
842877FetchTime : 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 ,
845880onion_messenger : Option < OM > , gossip_sync : GossipSync < PGS , RGS , G , UL , L > , peer_manager : PM ,
846881liquidity_manager : Option < LM > , sweeper : Option < OS > , logger : L , scorer : Option < S > ,
847882sleeper : Sleeper , mobile_interruptable_platform : bool , fetch_time : FetchTime ,
@@ -853,7 +888,6 @@ where
853888F :: Target : ' static + FeeEstimator ,
854889L :: Target : ' static + Logger ,
855890P :: Target : ' static + Persist < <CM :: Target as AChannelManager >:: Signer > ,
856- PS :: Target : ' static + Persister < ' a , CM , L , S > ,
857891ES :: Target : ' static + EntropySource ,
858892CM :: Target : AChannelManager ,
859893OM :: Target : AOnionMessenger ,
@@ -869,7 +903,7 @@ where
869903let event_handler = & event_handler;
870904let scorer = & scorer;
871905let logger = & logger;
872- let persister = & persister ;
906+ let kv_store = & kv_store ;
873907let fetch_time = & fetch_time;
874908// We should be able to drop the Box once our MSRV is 1.68
875909Box :: pin ( async move {
@@ -880,7 +914,12 @@ where
880914if let Some ( duration_since_epoch) = fetch_time ( ) {
881915if update_scorer ( scorer, & event, duration_since_epoch) {
882916log_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+ ) {
884923log_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} ;
896935let mut batch_delay = BatchDelay :: new ( ) ;
897936define_run_body ! (
898- persister ,
937+ kv_store ,
899938chain_monitor,
900939chain_monitor. process_pending_events_async( async_event_handler) . await ,
901940channel_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
10201057pub fn start <
@@ -1027,7 +1064,6 @@ impl BackgroundProcessor {
10271064L : ' static + Deref + Send ,
10281065P : ' static + Deref ,
10291066EH : ' static + EventHandler + Send ,
1030- PS : ' static + Deref + Send ,
10311067ES : ' static + Deref + Send ,
10321068M : ' static
10331069+ Deref <
@@ -1045,10 +1081,10 @@ impl BackgroundProcessor {
10451081SC : for < ' b > WriteableScore < ' b > ,
10461082D : ' static + Deref ,
10471083O : ' static + Deref ,
1048- K : ' static + Deref ,
1084+ K : ' static + Deref + Send ,
10491085OS : ' 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 ,
10521088onion_messenger : Option < OM > , gossip_sync : GossipSync < PGS , RGS , G , UL , L > , peer_manager : PM ,
10531089liquidity_manager : Option < LM > , sweeper : Option < OS > , logger : L , scorer : Option < S > ,
10541090) -> Self
@@ -1059,7 +1095,6 @@ impl BackgroundProcessor {
10591095F :: Target : ' static + FeeEstimator ,
10601096L :: Target : ' static + Logger ,
10611097P :: Target : ' static + Persist < <CM :: Target as AChannelManager >:: Signer > ,
1062- PS :: Target : ' static + Persister < ' a , CM , L , S > ,
10631098ES :: Target : ' static + EntropySource ,
10641099CM :: Target : AChannelManager ,
10651100OM :: Target : AOnionMessenger ,
@@ -1084,7 +1119,12 @@ impl BackgroundProcessor {
10841119. expect ( "Time should be sometime after 1970" ) ;
10851120if update_scorer ( scorer, & event, duration_since_epoch) {
10861121log_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+ ) {
10881128log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
10891129}
10901130}
@@ -1093,7 +1133,7 @@ impl BackgroundProcessor {
10931133} ;
10941134let mut batch_delay = BatchDelay :: new ( ) ;
10951135define_run_body ! (
1096- persister ,
1136+ kv_store ,
10971137chain_monitor,
10981138chain_monitor. process_pending_events( & event_handler) ,
10991139channel_manager,
@@ -1314,7 +1354,7 @@ mod tests {
13141354Arc < test_utils:: TestBroadcaster > ,
13151355Arc < test_utils:: TestFeeEstimator > ,
13161356Arc < test_utils:: TestLogger > ,
1317- Arc < FilesystemStore > ,
1357+ Arc < Persister > ,
13181358Arc < KeysManager > ,
13191359> ;
13201360
@@ -1372,7 +1412,7 @@ mod tests {
13721412> ,
13731413liquidity_manager : Arc < LM > ,
13741414chain_monitor : Arc < ChainMonitor > ,
1375- kv_store : Arc < FilesystemStore > ,
1415+ kv_store : Arc < Persister > ,
13761416tx_broadcaster : Arc < test_utils:: TestBroadcaster > ,
13771417network_graph : Arc < NetworkGraph < Arc < test_utils:: TestLogger > > > ,
13781418logger : Arc < test_utils:: TestLogger > ,
@@ -1384,7 +1424,7 @@ mod tests {
13841424Arc < TestWallet > ,
13851425Arc < test_utils:: TestFeeEstimator > ,
13861426Arc < test_utils:: TestChainSource > ,
1387- Arc < FilesystemStore > ,
1427+ Arc < Persister > ,
13881428Arc < test_utils:: TestLogger > ,
13891429Arc < KeysManager > ,
13901430> ,
@@ -1476,6 +1516,10 @@ mod tests {
14761516fn with_scorer_error ( self , error : std:: io:: ErrorKind , message : & ' static str ) -> Self {
14771517Self { 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
14811525impl KVStore for Persister {
@@ -1720,7 +1764,7 @@ mod tests {
17201764) ) ;
17211765let chain_source = Arc :: new ( test_utils:: TestChainSource :: new ( Network :: Bitcoin ) ) ;
17221766let kv_store =
1723- Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
1767+ Arc :: new ( Persister :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
17241768let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
17251769let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
17261770let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new (
0 commit comments