{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
#if __GLASGOW_HASKELL__ < 904
{-# OPTIONS_GHC -Wno-name-shadowing #-}
#endif
module Ouroboros.Network.PeerSelection.Governor
(
PeerSelectionPolicy (..)
, PeerSelectionTargets (..)
, PeerSelectionActions (..)
, PeerSelectionInterfaces (..)
, PeerStateActions (..)
, TracePeerSelection (..)
, ChurnAction (..)
, DebugPeerSelection (..)
, AssociationMode (..)
, readAssociationMode
, DebugPeerSelectionState (..)
, peerSelectionGovernor
, assertPeerSelectionState
, sanePeerSelectionTargets
, establishedPeersStatus
, PeerSelectionState (..)
, PublicPeerSelectionState (..)
, makePublicPeerSelectionStateVar
, PeerSelectionView (..)
, PeerSelectionCounters
, PeerSelectionSetsWithSizes
, peerSelectionStateToCounters
, emptyPeerSelectionCounters
, nullPeerSelectionTargets
, emptyPeerSelectionState
, peerSelectionStateToView
) where
import Data.Foldable (traverse_)
import Data.Hashable
import Data.Map.Strict (Map)
import Data.Void (Void)
import Control.Applicative (Alternative ((<|>)))
import Control.Concurrent.Class.MonadSTM.Strict
import Control.Concurrent.JobPool (JobPool)
import Control.Concurrent.JobPool qualified as JobPool
import Control.Monad.Class.MonadAsync
import Control.Monad.Class.MonadThrow
import Control.Monad.Class.MonadTime.SI
import Control.Monad.Class.MonadTimer.SI
import Control.Tracer (Tracer (..), traceWith)
import System.Random
import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (..))
import Ouroboros.Network.PeerSelection.Governor.ActivePeers qualified as ActivePeers
import Ouroboros.Network.PeerSelection.Governor.BigLedgerPeers qualified as BigLedgerPeers
import Ouroboros.Network.PeerSelection.Governor.EstablishedPeers qualified as EstablishedPeers
import Ouroboros.Network.PeerSelection.Governor.KnownPeers qualified as KnownPeers
import Ouroboros.Network.PeerSelection.Governor.Monitor qualified as Monitor
import Ouroboros.Network.PeerSelection.Governor.RootPeers qualified as RootPeers
import Ouroboros.Network.PeerSelection.Governor.Types
import Ouroboros.Network.PeerSelection.LedgerPeers.Type (UseLedgerPeers (..))
import Ouroboros.Network.PeerSelection.PeerSharing (PeerSharing (..))
import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers
import Ouroboros.Network.PeerSelection.State.KnownPeers qualified as KnownPeers
import Ouroboros.Network.PeerSelection.Types (PublicExtraPeersAPI (..))
peerSelectionGovernor :: ( Alternative (STM m)
, MonadAsync m
, MonadDelay m
, MonadLabelledSTM m
, MonadMask m
, MonadTimer m
, Ord peeraddr
, Show peerconn
, Hashable peeraddr
, Exception exception
, Eq extraCounters
, Semigroup extraPeers
, Eq extraFlags
)
=> Tracer m (TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> Tracer m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> Tracer m (PeerSelectionCounters extraCounters)
-> PeerSelectionGovernorArgs
extraState extraDebugState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn exception m
-> StdGen
-> extraState
-> extraPeers
-> PeerSelectionActions
extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn m
-> PeerSelectionPolicy peeraddr m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters
peeraddr peerconn m
-> m Void
peerSelectionGovernor :: forall (m :: * -> *) peeraddr peerconn exception extraCounters
extraPeers extraFlags extraDebugState extraState extraAPI.
(Alternative (STM m), MonadAsync m, MonadDelay m,
MonadLabelledSTM m, MonadMask m, MonadTimer m, Ord peeraddr,
Show peerconn, Hashable peeraddr, Exception exception,
Eq extraCounters, Semigroup extraPeers, Eq extraFlags) =>
Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> Tracer m (PeerSelectionCounters extraCounters)
-> PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> StdGen
-> extraState
-> extraPeers
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionPolicy peeraddr m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> m Void
peerSelectionGovernor Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
tracer Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
debugTracer Tracer m (PeerSelectionCounters extraCounters)
countersTracer PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
peerSelectionArgs StdGen
fuzzRng
extraState
extraState extraPeers
extraPeers PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
interfaces =
(JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> m Void)
-> m Void
forall group (m :: * -> *) a b.
(MonadAsync m, MonadThrow m, MonadLabelledSTM m) =>
(JobPool group m a -> m b) -> m b
JobPool.withJobPool ((JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> m Void)
-> m Void)
-> (JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> m Void)
-> m Void
forall a b. (a -> b) -> a -> b
$ \JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
jobPool ->
Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> Tracer m (PeerSelectionCounters extraCounters)
-> PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionPolicy peeraddr m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> m Void
forall (m :: * -> *) extraState extraDebugState extraFlags
extraPeers extraAPI extraCounters exception peeraddr peerconn.
(Alternative (STM m), MonadAsync m, MonadDelay m, MonadMask m,
MonadTimer m, Ord peeraddr, Show peerconn, Hashable peeraddr,
Exception exception, Eq extraCounters, Semigroup extraPeers,
Eq extraFlags) =>
Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> Tracer m (PeerSelectionCounters extraCounters)
-> PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionPolicy peeraddr m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> m Void
peerSelectionGovernorLoop
Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
tracer
Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
debugTracer
Tracer m (PeerSelectionCounters extraCounters)
countersTracer
PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
peerSelectionArgs
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions
PeerSelectionPolicy peeraddr m
policy
PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
interfaces
JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
jobPool
(StdGen
-> extraState
-> extraPeers
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
forall extraState extraPeers extraFlags peeraddr peerconn.
StdGen
-> extraState
-> extraPeers
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
emptyPeerSelectionState StdGen
fuzzRng extraState
extraState extraPeers
extraPeers)
peerSelectionGovernorLoop :: forall m extraState extraDebugState extraFlags extraPeers extraAPI extraCounters exception peeraddr peerconn.
( Alternative (STM m)
, MonadAsync m
, MonadDelay m
, MonadMask m
, MonadTimer m
, Ord peeraddr
, Show peerconn
, Hashable peeraddr
, Exception exception
, Eq extraCounters
, Semigroup extraPeers
, Eq extraFlags
)
=> Tracer m (TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> Tracer m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> Tracer m (PeerSelectionCounters extraCounters)
-> PeerSelectionGovernorArgs
extraState extraDebugState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn exception m
-> PeerSelectionActions
extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn m
-> PeerSelectionPolicy peeraddr m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters
peeraddr peerconn m
-> JobPool () m (Completion m extraState extraDebugState extraFlags extraPeers peeraddr peerconn)
-> PeerSelectionState extraState extraFlags extraPeers peeraddr peerconn
-> m Void
peerSelectionGovernorLoop :: forall (m :: * -> *) extraState extraDebugState extraFlags
extraPeers extraAPI extraCounters exception peeraddr peerconn.
(Alternative (STM m), MonadAsync m, MonadDelay m, MonadMask m,
MonadTimer m, Ord peeraddr, Show peerconn, Hashable peeraddr,
Exception exception, Eq extraCounters, Semigroup extraPeers,
Eq extraFlags) =>
Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> Tracer m (PeerSelectionCounters extraCounters)
-> PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionPolicy peeraddr m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> m Void
peerSelectionGovernorLoop Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
tracer
Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
debugTracer
Tracer m (PeerSelectionView extraCounters Int)
countersTracer
PeerSelectionGovernorArgs {
Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Maybe exception
abortGovernor :: Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Maybe exception
abortGovernor :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn exception (m :: * -> *).
PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Maybe exception
abortGovernor
, PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionSetsWithSizes extraCounters peeraddr
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> STM m ()
updateWithState :: PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionSetsWithSizes extraCounters peeraddr
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> STM m ()
updateWithState :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn exception (m :: * -> *).
PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionSetsWithSizes extraCounters peeraddr
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> STM m ()
updateWithState
, extraDecisions :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn exception (m :: * -> *).
PeerSelectionGovernorArgs
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
exception
m
-> ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
extraDecisions = ExtraGuardedDecisions {
MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
preBlocking :: MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
preBlocking :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
preBlocking
, MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postBlocking :: MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postBlocking :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postBlocking
, MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postNonBlocking :: MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postNonBlocking :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postNonBlocking
, Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customTargetsAction :: Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customTargetsAction :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customTargetsAction
, Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customLocalRootsAction :: Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customLocalRootsAction :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customLocalRootsAction
, extraState -> Bool
enableProgressMakingActions :: extraState -> Bool
enableProgressMakingActions :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> extraState -> Bool
enableProgressMakingActions
, extraState -> extraState
ledgerPeerSnapshotExtraStateChange :: extraState -> extraState
ledgerPeerSnapshotExtraStateChange :: forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
ExtraGuardedDecisions
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> extraState -> extraState
ledgerPeerSnapshotExtraStateChange
}
}
actions :: PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions@PeerSelectionActions {
extraPeersAPI :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PublicExtraPeersAPI extraPeers peeraddr
extraPeersAPI = PublicExtraPeersAPI {
extraPeers -> Set peeraddr
extraPeersToSet :: extraPeers -> Set peeraddr
extraPeersToSet :: forall extraPeers peeraddr.
PublicExtraPeersAPI extraPeers peeraddr
-> extraPeers -> Set peeraddr
extraPeersToSet
, extraPeers -> Bool
invariantExtraPeers :: extraPeers -> Bool
invariantExtraPeers :: forall extraPeers peeraddr.
PublicExtraPeersAPI extraPeers peeraddr -> extraPeers -> Bool
invariantExtraPeers
}
, PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraCounters
extraStateToExtraCounters :: PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraCounters
extraStateToExtraCounters :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraCounters
extraStateToExtraCounters
}
PeerSelectionPolicy peeraddr m
policy
interfaces :: PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
interfaces@PeerSelectionInterfaces {
StrictTVar m (PeerSelectionView extraCounters Int)
countersVar :: StrictTVar m (PeerSelectionView extraCounters Int)
countersVar :: forall extraState extraFlags extraPeers extraCounters peeraddr
peerconn (m :: * -> *).
PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> StrictTVar m (PeerSelectionCounters extraCounters)
countersVar,
StrictTVar m (PublicPeerSelectionState peeraddr)
publicStateVar :: StrictTVar m (PublicPeerSelectionState peeraddr)
publicStateVar :: forall extraState extraFlags extraPeers extraCounters peeraddr
peerconn (m :: * -> *).
PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> StrictTVar m (PublicPeerSelectionState peeraddr)
publicStateVar,
StrictTVar
m
(PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn)
debugStateVar :: StrictTVar
m
(PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn)
debugStateVar :: forall extraState extraFlags extraPeers extraCounters peeraddr
peerconn (m :: * -> *).
PeerSelectionInterfaces
extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> StrictTVar
m
(PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn)
debugStateVar
}
JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
jobPool
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
pst = do
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Time -> m Void
loop PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
pst (DiffTime -> Time
Time DiffTime
0) m Void -> (SomeException -> m Void) -> m Void
forall e a. Exception e => m a -> (e -> m a) -> m a
forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> (e -> m a) -> m a
`catch` (\SomeException
e -> Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
-> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Tracer
m
(TracePeerSelection extraDebugState extraFlags extraPeers peeraddr)
tracer (SomeException
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
SomeException
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceOutboundGovernorCriticalFailure SomeException
e) m () -> m Void -> m Void
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SomeException -> m Void
forall e a. Exception e => e -> m a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwIO SomeException
e)
where
loop :: PeerSelectionState extraState extraFlags extraPeers peeraddr peerconn
-> Time
-> m Void
loop :: PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Time -> m Void
loop !PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st !Time
dbgUpdateAt = (extraPeers -> Set peeraddr)
-> (extraPeers -> Bool)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> m Void
-> m Void
forall peeraddr extraPeers extraState extraFlags peerconn a.
Ord peeraddr =>
(extraPeers -> Set peeraddr)
-> (extraPeers -> Bool)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> a
-> a
assertPeerSelectionState extraPeers -> Set peeraddr
extraPeersToSet extraPeers -> Bool
invariantExtraPeers PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st (m Void -> m Void) -> m Void -> m Void
forall a b. (a -> b) -> a -> b
$ do
STM m () -> m ()
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically (STM m () -> m ()) -> STM m () -> m ()
forall a b. (a -> b) -> a -> b
$ StrictTVar m (PublicPeerSelectionState peeraddr)
-> PublicPeerSelectionState peeraddr -> STM m ()
forall (m :: * -> *) a.
MonadSTM m =>
StrictTVar m a -> a -> STM m ()
writeTVar StrictTVar m (PublicPeerSelectionState peeraddr)
publicStateVar (PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicPeerSelectionState peeraddr
forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicPeerSelectionState peeraddr
toPublicState PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st)
blockedAt <- m Time
forall (m :: * -> *). MonadMonotonicTime m => m Time
getMonotonicTime
case abortGovernor blockedAt st of
Maybe exception
Nothing -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
Just exception
exception -> exception -> m ()
forall e a. Exception e => e -> m a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwIO exception
exception
dbgUpdateAt' <- if dbgUpdateAt <= blockedAt
then do
atomically $ writeTVar debugStateVar st
return $ 83 `addTime` blockedAt
else return dbgUpdateAt
let knownPeers' = Time -> KnownPeers peeraddr -> KnownPeers peeraddr
forall peeraddr.
Ord peeraddr =>
Time -> KnownPeers peeraddr -> KnownPeers peeraddr
KnownPeers.setCurrentTime Time
blockedAt (PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> KnownPeers peeraddr
forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> KnownPeers peeraddr
knownPeers PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st)
establishedPeers' = Time
-> EstablishedPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
forall peeraddr peerconn.
Ord peeraddr =>
Time
-> EstablishedPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
EstablishedPeers.setCurrentTime Time
blockedAt (PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
establishedPeers PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st)
st' = PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st { knownPeers = knownPeers',
establishedPeers = establishedPeers' }
timedDecision <- evalGuardedDecisions blockedAt st'
now <- getMonotonicTime
let Decision { decisionTrace, decisionJobs, decisionState = st'' } =
timedDecision now
mbCounters <- atomically $ do
let peerSelectionView =
(extraPeers -> Set peeraddr)
-> (PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraCounters)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PeerSelectionSetsWithSizes extraCounters peeraddr
forall peeraddr extraPeers extraState extraFlags peerconn
extraViews.
Ord peeraddr =>
(extraPeers -> Set peeraddr)
-> (PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraViews)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PeerSelectionSetsWithSizes extraViews peeraddr
peerSelectionStateToView extraPeers -> Set peeraddr
extraPeersToSet PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraCounters
extraStateToExtraCounters PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st''
updateWithState interfaces actions peerSelectionView st''
counters <- readTVar countersVar
let !counters' = (Set peeraddr, Int) -> Int
forall a b. (a, b) -> b
snd ((Set peeraddr, Int) -> Int)
-> PeerSelectionSetsWithSizes extraCounters peeraddr
-> PeerSelectionView extraCounters Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PeerSelectionSetsWithSizes extraCounters peeraddr
peerSelectionView
if counters' /= counters
then writeTVar countersVar counters'
>> return (Just counters')
else return Nothing
traverse_ (traceWith countersTracer) mbCounters
traverse_ (traceWith tracer) decisionTrace
mapM_ (JobPool.forkJob jobPool) decisionJobs
loop st'' dbgUpdateAt'
evalGuardedDecisions :: Time
-> PeerSelectionState extraState extraFlags extraPeers peeraddr peerconn
-> m (TimedDecision m extraState extraDebugState extraFlags extraPeers peeraddr peerconn)
evalGuardedDecisions :: Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> m (TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
evalGuardedDecisions Time
blockedAt PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st = do
inboundPeers <- PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> m (Map peeraddr PeerSharing)
forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> m (Map peeraddr PeerSharing)
readInboundPeers PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions
case guardedDecisions blockedAt st inboundPeers of
GuardedSkip Maybe Time
_ ->
[Char]
-> m (TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. HasCallStack => [Char] -> a
error [Char]
"peerSelectionGovernorLoop: impossible: nothing to do"
Guarded Maybe Time
Nothing STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
decisionAction -> do
Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> DebugPeerSelection extraState extraFlags extraPeers peeraddr
-> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
debugTracer (Time
-> Maybe DiffTime
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> DebugPeerSelection extraState extraFlags extraPeers peeraddr
forall extraState extraFlags extraPeers peeraddr peerconn.
Show peerconn =>
Time
-> Maybe DiffTime
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> DebugPeerSelection extraState extraFlags extraPeers peeraddr
TraceGovernorState Time
blockedAt Maybe DiffTime
forall a. Maybe a
Nothing PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st)
STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> m (TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
decisionAction
Guarded (Just Time
wakeupAt) STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
decisionAction -> do
let wakeupIn :: DiffTime
wakeupIn = Time -> Time -> DiffTime
diffTime Time
wakeupAt Time
blockedAt
Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
-> DebugPeerSelection extraState extraFlags extraPeers peeraddr
-> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Tracer
m (DebugPeerSelection extraState extraFlags extraPeers peeraddr)
debugTracer (Time
-> Maybe DiffTime
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> DebugPeerSelection extraState extraFlags extraPeers peeraddr
forall extraState extraFlags extraPeers peeraddr peerconn.
Show peerconn =>
Time
-> Maybe DiffTime
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> DebugPeerSelection extraState extraFlags extraPeers peeraddr
TraceGovernorState Time
blockedAt (DiffTime -> Maybe DiffTime
forall a. a -> Maybe a
Just DiffTime
wakeupIn) PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st)
(readTimeout, cancelTimeout) <- DiffTime -> m (STM m TimeoutState, m ())
forall (m :: * -> *).
MonadTimer m =>
DiffTime -> m (STM m TimeoutState, m ())
registerDelayCancellable DiffTime
wakeupIn
let wakeup = STM m TimeoutState
readTimeout STM m TimeoutState
-> (TimeoutState
-> STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a b. STM m a -> (a -> STM m b) -> STM m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\case TimeoutState
TimeoutPending -> STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. STM m a
forall (m :: * -> *) a. MonadSTM m => STM m a
retry
TimeoutState
_ -> TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
-> STM
m
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. a -> STM m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
forall extraState extraFlags extraPeers peeraddr peerconn
(m :: * -> *) extraDebugState.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
wakeupDecision PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st))
timedDecision <- atomically (decisionAction <|> wakeup)
cancelTimeout
return timedDecision
guardedDecisions :: Time
-> PeerSelectionState extraState extraFlags extraPeers peeraddr peerconn
-> Map peeraddr PeerSharing
-> Guarded (STM m) (TimedDecision m extraState extraDebugState extraFlags extraPeers peeraddr peerconn)
guardedDecisions :: Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Map peeraddr PeerSharing
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
guardedDecisions Time
blockedAt PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st Map peeraddr PeerSharing
inboundPeers =
MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
preBlocking PeerSelectionPolicy peeraddr m
policy PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) extraState extraDebugState extraFlags
extraPeers extraAPI extraCounters peeraddr peerconn.
(MonadSTM m, Ord peeraddr) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
Monitor.connections PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) extraState extraDebugState extraFlags
extraPeers peeraddr peerconn.
MonadSTM m =>
JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
Monitor.jobs JobPool
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
jobPool PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> (extraState -> extraState)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) extraState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn extraDebugState.
MonadSTM m =>
(extraState -> extraState)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
Monitor.ledgerPeerSnapshotChange extraState -> extraState
ledgerPeerSnapshotExtraStateChange PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> case Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customTargetsAction of
Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
Nothing -> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) peeraddr extraState extraFlags extraPeers
extraAPI extraCounters peerconn extraDebugState.
(MonadSTM m, Ord peeraddr) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
Monitor.targetPeers PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Just MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
targetsActions -> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
targetsActions PeerSelectionPolicy peeraddr m
policy PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> case Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
customLocalRootsAction of
Maybe
(MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m)
Nothing -> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
(MonadSTM m, Ord peeraddr, Eq extraFlags) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
Monitor.localRoots PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Just MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
localRootsActions -> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
localRootsActions PeerSelectionPolicy peeraddr m
policy PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postBlocking PeerSelectionPolicy peeraddr m
policy PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> (extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) peeraddr extraPeers extraState extraFlags
extraAPI extraCounters peerconn extraDebugState.
(MonadSTM m, Ord peeraddr, Semigroup extraPeers) =>
(extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
BigLedgerPeers.belowTarget extraState -> Bool
enableProgressMakingActions
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions Time
blockedAt PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall (m :: * -> *) extraState extraDebugState extraFlags extraAPI
extraPeers extraCounters peeraddr peerconn.
(Alternative (STM m), MonadSTM m, Ord peeraddr, HasCallStack) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
BigLedgerPeers.aboveTarget PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) peeraddr extraPeers extraState extraFlags
extraAPI extraCounters peerconn extraDebugState.
(MonadSTM m, Ord peeraddr, Semigroup extraPeers) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Time
-> PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
RootPeers.belowTarget PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions Time
blockedAt PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> (extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Time
-> Map peeraddr PeerSharing
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall (m :: * -> *) peeraddr extraState extraFlags extraPeers
extraAPI extraCounters peerconn extraDebugState.
(MonadAsync m, MonadTimer m, Ord peeraddr, Hashable peeraddr) =>
(extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> Time
-> Map peeraddr PeerSharing
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
KnownPeers.belowTarget extraState -> Bool
enableProgressMakingActions
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions Time
blockedAt Map peeraddr PeerSharing
inboundPeers PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall (m :: * -> *) peeraddr extraState extraFlags extraPeers
extraAPI extraCounters peerconn extraDebugState.
(MonadSTM m, Ord peeraddr, HasCallStack) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
KnownPeers.aboveTarget PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> (extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
(Alternative (STM m), MonadSTM m, Ord peeraddr) =>
(extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
EstablishedPeers.belowTarget extraState -> Bool
enableProgressMakingActions
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
(Alternative (STM m), MonadSTM m, Ord peeraddr) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
EstablishedPeers.aboveTarget PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> (extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
(Alternative (STM m), MonadDelay m, MonadSTM m, Ord peeraddr,
HasCallStack) =>
(extraState -> Bool)
-> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
ActivePeers.belowTarget extraState -> Bool
enableProgressMakingActions
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
(Alternative (STM m), MonadSTM m, Ord peeraddr, HasCallStack) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> MkGuardedDecision
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
m
ActivePeers.aboveTarget PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionPolicy peeraddr m
policy PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
forall a. Semigroup a => a -> a -> a
<> MonitoringAction
extraState
extraDebugState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
postNonBlocking PeerSelectionPolicy peeraddr m
policy PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
actions PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st
wakeupDecision :: PeerSelectionState extraState extraFlags extraPeers peeraddr peerconn
-> TimedDecision m extraState extraDebugState extraFlags extraPeers peeraddr peerconn
wakeupDecision :: forall extraState extraFlags extraPeers peeraddr peerconn
(m :: * -> *) extraDebugState.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> TimedDecision
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn
wakeupDecision PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st Time
_now =
Decision {
decisionTrace :: [TracePeerSelection extraDebugState extraFlags extraPeers peeraddr]
decisionTrace = [TracePeerSelection extraDebugState extraFlags extraPeers peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
TracePeerSelection extraDebugState extraFlags extraPeers peeraddr
TraceGovernorWakeup],
decisionState :: PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
decisionState = PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
st { stdGen = fst (split (stdGen st)) } ,
decisionJobs :: [Job
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)]
decisionJobs = []
}
readAssociationMode
:: MonadSTM m
=> STM m UseLedgerPeers
-> PeerSharing
-> UseBootstrapPeers
-> STM m AssociationMode
readAssociationMode :: forall (m :: * -> *).
MonadSTM m =>
STM m UseLedgerPeers
-> PeerSharing -> UseBootstrapPeers -> STM m AssociationMode
readAssociationMode
STM m UseLedgerPeers
readUseLedgerPeers
PeerSharing
peerSharing
UseBootstrapPeers
useBootstrapPeers
=
do useLedgerPeers <- STM m UseLedgerPeers
readUseLedgerPeers
pure $
case (useLedgerPeers, peerSharing, useBootstrapPeers) of
(UseLedgerPeers
DontUseLedgerPeers, PeerSharing
PeerSharingDisabled, UseBootstrapPeers
DontUseBootstrapPeers)
-> AssociationMode
LocalRootsOnly
(UseLedgerPeers
DontUseLedgerPeers, PeerSharing
PeerSharingDisabled, UseBootstrapPeers [RelayAccessPoint]
config)
| [RelayAccessPoint] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [RelayAccessPoint]
config
-> AssociationMode
LocalRootsOnly
(UseLedgerPeers, PeerSharing, UseBootstrapPeers)
_ -> AssociationMode
Unrestricted