diff --git a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection.hs b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection.hs index 9667a82d12..ea9e6f87d5 100644 --- a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection.hs +++ b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection.hs @@ -3488,8 +3488,14 @@ _governorFindingPublicRoots :: Int -> StrictTVar IO OutboundConnectionsState -> IO Void _governorFindingPublicRoots targetNumberOfRootPeers readDomains readUseBootstrapPeers readLedgerStateJudgement peerSharing olocVar = do + countersVar <- newTVarIO emptyPeerSelectionCounters + publicStateVar <- makePublicPeerSelectionStateVar + debugStateVar <- newTVarIO $ emptyPeerSelectionState (mkStdGen 42) dnsSemaphore <- newLedgerAndPublicRootDNSSemaphore let interfaces = PeerSelectionInterfaces { + countersVar, + publicStateVar, + debugStateVar, ledgerPeersConsensusInterface = LedgerPeersConsensusInterface { lpGetLatestSlot = return Origin, lpGetLedgerStateJudgement = return YoungEnough, @@ -3504,16 +3510,10 @@ _governorFindingPublicRoots targetNumberOfRootPeers readDomains readUseBootstrap DNS.defaultResolvConf readDomains (ioDNSActions LookupReqAAndAAAA) $ \requestPublicRootPeers -> do - publicStateVar <- makePublicPeerSelectionStateVar - debugVar <- newTVarIO $ emptyPeerSelectionState (mkStdGen 42) - countersVar <- newTVarIO emptyPeerSelectionCounters peerSelectionGovernor tracer tracer tracer -- TODO: #3182 Rng seed should come from quickcheck. (mkStdGen 42) - countersVar - publicStateVar - debugVar actions { requestPublicRootPeers = \_ -> transformPeerSelectionAction requestPublicRootPeers } diff --git a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection/MockEnvironment.hs b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection/MockEnvironment.hs index 183e6562e9..a20c49b1b0 100644 --- a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection/MockEnvironment.hs +++ b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/PeerSelection/MockEnvironment.hs @@ -213,11 +213,14 @@ governorAction mockEnv = do (ledgerStateJudgement mockEnv) usbVar <- playTimedScript (contramap TraceEnvSetUseBootstrapPeers tracerMockEnv) (useBootstrapPeers mockEnv) - debugVar <- StrictTVar.newTVarIO (emptyPeerSelectionState (mkStdGen 42)) + debugStateVar <- StrictTVar.newTVarIO (emptyPeerSelectionState (mkStdGen 42)) countersVar <- StrictTVar.newTVarIO emptyPeerSelectionCounters policy <- mockPeerSelectionPolicy mockEnv actions <- mockPeerSelectionActions tracerMockEnv mockEnv (readTVar usbVar) (readTVar lsjVar) policy let interfaces = PeerSelectionInterfaces { + countersVar, + publicStateVar, + debugStateVar, -- peer selection tests are not relying on the ledger API ledgerPeersConsensusInterface = LedgerPeersConsensusInterface { lpGetLatestSlot = return Origin, @@ -236,9 +239,6 @@ governorAction mockEnv = do tracerDebugPeerSelection tracerTracePeerSelectionCounters (mkStdGen 42) - countersVar - publicStateVar - debugVar actions policy interfaces diff --git a/ouroboros-network/src/Ouroboros/Network/Diffusion/P2P.hs b/ouroboros-network/src/Ouroboros/Network/Diffusion/P2P.hs index 582878adc5..c7bb9f3611 100644 --- a/ouroboros-network/src/Ouroboros/Network/Diffusion/P2P.hs +++ b/ouroboros-network/src/Ouroboros/Network/Diffusion/P2P.hs @@ -1006,12 +1006,12 @@ runM Interfaces peerSelectionTracer dtTracePeerSelectionCounters fuzzRng - countersVar - daPublicPeerSelectionVar - dbgVar peerSelectionActions peerSelectionPolicy PeerSelectionInterfaces { + countersVar, + publicStateVar = daPublicPeerSelectionVar, + debugStateVar = dbgVar, ledgerPeersConsensusInterface = daLedgerPeersCtx, readUseLedgerPeers = daReadUseLedgerPeers } diff --git a/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor.hs b/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor.hs index 35aee8e1a6..4b07a66d2f 100644 --- a/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor.hs +++ b/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor.hs @@ -50,6 +50,8 @@ module Ouroboros.Network.PeerSelection.Governor import Data.Foldable (traverse_) import Data.Hashable +import Data.Map.Strict (Map) +import Data.Map.Strict qualified as Map import Data.Set qualified as Set import Data.Void (Void) @@ -81,6 +83,8 @@ import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerStateJudgement (..), UseLedgerPeers (..)) import Ouroboros.Network.PeerSelection.LocalRootPeers (OutboundConnectionsState (..)) +import Ouroboros.Network.PeerSelection.PeerAdvertise (PeerAdvertise) +import Ouroboros.Network.PeerSelection.PeerTrustable (PeerTrustable) import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers import Ouroboros.Network.PeerSelection.State.KnownPeers qualified as KnownPeers import Ouroboros.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers @@ -471,24 +475,17 @@ peerSelectionGovernor :: ( Alternative (STM m) -> Tracer m (DebugPeerSelection peeraddr) -> Tracer m PeerSelectionCounters -> StdGen - -> StrictTVar m PeerSelectionCounters - -> StrictTVar m (PublicPeerSelectionState peeraddr) - -> StrictTVar m (PeerSelectionState peeraddr peerconn) -> PeerSelectionActions peeraddr peerconn m -> PeerSelectionPolicy peeraddr m - -> PeerSelectionInterfaces m + -> PeerSelectionInterfaces peeraddr peerconn m -> m Void peerSelectionGovernor tracer debugTracer countersTracer fuzzRng - countersVar publicStateVar debugStateVar actions policy interfaces = JobPool.withJobPool $ \jobPool -> peerSelectionGovernorLoop tracer debugTracer countersTracer - countersVar - publicStateVar - debugStateVar actions policy interfaces @@ -523,24 +520,22 @@ peerSelectionGovernorLoop :: forall m peeraddr peerconn. => Tracer m (TracePeerSelection peeraddr) -> Tracer m (DebugPeerSelection peeraddr) -> Tracer m PeerSelectionCounters - -> StrictTVar m PeerSelectionCounters - -> StrictTVar m (PublicPeerSelectionState peeraddr) - -> StrictTVar m (PeerSelectionState peeraddr peerconn) -> PeerSelectionActions peeraddr peerconn m -> PeerSelectionPolicy peeraddr m - -> PeerSelectionInterfaces m + -> PeerSelectionInterfaces peeraddr peerconn m -> JobPool () m (Completion m peeraddr peerconn) -> PeerSelectionState peeraddr peerconn -> m Void peerSelectionGovernorLoop tracer debugTracer countersTracer - countersVar - publicStateVar - debugStateVar actions policy - interfaces + interfaces@PeerSelectionInterfaces { + countersVar, + publicStateVar, + debugStateVar + } jobPool pst = do loop pst (Time 0) `catch` (\e -> traceWith tracer (TraceOutboundGovernorCriticalFailure e) >> throwIO e) @@ -607,6 +602,7 @@ peerSelectionGovernorLoop tracer isHiddenRealyOrBP <- readIsHiddenRelayOrBP interfaces (bootstrapPeersFlag st'') + (readLocalRootPeers actions) (targets st'') (peerSelectionStateToView st'') @@ -763,8 +759,12 @@ readIsHiddenRelayOrBP :: ( MonadSTM m , Ord peeraddr ) - => PeerSelectionInterfaces m + => PeerSelectionInterfaces peeraddr peerconn m -> UseBootstrapPeers + -> STM m [( LocalRootPeers.HotValency + , LocalRootPeers.WarmValency + , Map peeraddr ( PeerAdvertise + , PeerTrustable))] -> PeerSelectionTargets -> PeerSelectionSetsWithSizes peeraddr -> STM m Bool @@ -774,7 +774,9 @@ readIsHiddenRelayOrBP readUseLedgerPeers } useBootstrapPeers + readLocalRootPeers PeerSelectionTargets { + targetNumberOfKnownPeers, targetNumberOfKnownBigLedgerPeers } PeerSelectionView { @@ -783,7 +785,7 @@ readIsHiddenRelayOrBP viewKnownBigLedgerPeers = (knownBigLedgerPeers, _) } = - do useLedgerPeers <- readUseLedgerPeers + do useLedgerPeers <- readUseLedgerPeers case useLedgerPeers of DontUseLedgerPeers -> return $ case useBootstrapPeers of @@ -792,12 +794,22 @@ readIsHiddenRelayOrBP UseLedgerPeers afterSlot -> do ledgerPeers <- getLedgerPeers ledgerPeersConsensusInterface afterSlot + localRoots <- readLocalRootPeers return $ case ledgerPeers of - BeforeSlot -> True + BeforeSlot -> + case useBootstrapPeers of + UseBootstrapPeers {} -> False + DontUseBootstrapPeers -> True + LedgerPeers {} -> - -- there are no big ledger peers - targetNumberOfKnownBigLedgerPeers == 0 - && (Set.null knownBigLedgerPeers) - -- all known peers are local roots; this implies that there no - -- bootstrap peers, nor ledger peers or shared peers - && knownPeers `Set.isSubsetOf` knownLocalRootPeers + case useBootstrapPeers of + UseBootstrapPeers {} -> False + DontUseBootstrapPeers -> + -- there are no big ledger peers + targetNumberOfKnownBigLedgerPeers == 0 + && (Set.null knownBigLedgerPeers) + + -- all known peers are local roots; this implies that there no + -- bootstrap peers, ledger peers or shared peers. + && targetNumberOfKnownPeers <= Set.size (foldMap (\(_, _, m) -> Map.keysSet m) localRoots) + && knownPeers `Set.isSubsetOf` knownLocalRootPeers diff --git a/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor/Types.hs b/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor/Types.hs index cc28117082..532e1c3454 100644 --- a/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor/Types.hs +++ b/ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor/Types.hs @@ -404,11 +404,28 @@ data PeerSelectionActions peeraddr peerconn m = PeerSelectionActions { -- | Interfaces required by the peer selection governor, which do not need to -- be shared with actions and thus are not part of `PeerSelectionActions`. -- --- TODO: add other `TVar`s which outbound governor is using. --- -data PeerSelectionInterfaces m = PeerSelectionInterfaces { +data PeerSelectionInterfaces peeraddr peerconn m = PeerSelectionInterfaces { + -- | PeerSelectionCounters are shared with churn through a `StrictTVar`. + -- + countersVar :: StrictTVar m PeerSelectionCounters, + + -- | PublicPeerSelectionState var. + -- + publicStateVar :: StrictTVar m (PublicPeerSelectionState peeraddr), + + -- | PeerSelectionState shared for debugging purposes (to support SIGUSR1 + -- debug event tracing) + -- + debugStateVar :: StrictTVar m (PeerSelectionState peeraddr peerconn), + + -- | LedgerPeerConsensusInterface used by `peerSelectionGovernor` to + -- support `HiddenRelayOrBP`. + -- ledgerPeersConsensusInterface :: LedgerPeersConsensusInterface m, + -- | `UseLedgerPeers` used by `peerSelectionGovernor` to support + -- `HiddenRelayOrBP` + -- readUseLedgerPeers :: STM m UseLedgerPeers }