@@ -65,7 +65,13 @@ use crate::io::utils::{
6565} ;
6666use crate :: io:: vss_store:: VssStoreBuilder ;
6767use crate :: io:: {
68- self , PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE , PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
68+ self , CHANNEL_FORWARDING_STATS_PERSISTENCE_PRIMARY_NAMESPACE ,
69+ CHANNEL_FORWARDING_STATS_PERSISTENCE_SECONDARY_NAMESPACE ,
70+ CHANNEL_PAIR_FORWARDING_STATS_PERSISTENCE_PRIMARY_NAMESPACE ,
71+ CHANNEL_PAIR_FORWARDING_STATS_PERSISTENCE_SECONDARY_NAMESPACE ,
72+ FORWARDED_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
73+ FORWARDED_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
74+ PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE , PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
6975 PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
7076 PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
7177} ;
@@ -82,7 +88,8 @@ use crate::probing::{
8288use crate :: runtime:: { Runtime , RuntimeSpawner } ;
8389use crate :: tx_broadcaster:: TransactionBroadcaster ;
8490use crate :: types:: {
85- AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreRef , DynStoreWrapper ,
91+ AsyncPersister , ChainMonitor , ChannelForwardingStatsStore , ChannelManager ,
92+ ChannelPairForwardingStatsStore , DynStore , DynStoreRef , DynStoreWrapper , ForwardedPaymentStore ,
8693 GossipSync , Graph , HRNResolver , KeysManager , MessageRouter , OnionMessenger , PaymentStore ,
8794 PeerManager , PendingPaymentStore ,
8895} ;
@@ -1439,24 +1446,48 @@ fn build_with_store_internal(
14391446
14401447 let kv_store_ref = Arc :: clone ( & kv_store) ;
14411448 let logger_ref = Arc :: clone ( & logger) ;
1442- let ( payment_store_res, node_metris_res, pending_payment_store_res) =
1443- runtime. block_on ( async move {
1444- tokio:: join!(
1445- read_all_objects(
1446- & * kv_store_ref,
1447- PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
1448- PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
1449- Arc :: clone( & logger_ref) ,
1450- ) ,
1451- read_node_metrics( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1452- read_all_objects(
1453- & * kv_store_ref,
1454- PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
1455- PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
1456- Arc :: clone( & logger_ref) ,
1457- )
1449+ let (
1450+ payment_store_res,
1451+ forwarded_payment_store_res,
1452+ channel_forwarding_stats_res,
1453+ channel_pair_forwarding_stats_res,
1454+ node_metris_res,
1455+ pending_payment_store_res,
1456+ ) = runtime. block_on ( async move {
1457+ tokio:: join!(
1458+ read_all_objects(
1459+ & * kv_store_ref,
1460+ PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
1461+ PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
1462+ Arc :: clone( & logger_ref) ,
1463+ ) ,
1464+ read_all_objects(
1465+ & * kv_store_ref,
1466+ FORWARDED_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
1467+ FORWARDED_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
1468+ Arc :: clone( & logger_ref) ,
1469+ ) ,
1470+ read_all_objects(
1471+ & * kv_store_ref,
1472+ CHANNEL_FORWARDING_STATS_PERSISTENCE_PRIMARY_NAMESPACE ,
1473+ CHANNEL_FORWARDING_STATS_PERSISTENCE_SECONDARY_NAMESPACE ,
1474+ Arc :: clone( & logger_ref) ,
1475+ ) ,
1476+ read_all_objects(
1477+ & * kv_store_ref,
1478+ CHANNEL_PAIR_FORWARDING_STATS_PERSISTENCE_PRIMARY_NAMESPACE ,
1479+ CHANNEL_PAIR_FORWARDING_STATS_PERSISTENCE_SECONDARY_NAMESPACE ,
1480+ Arc :: clone( & logger_ref) ,
1481+ ) ,
1482+ read_node_metrics( & * kv_store_ref, Arc :: clone( & logger_ref) ) ,
1483+ read_all_objects(
1484+ & * kv_store_ref,
1485+ PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
1486+ PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
1487+ Arc :: clone( & logger_ref) ,
14581488 )
1459- } ) ;
1489+ )
1490+ } ) ;
14601491
14611492 // Initialize the status fields.
14621493 let node_metrics = match node_metris_res {
@@ -1485,6 +1516,55 @@ fn build_with_store_internal(
14851516 } ,
14861517 } ;
14871518
1519+ let ( forwarded_payment_store, has_stored_forwarded_payments) = match forwarded_payment_store_res
1520+ {
1521+ Ok ( forwarded_payments) => {
1522+ let has_stored_forwarded_payments = !forwarded_payments. is_empty ( ) ;
1523+ (
1524+ Arc :: new ( ForwardedPaymentStore :: new (
1525+ forwarded_payments,
1526+ FORWARDED_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE . to_string ( ) ,
1527+ FORWARDED_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE . to_string ( ) ,
1528+ Arc :: clone ( & kv_store) ,
1529+ Arc :: clone ( & logger) ,
1530+ ) ) ,
1531+ has_stored_forwarded_payments,
1532+ )
1533+ } ,
1534+ Err ( e) => {
1535+ log_error ! ( logger, "Failed to read forwarded payment data from store: {}" , e) ;
1536+ return Err ( BuildError :: ReadFailed ) ;
1537+ } ,
1538+ } ;
1539+
1540+ let channel_forwarding_stats_store = match channel_forwarding_stats_res {
1541+ Ok ( stats) => Arc :: new ( ChannelForwardingStatsStore :: new (
1542+ stats,
1543+ CHANNEL_FORWARDING_STATS_PERSISTENCE_PRIMARY_NAMESPACE . to_string ( ) ,
1544+ CHANNEL_FORWARDING_STATS_PERSISTENCE_SECONDARY_NAMESPACE . to_string ( ) ,
1545+ Arc :: clone ( & kv_store) ,
1546+ Arc :: clone ( & logger) ,
1547+ ) ) ,
1548+ Err ( e) => {
1549+ log_error ! ( logger, "Failed to read channel forwarding stats from store: {}" , e) ;
1550+ return Err ( BuildError :: ReadFailed ) ;
1551+ } ,
1552+ } ;
1553+
1554+ let channel_pair_forwarding_stats_store = match channel_pair_forwarding_stats_res {
1555+ Ok ( stats) => Arc :: new ( ChannelPairForwardingStatsStore :: new (
1556+ stats,
1557+ CHANNEL_PAIR_FORWARDING_STATS_PERSISTENCE_PRIMARY_NAMESPACE . to_string ( ) ,
1558+ CHANNEL_PAIR_FORWARDING_STATS_PERSISTENCE_SECONDARY_NAMESPACE . to_string ( ) ,
1559+ Arc :: clone ( & kv_store) ,
1560+ Arc :: clone ( & logger) ,
1561+ ) ) ,
1562+ Err ( e) => {
1563+ log_error ! ( logger, "Failed to read channel pair forwarding stats from store: {}" , e) ;
1564+ return Err ( BuildError :: ReadFailed ) ;
1565+ } ,
1566+ } ;
1567+
14881568 let ( chain_source, chain_tip_opt) = match chain_data_source_config {
14891569 Some ( ChainDataSourceConfig :: Esplora { server_url, headers, sync_config } ) => {
14901570 let sync_config = sync_config. unwrap_or ( EsploraSyncConfig :: default ( ) ) ;
@@ -2306,6 +2386,17 @@ fn build_with_store_internal(
23062386 } )
23072387 } ) ;
23082388
2389+ let forwarded_payment_aggregation_retention_secs = match config. forwarded_payment_tracking_mode
2390+ {
2391+ crate :: config:: ForwardedPaymentTrackingMode :: Detailed => {
2392+ Some ( crate :: payment:: store:: FORWARDED_PAYMENT_AGGREGATION_BUCKET_SIZE_SECS )
2393+ } ,
2394+ crate :: config:: ForwardedPaymentTrackingMode :: Stats if has_stored_forwarded_payments => {
2395+ Some ( 0 )
2396+ } ,
2397+ _ => None ,
2398+ } ;
2399+
23092400 Ok ( Node {
23102401 runtime,
23112402 stop_sender,
@@ -2333,6 +2424,10 @@ fn build_with_store_internal(
23332424 scorer,
23342425 peer_store,
23352426 payment_store,
2427+ forwarded_payment_store,
2428+ channel_forwarding_stats_store,
2429+ channel_pair_forwarding_stats_store,
2430+ forwarded_payment_aggregation_retention_secs,
23362431 lnurl_auth,
23372432 is_running,
23382433 node_metrics,
0 commit comments