@@ -33,7 +33,7 @@ use lightning::routing::scoring::{
3333} ;
3434use lightning:: sign:: { EntropySource , NodeSigner } ;
3535use lightning:: util:: persist:: {
36- KVStoreSync , CHANNEL_MANAGER_PERSISTENCE_KEY , CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
36+ KVStore , CHANNEL_MANAGER_PERSISTENCE_KEY , CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
3737 CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
3838} ;
3939use lightning:: util:: ser:: ReadableArgs ;
@@ -69,11 +69,12 @@ use crate::logger::{log_error, LdkLogger, LogLevel, LogWriter, Logger};
6969use crate :: message_handler:: NodeCustomMessageHandler ;
7070use crate :: payment:: asynchronous:: om_mailbox:: OnionMessageMailbox ;
7171use crate :: peer_store:: PeerStore ;
72- use crate :: runtime:: Runtime ;
72+ use crate :: runtime:: { Runtime , RuntimeSpawner } ;
7373use crate :: tx_broadcaster:: TransactionBroadcaster ;
7474use crate :: types:: {
75- ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph , KeysManager ,
76- MessageRouter , OnionMessenger , PaymentStore , PeerManager , Persister , SyncAndAsyncKVStore ,
75+ AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph ,
76+ KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , Persister ,
77+ SyncAndAsyncKVStore ,
7778} ;
7879use crate :: wallet:: persist:: KVStoreWalletPersister ;
7980use crate :: wallet:: Wallet ;
@@ -1051,10 +1052,20 @@ fn build_with_store_internal(
10511052 }
10521053 }
10531054
1055+ let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new ( Arc :: clone ( & logger) ) ) ;
1056+ let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new ( ) ) ;
1057+
1058+ let kv_store_ref = Arc :: clone ( & kv_store) ;
1059+ let logger_ref = Arc :: clone ( & logger) ;
1060+ let ( payment_store_res, node_metris_res) = runtime. block_on ( async move {
1061+ tokio:: join!(
1062+ read_payments( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1063+ read_node_metrics( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1064+ )
1065+ } ) ;
1066+
10541067 // Initialize the status fields.
1055- let node_metrics = match runtime
1056- . block_on ( async { read_node_metrics ( & * kv_store, Arc :: clone ( & logger) ) . await } )
1057- {
1068+ let node_metrics = match node_metris_res {
10581069 Ok ( metrics) => Arc :: new ( RwLock :: new ( metrics) ) ,
10591070 Err ( e) => {
10601071 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
@@ -1065,23 +1076,20 @@ fn build_with_store_internal(
10651076 }
10661077 } ,
10671078 } ;
1068- let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new ( Arc :: clone ( & logger) ) ) ;
1069- let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new ( ) ) ;
10701079
1071- let payment_store =
1072- match runtime. block_on ( async { read_payments ( & * kv_store, Arc :: clone ( & logger) ) . await } ) {
1073- Ok ( payments) => Arc :: new ( PaymentStore :: new (
1074- payments,
1075- PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE . to_string ( ) ,
1076- PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE . to_string ( ) ,
1077- Arc :: clone ( & kv_store) ,
1078- Arc :: clone ( & logger) ,
1079- ) ) ,
1080- Err ( e) => {
1081- log_error ! ( logger, "Failed to read payment data from store: {}" , e) ;
1082- return Err ( BuildError :: ReadFailed ) ;
1083- } ,
1084- } ;
1080+ let payment_store = match payment_store_res {
1081+ Ok ( payments) => Arc :: new ( PaymentStore :: new (
1082+ payments,
1083+ PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE . to_string ( ) ,
1084+ PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE . to_string ( ) ,
1085+ Arc :: clone ( & kv_store) ,
1086+ Arc :: clone ( & logger) ,
1087+ ) ) ,
1088+ Err ( e) => {
1089+ log_error ! ( logger, "Failed to read payment data from store: {}" , e) ;
1090+ return Err ( BuildError :: ReadFailed ) ;
1091+ } ,
1092+ } ;
10851093
10861094 let ( chain_source, chain_tip_opt) = match chain_data_source_config {
10871095 Some ( ChainDataSourceConfig :: Esplora { server_url, headers, sync_config } ) => {
@@ -1261,8 +1269,9 @@ fn build_with_store_internal(
12611269 ) ) ;
12621270
12631271 let peer_storage_key = keys_manager. get_peer_storage_key ( ) ;
1264- let persister = Arc :: new ( Persister :: new (
1272+ let monitor_reader = Arc :: new ( AsyncPersister :: new (
12651273 Arc :: clone ( & kv_store) ,
1274+ RuntimeSpawner :: new ( Arc :: clone ( & runtime) ) ,
12661275 Arc :: clone ( & logger) ,
12671276 PERSISTER_MAX_PENDING_UPDATES ,
12681277 Arc :: clone ( & keys_manager) ,
@@ -1271,8 +1280,18 @@ fn build_with_store_internal(
12711280 Arc :: clone ( & fee_estimator) ,
12721281 ) ) ;
12731282
1283+ // Read ChannelMonitors and the NetworkGraph
1284+ let kv_store_ref = Arc :: clone ( & kv_store) ;
1285+ let logger_ref = Arc :: clone ( & logger) ;
1286+ let ( monitor_read_res, network_graph_res) = runtime. block_on ( async move {
1287+ tokio:: join!(
1288+ monitor_reader. read_all_channel_monitors_with_updates_parallel( ) ,
1289+ read_network_graph( & * kv_store_ref, logger_ref) ,
1290+ )
1291+ } ) ;
1292+
12741293 // Read ChannelMonitor state from store
1275- let channel_monitors = match persister . read_all_channel_monitors_with_updates ( ) {
1294+ let channel_monitors = match monitor_read_res {
12761295 Ok ( monitors) => monitors,
12771296 Err ( e) => {
12781297 if e. kind ( ) == lightning:: io:: ErrorKind :: NotFound {
@@ -1284,6 +1303,16 @@ fn build_with_store_internal(
12841303 } ,
12851304 } ;
12861305
1306+ let persister = Arc :: new ( Persister :: new (
1307+ Arc :: clone ( & kv_store) ,
1308+ Arc :: clone ( & logger) ,
1309+ PERSISTER_MAX_PENDING_UPDATES ,
1310+ Arc :: clone ( & keys_manager) ,
1311+ Arc :: clone ( & keys_manager) ,
1312+ Arc :: clone ( & tx_broadcaster) ,
1313+ Arc :: clone ( & fee_estimator) ,
1314+ ) ) ;
1315+
12871316 // Initialize the ChainMonitor
12881317 let chain_monitor: Arc < ChainMonitor > = Arc :: new ( chainmonitor:: ChainMonitor :: new (
12891318 Some ( Arc :: clone ( & chain_source) ) ,
@@ -1296,9 +1325,7 @@ fn build_with_store_internal(
12961325 ) ) ;
12971326
12981327 // Initialize the network graph, scorer, and router
1299- let network_graph = match runtime
1300- . block_on ( async { read_network_graph ( & * kv_store, Arc :: clone ( & logger) ) . await } )
1301- {
1328+ let network_graph = match network_graph_res {
13021329 Ok ( graph) => Arc :: new ( graph) ,
13031330 Err ( e) => {
13041331 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
@@ -1310,9 +1337,42 @@ fn build_with_store_internal(
13101337 } ,
13111338 } ;
13121339
1313- let local_scorer = match runtime. block_on ( async {
1314- read_scorer ( & * kv_store, Arc :: clone ( & network_graph) , Arc :: clone ( & logger) ) . await
1315- } ) {
1340+ // Read various smaller LDK and ldk-node objects from the store
1341+ let kv_store_ref = Arc :: clone ( & kv_store) ;
1342+ let logger_ref = Arc :: clone ( & logger) ;
1343+ let network_graph_ref = Arc :: clone ( & network_graph) ;
1344+ let output_sweeper_future = read_output_sweeper (
1345+ Arc :: clone ( & tx_broadcaster) ,
1346+ Arc :: clone ( & fee_estimator) ,
1347+ Arc :: clone ( & chain_source) ,
1348+ Arc :: clone ( & keys_manager) ,
1349+ Arc :: clone ( & kv_store_ref) ,
1350+ Arc :: clone ( & logger_ref) ,
1351+ ) ;
1352+ let (
1353+ scorer_res,
1354+ external_scores_res,
1355+ channel_manager_bytes_res,
1356+ sweeper_bytes_res,
1357+ event_queue_res,
1358+ peer_info_res,
1359+ ) = runtime. block_on ( async move {
1360+ tokio:: join!(
1361+ read_scorer( & * kv_store_ref, network_graph_ref, Arc :: clone( & logger_ref) ) ,
1362+ read_external_pathfinding_scores_from_cache( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1363+ KVStore :: read(
1364+ & * kv_store_ref,
1365+ CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
1366+ CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
1367+ CHANNEL_MANAGER_PERSISTENCE_KEY ,
1368+ ) ,
1369+ output_sweeper_future,
1370+ read_event_queue( Arc :: clone( & kv_store_ref) , Arc :: clone( & logger_ref) ) ,
1371+ read_peer_info( Arc :: clone( & kv_store_ref) , Arc :: clone( & logger_ref) ) ,
1372+ )
1373+ } ) ;
1374+
1375+ let local_scorer = match scorer_res {
13161376 Ok ( scorer) => scorer,
13171377 Err ( e) => {
13181378 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
@@ -1328,9 +1388,7 @@ fn build_with_store_internal(
13281388 let scorer = Arc :: new ( Mutex :: new ( CombinedScorer :: new ( local_scorer) ) ) ;
13291389
13301390 // Restore external pathfinding scores from cache if possible.
1331- match runtime. block_on ( async {
1332- read_external_pathfinding_scores_from_cache ( & * kv_store, Arc :: clone ( & logger) ) . await
1333- } ) {
1391+ match external_scores_res {
13341392 Ok ( external_scores) => {
13351393 scorer. lock ( ) . unwrap ( ) . merge ( external_scores, cur_time) ;
13361394 log_trace ! ( logger, "External scores from cache merged successfully" ) ;
@@ -1383,12 +1441,7 @@ fn build_with_store_internal(
13831441
13841442 // Initialize the ChannelManager
13851443 let channel_manager = {
1386- if let Ok ( reader) = KVStoreSync :: read (
1387- & * kv_store,
1388- CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE ,
1389- CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE ,
1390- CHANNEL_MANAGER_PERSISTENCE_KEY ,
1391- ) {
1444+ if let Ok ( reader) = channel_manager_bytes_res {
13921445 let channel_monitor_references =
13931446 channel_monitors. iter ( ) . map ( |( _, chanmon) | chanmon) . collect ( ) ;
13941447 let read_args = ChannelManagerReadArgs :: new (
@@ -1613,17 +1666,7 @@ fn build_with_store_internal(
16131666 let connection_manager =
16141667 Arc :: new ( ConnectionManager :: new ( Arc :: clone ( & peer_manager) , Arc :: clone ( & logger) ) ) ;
16151668
1616- let output_sweeper = match runtime. block_on ( async {
1617- read_output_sweeper (
1618- Arc :: clone ( & tx_broadcaster) ,
1619- Arc :: clone ( & fee_estimator) ,
1620- Arc :: clone ( & chain_source) ,
1621- Arc :: clone ( & keys_manager) ,
1622- Arc :: clone ( & kv_store) ,
1623- Arc :: clone ( & logger) ,
1624- )
1625- . await
1626- } ) {
1669+ let output_sweeper = match sweeper_bytes_res {
16271670 Ok ( output_sweeper) => Arc :: new ( output_sweeper) ,
16281671 Err ( e) => {
16291672 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
@@ -1644,9 +1687,7 @@ fn build_with_store_internal(
16441687 } ,
16451688 } ;
16461689
1647- let event_queue = match runtime
1648- . block_on ( async { read_event_queue ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) . await } )
1649- {
1690+ let event_queue = match event_queue_res {
16501691 Ok ( event_queue) => Arc :: new ( event_queue) ,
16511692 Err ( e) => {
16521693 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
@@ -1658,9 +1699,7 @@ fn build_with_store_internal(
16581699 } ,
16591700 } ;
16601701
1661- let peer_store = match runtime
1662- . block_on ( async { read_peer_info ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) ) . await } )
1663- {
1702+ let peer_store = match peer_info_res {
16641703 Ok ( peer_store) => Arc :: new ( peer_store) ,
16651704 Err ( e) => {
16661705 if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
0 commit comments