8
8
{-# LANGUAGE NamedFieldPuns #-}
9
9
{-# LANGUAGE PackageImports #-}
10
10
{-# LANGUAGE ScopedTypeVariables #-}
11
- {-# LANGUAGE TypeApplications #-}
12
11
{-# LANGUAGE TupleSections #-}
12
+ {-# LANGUAGE TypeApplications #-}
13
13
14
14
{-# OPTIONS_GHC -Wno-unused-imports #-}
15
15
@@ -39,12 +39,14 @@ import Control.Monad.Class.MonadThrow (MonadThrow (..))
39
39
import Control.Monad.IO.Class (MonadIO (.. ))
40
40
import Control.Monad.Trans.Except (ExceptT , runExceptT )
41
41
import Control.Monad.Trans.Except.Extra (left )
42
+ import Control.Monad.Trans.Maybe (MaybeT (.. ), mapMaybeT )
42
43
import "contra-tracer" Control.Tracer
43
44
import Data.Either (partitionEithers )
44
45
import Data.Map.Strict (Map )
45
46
import qualified Data.Map.Strict as Map
46
47
import Data.Maybe (catMaybes , fromMaybe , mapMaybe )
47
48
import Data.Monoid (Last (.. ))
49
+ import Data.Foldable (traverse_ )
48
50
import Data.Proxy (Proxy (.. ))
49
51
import Data.Text (Text , breakOn , pack )
50
52
import qualified Data.Text as Text
@@ -125,7 +127,7 @@ import Cardano.Node.TraceConstraints (TraceConstraints)
125
127
import Cardano.Tracing.Tracers
126
128
import Ouroboros.Network.PeerSelection.PeerSharing (PeerSharing (.. ))
127
129
import Ouroboros.Network.PeerSelection.State.LocalRootPeers (HotValency , WarmValency )
128
- import Ouroboros.Network.PeerSelection.LedgerPeers.Type (UseLedgerPeers )
130
+ import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerPeerSnapshot ( .. ), UseLedgerPeers )
129
131
import Ouroboros.Network.PeerSelection.PeerTrustable (PeerTrustable )
130
132
import Ouroboros.Network.PeerSelection.Bootstrap (UseBootstrapPeers )
131
133
@@ -420,16 +422,24 @@ handleSimpleNode blockType runP p2pMode tracers nc onKernel = do
420
422
nt@ TopologyP2P. RealNodeTopology
421
423
{ ntUseLedgerPeers
422
424
, ntUseBootstrapPeers
425
+ , ntPeerSnapshotPath
423
426
} <- TopologyP2P. readTopologyFileOrError (startupTracer tracers) nc
424
427
let (localRoots, publicRoots) = producerAddresses nt
425
428
traceWith (startupTracer tracers)
426
429
$ NetworkConfig localRoots
427
430
publicRoots
428
431
ntUseLedgerPeers
429
- localRootsVar <- newTVarIO localRoots
430
- publicRootsVar <- newTVarIO publicRoots
431
- useLedgerVar <- newTVarIO ntUseLedgerPeers
432
+ ntPeerSnapshotPath
433
+ localRootsVar <- newTVarIO localRoots
434
+ publicRootsVar <- newTVarIO publicRoots
435
+ useLedgerVar <- newTVarIO ntUseLedgerPeers
432
436
useBootstrapVar <- newTVarIO ntUseBootstrapPeers
437
+ ledgerPeerSnapshotPathVar <- newTVarIO ntPeerSnapshotPath
438
+ ledgerPeerSnapshotVar <- newTVarIO =<< updateLedgerPeerSnapshot
439
+ (startupTracer tracers)
440
+ (readTVar ledgerPeerSnapshotPathVar)
441
+ (const . pure $ () )
442
+
433
443
let nodeArgs = RunNodeArgs
434
444
{ rnTraceConsensus = consensusTracers tracers
435
445
, rnTraceNTN = nodeToNodeTracers tracers
@@ -462,6 +472,11 @@ handleSimpleNode blockType runP p2pMode tracers nc onKernel = do
462
472
updateTopologyConfiguration
463
473
(startupTracer tracers) nc
464
474
localRootsVar publicRootsVar useLedgerVar useBootstrapVar
475
+ ledgerPeerSnapshotPathVar
476
+ void $ updateLedgerPeerSnapshot
477
+ (startupTracer tracers)
478
+ (readTVar ledgerPeerSnapshotPathVar)
479
+ (writeTVar ledgerPeerSnapshotVar)
465
480
traceWith (startupTracer tracers) (BlockForgingUpdate NotEffective )
466
481
)
467
482
Nothing
@@ -473,13 +488,15 @@ handleSimpleNode blockType runP p2pMode tracers nc onKernel = do
473
488
(readTVar publicRootsVar)
474
489
(readTVar useLedgerVar)
475
490
(readTVar useBootstrapVar)
491
+ (readTVar ledgerPeerSnapshotVar)
476
492
in
477
493
Node. run
478
494
nodeArgs {
479
495
rnNodeKernelHook = \ registry nodeKernel -> do
480
496
-- reinstall `SIGHUP` handler
481
497
installP2PSigHUPHandler (startupTracer tracers) blockType nc nodeKernel
482
498
localRootsVar publicRootsVar useLedgerVar useBootstrapVar
499
+ ledgerPeerSnapshotPathVar
483
500
rnNodeKernelHook nodeArgs registry nodeKernel
484
501
}
485
502
StdRunNodeArgs
@@ -648,17 +665,19 @@ installP2PSigHUPHandler :: Tracer IO (StartupTrace blk)
648
665
-> StrictTVar IO (Map RelayAccessPoint PeerAdvertise )
649
666
-> StrictTVar IO UseLedgerPeers
650
667
-> StrictTVar IO UseBootstrapPeers
668
+ -> StrictTVar IO (Maybe PeerSnapshotFile )
651
669
-> IO ()
652
670
#ifndef UNIX
653
671
installP2PSigHUPHandler _ _ _ _ _ _ _ _ = return ()
654
672
#else
655
673
installP2PSigHUPHandler startupTracer blockType nc nodeKernel localRootsVar publicRootsVar useLedgerVar
656
- useBootstrapPeersVar =
674
+ useBootstrapPeersVar ledgerPeerSnapshotPathVar =
657
675
void $ Signals. installHandler
658
676
Signals. sigHUP
659
677
(Signals. Catch $ do
660
678
updateBlockForging startupTracer blockType nodeKernel nc
661
- updateTopologyConfiguration startupTracer nc localRootsVar publicRootsVar useLedgerVar useBootstrapPeersVar
679
+ updateTopologyConfiguration startupTracer nc localRootsVar publicRootsVar
680
+ useLedgerVar useBootstrapPeersVar ledgerPeerSnapshotPathVar
662
681
)
663
682
Nothing
664
683
#endif
@@ -743,9 +762,10 @@ updateTopologyConfiguration :: Tracer IO (StartupTrace blk)
743
762
-> StrictTVar IO (Map RelayAccessPoint PeerAdvertise )
744
763
-> StrictTVar IO UseLedgerPeers
745
764
-> StrictTVar IO UseBootstrapPeers
765
+ -> StrictTVar IO (Maybe PeerSnapshotFile )
746
766
-> IO ()
747
767
updateTopologyConfiguration startupTracer nc localRootsVar publicRootsVar useLedgerVar
748
- useBootsrapPeersVar = do
768
+ useBootsrapPeersVar ledgerPeerSnapshotPathVar = do
749
769
traceWith startupTracer NetworkConfigUpdate
750
770
result <- try $ readTopologyFileOrError startupTracer nc
751
771
case result of
@@ -755,17 +775,36 @@ updateTopologyConfiguration startupTracer nc localRootsVar publicRootsVar useLed
755
775
$ pack " Error reading topology configuration file:" <> err
756
776
Right nt@ RealNodeTopology { ntUseLedgerPeers
757
777
, ntUseBootstrapPeers
778
+ , ntPeerSnapshotPath
758
779
} -> do
759
780
let (localRoots, publicRoots) = producerAddresses nt
760
781
traceWith startupTracer
761
- $ NetworkConfig localRoots publicRoots ntUseLedgerPeers
782
+ $ NetworkConfig localRoots publicRoots ntUseLedgerPeers ntPeerSnapshotPath
762
783
atomically $ do
763
784
writeTVar localRootsVar localRoots
764
785
writeTVar publicRootsVar publicRoots
765
786
writeTVar useLedgerVar ntUseLedgerPeers
766
787
writeTVar useBootsrapPeersVar ntUseBootstrapPeers
788
+ writeTVar ledgerPeerSnapshotPathVar ntPeerSnapshotPath
767
789
#endif
768
790
791
+ updateLedgerPeerSnapshot :: Tracer IO (StartupTrace blk )
792
+ -> STM IO (Maybe PeerSnapshotFile )
793
+ -> (Maybe LedgerPeerSnapshot -> STM IO () )
794
+ -> IO (Maybe LedgerPeerSnapshot )
795
+ updateLedgerPeerSnapshot startupTracer readLedgerPeerPath writeVar = runMaybeT $
796
+ (\ io_m_lps -> do
797
+ m_lps <- io_m_lps
798
+ traverse_ (\ (LedgerPeerSnapshot (wOrigin, _)) ->
799
+ traceWith startupTracer
800
+ (LedgerPeerSnapshotLoaded wOrigin)) m_lps
801
+ atomically . writeVar $ m_lps
802
+ io_m_lps)
803
+ -- ^ ensures that snapshot payload TVar is updated to Nothing
804
+ -- if the path entry is removed from topology file sometime
805
+ -- before sighup
806
+ `mapMaybeT` (liftIO . readPeerSnapshotFile =<< MaybeT (atomically readLedgerPeerPath))
807
+
769
808
--------------------------------------------------------------------------------
770
809
-- Helper functions
771
810
--------------------------------------------------------------------------------
@@ -823,6 +862,7 @@ mkP2PArguments
823
862
-> STM IO (Map RelayAccessPoint PeerAdvertise )
824
863
-> STM IO UseLedgerPeers
825
864
-> STM IO UseBootstrapPeers
865
+ -> STM IO (Maybe LedgerPeerSnapshot )
826
866
-> Diffusion. ExtraArguments 'Diffusion.P2P IO
827
867
mkP2PArguments NodeConfiguration {
828
868
ncTargetNumberOfRootPeers,
@@ -839,13 +879,15 @@ mkP2PArguments NodeConfiguration {
839
879
daReadLocalRootPeers
840
880
daReadPublicRootPeers
841
881
daReadUseLedgerPeers
842
- daReadUseBootstrapPeers =
882
+ daReadUseBootstrapPeers
883
+ daReadLedgerPeerSnapshot =
843
884
Diffusion. P2PArguments P2P. ArgumentsExtra
844
885
{ P2P. daPeerSelectionTargets
845
886
, P2P. daReadLocalRootPeers
846
887
, P2P. daReadPublicRootPeers
847
888
, P2P. daReadUseLedgerPeers
848
889
, P2P. daReadUseBootstrapPeers
890
+ , P2P. daReadLedgerPeerSnapshot
849
891
, P2P. daProtocolIdleTimeout = ncProtocolIdleTimeout
850
892
, P2P. daTimeWaitTimeout = ncTimeWaitTimeout
851
893
, P2P. daDeadlineChurnInterval = 3300
0 commit comments