Skip to content

Commit

Permalink
peer-selection: extended PeerSelectionInterfaces
Browse files Browse the repository at this point in the history
Include `TVar`s which the outbound governor is writing to.
  • Loading branch information
coot committed Apr 16, 2024
1 parent 8fa5d96 commit aa153ec
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 41 deletions.
Expand Up @@ -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,
Expand All @@ -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 }
Expand Down
Expand Up @@ -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,
Expand All @@ -236,9 +239,6 @@ governorAction mockEnv = do
tracerDebugPeerSelection
tracerTracePeerSelectionCounters
(mkStdGen 42)
countersVar
publicStateVar
debugVar
actions
policy
interfaces
Expand Down
6 changes: 3 additions & 3 deletions ouroboros-network/src/Ouroboros/Network/Diffusion/P2P.hs
Expand Up @@ -1006,12 +1006,12 @@ runM Interfaces
peerSelectionTracer
dtTracePeerSelectionCounters
fuzzRng
countersVar
daPublicPeerSelectionVar
dbgVar
peerSelectionActions
peerSelectionPolicy
PeerSelectionInterfaces {
countersVar,
publicStateVar = daPublicPeerSelectionVar,
debugStateVar = dbgVar,
ledgerPeersConsensusInterface = daLedgerPeersCtx,
readUseLedgerPeers = daReadUseLedgerPeers
}
Expand Down
62 changes: 37 additions & 25 deletions ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor.hs
Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -607,6 +602,7 @@ peerSelectionGovernorLoop tracer

isHiddenRealyOrBP <- readIsHiddenRelayOrBP interfaces
(bootstrapPeersFlag st'')
(readLocalRootPeers actions)
(targets st'')
(peerSelectionStateToView st'')

Expand Down Expand Up @@ -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
Expand All @@ -774,7 +774,9 @@ readIsHiddenRelayOrBP
readUseLedgerPeers
}
useBootstrapPeers
readLocalRootPeers
PeerSelectionTargets {
targetNumberOfKnownPeers,
targetNumberOfKnownBigLedgerPeers
}
PeerSelectionView {
Expand All @@ -783,7 +785,7 @@ readIsHiddenRelayOrBP
viewKnownBigLedgerPeers = (knownBigLedgerPeers, _)
}
=
do useLedgerPeers <- readUseLedgerPeers
do useLedgerPeers <- readUseLedgerPeers
case useLedgerPeers of
DontUseLedgerPeers ->
return $ case useBootstrapPeers of
Expand All @@ -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
Expand Up @@ -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
}

Expand Down

0 comments on commit aa153ec

Please sign in to comment.