{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Ouroboros.Cardano.Network.PeerSelection.Governor.Monitor
( targetPeers
, localRoots
, monitorLedgerStateJudgement
, monitorBootstrapPeersFlag
, waitForSystemToQuiesce
) where
import Data.Set qualified as Set
import Control.Monad.Class.MonadSTM
import Control.Monad.Class.MonadTime.SI
import Cardano.Network.ConsensusMode
import Cardano.Network.PeerSelection.Bootstrap (isBootstrapPeersEnabled,
isNodeAbleToMakeProgress, requiresBootstrapPeers)
import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable (..))
import Cardano.Network.Types (LedgerStateJudgement (..))
import Control.Exception (assert)
import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Set (Set)
import Ouroboros.Cardano.Network.LedgerPeerConsensusInterface qualified as Cardano
import Ouroboros.Cardano.Network.PeerSelection.Governor.PeerSelectionActions qualified as Cardano
import Ouroboros.Cardano.Network.PeerSelection.Governor.PeerSelectionState qualified as Cardano
import Ouroboros.Cardano.Network.PublicRootPeers qualified as Cardano
import Ouroboros.Network.PeerSelection.Governor.ActivePeers
(jobDemoteActivePeer)
import Ouroboros.Network.PeerSelection.Governor.Monitor (jobVerifyPeerSnapshot)
import Ouroboros.Network.PeerSelection.Governor.Types hiding
(PeerSelectionCounters)
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
(LedgerPeersConsensusInterface (..))
import Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers
import Ouroboros.Network.PeerSelection.State.KnownPeers qualified as KnownPeers
import Ouroboros.Network.PeerSelection.State.LocalRootPeers
(LocalRootConfig (..))
import Ouroboros.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers
import Ouroboros.Network.PeerSelection.Types
governor_BOOTSTRAP_PEERS_TIMEOUT :: DiffTime
governor_BOOTSTRAP_PEERS_TIMEOUT :: DiffTime
governor_BOOTSTRAP_PEERS_TIMEOUT = DiffTime
15 DiffTime -> DiffTime -> DiffTime
forall a. Num a => a -> a -> a
* DiffTime
60
targetPeers
:: (MonadSTM m, Ord peeraddr)
=> Cardano.ExtraPeerSelectionActions m
-> PeerSelectionActions
Cardano.ExtraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
Cardano.ExtraState
PeerTrustable
extraPeers
peeraddr
peerconn
-> Guarded (STM m)
(TimedDecision m Cardano.ExtraState extraDebugState PeerTrustable
extraPeers peeraddr peerconn)
targetPeers :: forall (m :: * -> *) peeraddr extraFlags extraPeers extraAPI
extraCounters peerconn extraDebugState.
(MonadSTM m, Ord peeraddr) =>
ExtraPeerSelectionActions m
-> PeerSelectionActions
ExtraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
ExtraState PeerTrustable extraPeers peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)
targetPeers Cardano.ExtraPeerSelectionActions {
PeerSelectionTargets
genesisPeerTargets :: PeerSelectionTargets
genesisPeerTargets :: forall (m :: * -> *).
ExtraPeerSelectionActions m -> PeerSelectionTargets
Cardano.genesisPeerTargets
}
PeerSelectionActions {
PeerSelectionTargets
peerSelectionTargets :: PeerSelectionTargets
peerSelectionTargets :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionTargets
peerSelectionTargets,
STM m PeerSelectionTargets
readPeerSelectionTargets :: STM m PeerSelectionTargets
readPeerSelectionTargets :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> STM m PeerSelectionTargets
readPeerSelectionTargets,
PublicExtraPeersAPI extraPeers peeraddr
extraPeersAPI :: PublicExtraPeersAPI extraPeers peeraddr
extraPeersAPI :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> PublicExtraPeersAPI extraPeers peeraddr
extraPeersAPI
}
st :: PeerSelectionState
ExtraState PeerTrustable extraPeers peeraddr peerconn
st@PeerSelectionState{
PublicRootPeers extraPeers peeraddr
publicRootPeers :: PublicRootPeers extraPeers peeraddr
publicRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicRootPeers extraPeers peeraddr
publicRootPeers,
LocalRootPeers PeerTrustable peeraddr
localRootPeers :: LocalRootPeers PeerTrustable peeraddr
localRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> LocalRootPeers extraFlags peeraddr
localRootPeers,
PeerSelectionTargets
targets :: PeerSelectionTargets
targets :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PeerSelectionTargets
targets,
extraState :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState = Cardano.ExtraState {
UseBootstrapPeers
bootstrapPeersFlag :: UseBootstrapPeers
bootstrapPeersFlag :: ExtraState -> UseBootstrapPeers
Cardano.bootstrapPeersFlag,
Bool
hasOnlyBootstrapPeers :: Bool
hasOnlyBootstrapPeers :: ExtraState -> Bool
Cardano.hasOnlyBootstrapPeers,
LedgerStateJudgement
ledgerStateJudgement :: LedgerStateJudgement
ledgerStateJudgement :: ExtraState -> LedgerStateJudgement
Cardano.ledgerStateJudgement,
ConsensusMode
consensusMode :: ConsensusMode
consensusMode :: ExtraState -> ConsensusMode
Cardano.consensusMode
}
} =
Maybe Time
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> m a -> Guarded m a
Guarded Maybe Time
forall a. Maybe a
Nothing (STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ do
churnTargets <- STM m PeerSelectionTargets
readPeerSelectionTargets
let targets' =
case (LedgerStateJudgement
ledgerStateJudgement, ConsensusMode
consensusMode) of
(LedgerStateJudgement
YoungEnough, ConsensusMode
GenesisMode)
| PeerSelectionTargets
churnTargets PeerSelectionTargets -> PeerSelectionTargets -> Bool
forall a. Eq a => a -> a -> Bool
== PeerSelectionTargets
genesisPeerTargets ->
PeerSelectionTargets
peerSelectionTargets
(LedgerStateJudgement
TooOld, ConsensusMode
GenesisMode)
| PeerSelectionTargets
churnTargets PeerSelectionTargets -> PeerSelectionTargets -> Bool
forall a. Eq a => a -> a -> Bool
== PeerSelectionTargets
peerSelectionTargets ->
PeerSelectionTargets
genesisPeerTargets
(LedgerStateJudgement, ConsensusMode)
_otherwise -> PeerSelectionTargets
churnTargets
check ( isNodeAbleToMakeProgress bootstrapPeersFlag
ledgerStateJudgement
hasOnlyBootstrapPeers
&& targets /= targets'
&& sanePeerSelectionTargets targets')
let usingBootstrapPeers = UseBootstrapPeers -> LedgerStateJudgement -> Bool
requiresBootstrapPeers UseBootstrapPeers
bootstrapPeersFlag
LedgerStateJudgement
ledgerStateJudgement
localRootPeers' =
Int
-> LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall peeraddr extraFlags.
Ord peeraddr =>
Int
-> LocalRootPeers extraFlags peeraddr
-> LocalRootPeers extraFlags peeraddr
LocalRootPeers.clampToLimit
(PeerSelectionTargets -> Int
targetNumberOfKnownPeers PeerSelectionTargets
targets')
(LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall a b. (a -> b) -> a -> b
$ (if Bool
usingBootstrapPeers
then LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall peeraddr.
Ord peeraddr =>
LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
LocalRootPeers.clampToTrustable
else LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall a. a -> a
id)
(LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall a b. (a -> b) -> a -> b
$ LocalRootPeers PeerTrustable peeraddr
localRootPeers
publicRootPeers' =
(extraPeers -> Set peeraddr -> extraPeers)
-> PublicRootPeers extraPeers peeraddr
-> Set peeraddr
-> PublicRootPeers extraPeers peeraddr
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Set peeraddr -> extraPeers)
-> PublicRootPeers extraPeers peeraddr
-> Set peeraddr
-> PublicRootPeers extraPeers peeraddr
PublicRootPeers.difference (PublicExtraPeersAPI extraPeers peeraddr
-> extraPeers -> Set peeraddr -> extraPeers
forall extraPeers peeraddr.
PublicExtraPeersAPI extraPeers peeraddr
-> extraPeers -> Set peeraddr -> extraPeers
differenceExtraPeers PublicExtraPeersAPI extraPeers peeraddr
extraPeersAPI)
PublicRootPeers extraPeers peeraddr
publicRootPeers (LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr -> Set peeraddr
LocalRootPeers.keysSet LocalRootPeers PeerTrustable peeraddr
localRootPeers')
return $ \Time
_now -> Decision {
decisionTrace :: [TracePeerSelection
extraDebugState PeerTrustable extraPeers peeraddr]
decisionTrace = [PeerSelectionTargets
-> PeerSelectionTargets
-> TracePeerSelection
extraDebugState PeerTrustable extraPeers peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
PeerSelectionTargets
-> PeerSelectionTargets
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceTargetsChanged PeerSelectionTargets
targets PeerSelectionTargets
targets'],
decisionJobs :: [Job
()
m
(Completion
m
ExtraState
extraDebugState
PeerTrustable
extraPeers
peeraddr
peerconn)]
decisionJobs = [],
decisionState :: PeerSelectionState
ExtraState PeerTrustable extraPeers peeraddr peerconn
decisionState = PeerSelectionState
ExtraState PeerTrustable extraPeers peeraddr peerconn
st {
targets = targets',
localRootPeers = localRootPeers',
publicRootPeers = publicRootPeers'
} }
localRoots
:: forall extraDebugState extraAPI extraCounters peeraddr peerconn m.
(MonadSTM m, Ord peeraddr)
=> PeerSelectionActions
Cardano.ExtraState
PeerTrustable
(Cardano.ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
Cardano.ExtraState
PeerTrustable
(Cardano.ExtraPeers peeraddr)
peeraddr
peerconn
-> Guarded (STM m)
(TimedDecision m Cardano.ExtraState extraDebugState
PeerTrustable (Cardano.ExtraPeers peeraddr)
peeraddr peerconn)
localRoots :: forall extraDebugState extraAPI extraCounters peeraddr peerconn
(m :: * -> *).
(MonadSTM m, Ord peeraddr) =>
PeerSelectionActions
ExtraState
PeerTrustable
(ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
localRoots actions :: PeerSelectionActions
ExtraState
PeerTrustable
(ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
actions@PeerSelectionActions{ STM m (Config PeerTrustable peeraddr)
readLocalRootPeers :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> STM m (Config extraFlags peeraddr)
readLocalRootPeers :: STM m (Config PeerTrustable peeraddr)
readLocalRootPeers
, PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
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 peeraddr) peeraddr
extraPeersAPI
}
st :: PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st@PeerSelectionState{
LocalRootPeers PeerTrustable peeraddr
localRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> LocalRootPeers extraFlags peeraddr
localRootPeers :: LocalRootPeers PeerTrustable peeraddr
localRootPeers,
PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicRootPeers extraPeers peeraddr
publicRootPeers :: PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers,
KnownPeers peeraddr
knownPeers :: KnownPeers peeraddr
knownPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> KnownPeers peeraddr
knownPeers,
EstablishedPeers peeraddr peerconn
establishedPeers :: EstablishedPeers peeraddr peerconn
establishedPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
establishedPeers,
Set peeraddr
activePeers :: Set peeraddr
activePeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
activePeers,
Set peeraddr
inProgressDemoteHot :: Set peeraddr
inProgressDemoteHot :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressDemoteHot,
Set peeraddr
inProgressDemoteToCold :: Set peeraddr
inProgressDemoteToCold :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressDemoteToCold,
targets :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PeerSelectionTargets
targets = PeerSelectionTargets{Int
targetNumberOfKnownPeers :: PeerSelectionTargets -> Int
targetNumberOfKnownPeers :: Int
targetNumberOfKnownPeers},
extraState :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState = cpst :: ExtraState
cpst@Cardano.ExtraState {
UseBootstrapPeers
bootstrapPeersFlag :: ExtraState -> UseBootstrapPeers
bootstrapPeersFlag :: UseBootstrapPeers
Cardano.bootstrapPeersFlag,
Bool
hasOnlyBootstrapPeers :: ExtraState -> Bool
hasOnlyBootstrapPeers :: Bool
Cardano.hasOnlyBootstrapPeers,
LedgerStateJudgement
ledgerStateJudgement :: ExtraState -> LedgerStateJudgement
ledgerStateJudgement :: LedgerStateJudgement
Cardano.ledgerStateJudgement
}
}
| UseBootstrapPeers -> LedgerStateJudgement -> Bool -> Bool
isNodeAbleToMakeProgress UseBootstrapPeers
bootstrapPeersFlag
LedgerStateJudgement
ledgerStateJudgement
Bool
hasOnlyBootstrapPeers =
Maybe Time
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> m a -> Guarded m a
Guarded Maybe Time
forall a. Maybe a
Nothing (STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ do
localRootPeersRaw <- STM m (Config PeerTrustable peeraddr)
readLocalRootPeers
let inSensitiveState = UseBootstrapPeers -> LedgerStateJudgement -> Bool
requiresBootstrapPeers UseBootstrapPeers
bootstrapPeersFlag LedgerStateJudgement
ledgerStateJudgement
localRootPeers' = Int
-> LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall peeraddr extraFlags.
Ord peeraddr =>
Int
-> LocalRootPeers extraFlags peeraddr
-> LocalRootPeers extraFlags peeraddr
LocalRootPeers.clampToLimit
Int
targetNumberOfKnownPeers
(LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> (Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Bool
inSensitiveState
then LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall peeraddr.
Ord peeraddr =>
LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
LocalRootPeers.clampToTrustable
else LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall a. a -> a
id)
(LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> (Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall peeraddr extraFlags.
Ord peeraddr =>
[(HotValency, WarmValency,
Map peeraddr (LocalRootConfig extraFlags))]
-> LocalRootPeers extraFlags peeraddr
LocalRootPeers.fromGroups
(Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr)
-> Config PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall a b. (a -> b) -> a -> b
$ Config PeerTrustable peeraddr
localRootPeersRaw
check (localRootPeers' /= localRootPeers)
let added = LocalRootPeers PeerTrustable peeraddr
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr
-> Map peeraddr (LocalRootConfig extraFlags)
LocalRootPeers.toMap LocalRootPeers PeerTrustable peeraddr
localRootPeers' Map peeraddr (LocalRootConfig PeerTrustable)
-> Map peeraddr (LocalRootConfig PeerTrustable)
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.\\
LocalRootPeers PeerTrustable peeraddr
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr
-> Map peeraddr (LocalRootConfig extraFlags)
LocalRootPeers.toMap LocalRootPeers PeerTrustable peeraddr
localRootPeers
removed = LocalRootPeers PeerTrustable peeraddr
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr
-> Map peeraddr (LocalRootConfig extraFlags)
LocalRootPeers.toMap LocalRootPeers PeerTrustable peeraddr
localRootPeers Map peeraddr (LocalRootConfig PeerTrustable)
-> Map peeraddr (LocalRootConfig PeerTrustable)
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.\\
LocalRootPeers PeerTrustable peeraddr
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr
-> Map peeraddr (LocalRootConfig extraFlags)
LocalRootPeers.toMap LocalRootPeers PeerTrustable peeraddr
localRootPeers'
addedInfoMap = (LocalRootConfig PeerTrustable -> (Maybe a, Maybe PeerAdvertise))
-> Map peeraddr (LocalRootConfig PeerTrustable)
-> Map peeraddr (Maybe a, Maybe PeerAdvertise)
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map
(\LocalRootConfig { PeerAdvertise
peerAdvertise :: PeerAdvertise
peerAdvertise :: forall extraFlags. LocalRootConfig extraFlags -> PeerAdvertise
peerAdvertise } ->
(Maybe a
forall a. Maybe a
Nothing, PeerAdvertise -> Maybe PeerAdvertise
forall a. a -> Maybe a
Just PeerAdvertise
peerAdvertise))
Map peeraddr (LocalRootConfig PeerTrustable)
added
removedSet = Map peeraddr (LocalRootConfig PeerTrustable) -> Set peeraddr
forall k a. Map k a -> Set k
Map.keysSet Map peeraddr (LocalRootConfig PeerTrustable)
removed
knownPeers' = Map peeraddr (Maybe PeerSharing, Maybe PeerAdvertise)
-> KnownPeers peeraddr -> KnownPeers peeraddr
forall peeraddr.
Ord peeraddr =>
Map peeraddr (Maybe PeerSharing, Maybe PeerAdvertise)
-> KnownPeers peeraddr -> KnownPeers peeraddr
KnownPeers.insert Map peeraddr (Maybe PeerSharing, Maybe PeerAdvertise)
forall {a}. Map peeraddr (Maybe a, Maybe PeerAdvertise)
addedInfoMap KnownPeers peeraddr
knownPeers
localRootPeersSet = LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr -> Set peeraddr
LocalRootPeers.keysSet LocalRootPeers PeerTrustable peeraddr
localRootPeers'
publicRootPeers' =
(ExtraPeers peeraddr -> Set peeraddr -> ExtraPeers peeraddr)
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
-> Set peeraddr
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Set peeraddr -> extraPeers)
-> PublicRootPeers extraPeers peeraddr
-> Set peeraddr
-> PublicRootPeers extraPeers peeraddr
PublicRootPeers.difference (PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
-> ExtraPeers peeraddr -> Set peeraddr -> ExtraPeers peeraddr
forall extraPeers peeraddr.
PublicExtraPeersAPI extraPeers peeraddr
-> extraPeers -> Set peeraddr -> extraPeers
differenceExtraPeers PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
extraPeersAPI)
PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
Set peeraddr
localRootPeersSet
hasOnlyBootstrapPeers' =
Set peeraddr -> Bool
forall a. Set a -> Bool
Set.null (Set peeraddr -> Bool) -> Set peeraddr -> Bool
forall a b. (a -> b) -> a -> b
$ KnownPeers peeraddr -> Set peeraddr
forall peeraddr. KnownPeers peeraddr -> Set peeraddr
KnownPeers.toSet KnownPeers peeraddr
knownPeers'
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference`
( LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr -> Set peeraddr
LocalRootPeers.keysSet LocalRootPeers PeerTrustable peeraddr
localRootPeers'
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Semigroup a => a -> a -> a
<> PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers')
ledgerStateJudgement' =
if UseBootstrapPeers -> LedgerStateJudgement -> Bool
requiresBootstrapPeers UseBootstrapPeers
bootstrapPeersFlag LedgerStateJudgement
ledgerStateJudgement
Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
hasOnlyBootstrapPeers'
then LedgerStateJudgement
YoungEnough
else LedgerStateJudgement
ledgerStateJudgement
selectedToDemote :: Set peeraddr
selectedToDemote' :: Map peeraddr peerconn
selectedToDemote = Set peeraddr
activePeers Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
removedSet
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\ Set peeraddr
inProgressDemoteToCold
selectedToDemote' = EstablishedPeers peeraddr peerconn -> Map peeraddr peerconn
forall peeraddr peerconn.
EstablishedPeers peeraddr peerconn -> Map peeraddr peerconn
EstablishedPeers.toMap EstablishedPeers peeraddr peerconn
establishedPeers
Map peeraddr peerconn -> Set peeraddr -> Map peeraddr peerconn
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set peeraddr
selectedToDemote
return $ \Time
_now ->
Bool
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Set peeraddr -> Set peeraddr -> Bool
forall a. Ord a => Set a -> Set a -> Bool
Set.isSubsetOf
((ExtraPeers peeraddr -> Set peeraddr)
-> PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall peeraddr extraPeers.
Ord peeraddr =>
(extraPeers -> Set peeraddr)
-> PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.toSet (PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
-> ExtraPeers peeraddr -> Set peeraddr
forall extraPeers peeraddr.
PublicExtraPeersAPI extraPeers peeraddr
-> extraPeers -> Set peeraddr
extraPeersToSet PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
extraPeersAPI)
PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers')
(KnownPeers peeraddr -> Set peeraddr
forall peeraddr. KnownPeers peeraddr -> Set peeraddr
KnownPeers.toSet KnownPeers peeraddr
knownPeers'))
(Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> (Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Set peeraddr -> Set peeraddr -> Bool
forall a. Ord a => Set a -> Set a -> Bool
Set.isSubsetOf
(LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr -> Set peeraddr
LocalRootPeers.keysSet LocalRootPeers PeerTrustable peeraddr
localRootPeers')
(KnownPeers peeraddr -> Set peeraddr
forall peeraddr. KnownPeers peeraddr -> Set peeraddr
KnownPeers.toSet KnownPeers peeraddr
knownPeers'))
(Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> Decision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
forall a b. (a -> b) -> a -> b
$ Decision {
decisionTrace :: [TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr]
decisionTrace = LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
-> TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
LocalRootPeers extraFlags peeraddr
-> LocalRootPeers extraFlags peeraddr
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceLocalRootPeersChanged LocalRootPeers PeerTrustable peeraddr
localRootPeers LocalRootPeers PeerTrustable peeraddr
localRootPeers'
TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr
-> [TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr]
-> [TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr]
forall a. a -> [a] -> [a]
: [ LedgerStateJudgement
-> TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
LedgerStateJudgement
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceLedgerStateJudgementChanged LedgerStateJudgement
YoungEnough
| LedgerStateJudgement
ledgerStateJudgement LedgerStateJudgement -> LedgerStateJudgement -> Bool
forall a. Eq a => a -> a -> Bool
/= LedgerStateJudgement
ledgerStateJudgement'
],
decisionState :: PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
decisionState = PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st {
localRootPeers = localRootPeers',
publicRootPeers = publicRootPeers',
knownPeers = knownPeers',
inProgressDemoteHot = inProgressDemoteHot
<> selectedToDemote,
extraState = cpst {
Cardano.hasOnlyBootstrapPeers = hasOnlyBootstrapPeers',
Cardano.ledgerStateJudgement = ledgerStateJudgement'
}
},
decisionJobs :: [Job
()
m
(Completion
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)]
decisionJobs = [ PeerSelectionActions
ExtraState
PeerTrustable
(ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
-> peeraddr
-> peerconn
-> Job
()
m
(Completion
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall extraState extraDebugState extraFlags extraPeers extraAPI
extraCounters peeraddr peerconn (m :: * -> *).
(Monad m, Ord peeraddr) =>
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> peeraddr
-> peerconn
-> Job
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
jobDemoteActivePeer PeerSelectionActions
ExtraState
PeerTrustable
(ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
actions peeraddr
peeraddr peerconn
peerconn
| (peeraddr
peeraddr, peerconn
peerconn) <- Map peeraddr peerconn -> [(peeraddr, peerconn)]
forall k a. Map k a -> [(k, a)]
Map.assocs Map peeraddr peerconn
selectedToDemote' ]
}
| Bool
otherwise = Maybe Time
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> Guarded m a
GuardedSkip Maybe Time
forall a. Maybe a
Nothing
monitorBootstrapPeersFlag
:: ( MonadSTM m
, Ord peeraddr
)
=> Cardano.ExtraPeerSelectionActions m
-> PeerSelectionActions
Cardano.ExtraState
extraFlags
(Cardano.ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
Cardano.ExtraState
extraFlags
(Cardano.ExtraPeers peeraddr)
peeraddr
peerconn
-> Guarded (STM m)
(TimedDecision m Cardano.ExtraState extraDebugState extraFlags
(Cardano.ExtraPeers peeraddr) peeraddr peerconn)
monitorBootstrapPeersFlag :: forall (m :: * -> *) peeraddr extraFlags extraAPI extraCounters
peerconn extraDebugState.
(MonadSTM m, Ord peeraddr) =>
ExtraPeerSelectionActions m
-> PeerSelectionActions
ExtraState
extraFlags
(ExtraPeers peeraddr)
extraAPI
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
monitorBootstrapPeersFlag Cardano.ExtraPeerSelectionActions { STM m UseBootstrapPeers
readUseBootstrapPeers :: STM m UseBootstrapPeers
readUseBootstrapPeers :: forall (m :: * -> *).
ExtraPeerSelectionActions m -> STM m UseBootstrapPeers
Cardano.readUseBootstrapPeers }
PeerSelectionActions { PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
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 peeraddr) peeraddr
extraPeersAPI }
st :: PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st@PeerSelectionState { KnownPeers peeraddr
knownPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> KnownPeers peeraddr
knownPeers :: KnownPeers peeraddr
knownPeers
, EstablishedPeers peeraddr peerconn
establishedPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
establishedPeers :: EstablishedPeers peeraddr peerconn
establishedPeers
, PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicRootPeers extraPeers peeraddr
publicRootPeers :: PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
, Set peeraddr
inProgressPromoteCold :: Set peeraddr
inProgressPromoteCold :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressPromoteCold
, Set peeraddr
inProgressPromoteWarm :: Set peeraddr
inProgressPromoteWarm :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressPromoteWarm
, extraState :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState = cpst :: ExtraState
cpst@Cardano.ExtraState {
UseBootstrapPeers
bootstrapPeersFlag :: ExtraState -> UseBootstrapPeers
bootstrapPeersFlag :: UseBootstrapPeers
Cardano.bootstrapPeersFlag,
ConsensusMode
consensusMode :: ExtraState -> ConsensusMode
consensusMode :: ConsensusMode
Cardano.consensusMode
}
}
| ConsensusMode
GenesisMode <- ConsensusMode
consensusMode = Maybe Time
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> Guarded m a
GuardedSkip Maybe Time
forall a. Maybe a
Nothing
| Bool
otherwise =
Maybe Time
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> m a -> Guarded m a
Guarded Maybe Time
forall a. Maybe a
Nothing (STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ do
ubp <- STM m UseBootstrapPeers
readUseBootstrapPeers
check (ubp /= bootstrapPeersFlag)
let nonEstablishedBootstrapPeers =
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\
EstablishedPeers peeraddr peerconn -> Set peeraddr
forall peeraddr peerconn.
EstablishedPeers peeraddr peerconn -> Set peeraddr
EstablishedPeers.toSet EstablishedPeers peeraddr peerconn
establishedPeers
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\
(Set peeraddr
inProgressPromoteCold Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Semigroup a => a -> a -> a
<> Set peeraddr
inProgressPromoteWarm)
return $ \Time
_now ->
Decision {
decisionTrace :: [TracePeerSelection
extraDebugState extraFlags (ExtraPeers peeraddr) peeraddr]
decisionTrace = [UseBootstrapPeers
-> TracePeerSelection
extraDebugState extraFlags (ExtraPeers peeraddr) peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
UseBootstrapPeers
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceUseBootstrapPeersChanged UseBootstrapPeers
ubp],
decisionJobs :: [Job
()
m
(Completion
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)]
decisionJobs = [],
decisionState :: PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
decisionState =
PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st { knownPeers =
KnownPeers.delete
nonEstablishedBootstrapPeers
knownPeers
, publicRootPeers =
PublicRootPeers.difference (differenceExtraPeers extraPeersAPI)
publicRootPeers
nonEstablishedBootstrapPeers
, extraState = cpst {
Cardano.bootstrapPeersFlag = ubp
, Cardano.ledgerStateJudgement = YoungEnough
, Cardano.hasOnlyBootstrapPeers = False
, Cardano.bootstrapPeersTimeout = Nothing
}
}
}
monitorLedgerStateJudgement
:: ( MonadSTM m
, Ord peeraddr
)
=> PeerSelectionActions
Cardano.ExtraState
extraFlags
(Cardano.ExtraPeers peeraddr)
(Cardano.LedgerPeersConsensusInterface m)
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
Cardano.ExtraState
extraFlags
(Cardano.ExtraPeers peeraddr)
peeraddr
peerconn
-> Guarded (STM m)
(TimedDecision m Cardano.ExtraState extraDebugState extraFlags
(Cardano.ExtraPeers peeraddr) peeraddr peerconn)
monitorLedgerStateJudgement :: forall (m :: * -> *) peeraddr extraFlags extraCounters peerconn
extraDebugState.
(MonadSTM m, Ord peeraddr) =>
PeerSelectionActions
ExtraState
extraFlags
(ExtraPeers peeraddr)
(LedgerPeersConsensusInterface m)
extraCounters
peeraddr
peerconn
m
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
monitorLedgerStateJudgement PeerSelectionActions{
getLedgerStateCtx :: forall extraState extraFlags extraPeers extraAPI extraCounters
peeraddr peerconn (m :: * -> *).
PeerSelectionActions
extraState
extraFlags
extraPeers
extraAPI
extraCounters
peeraddr
peerconn
m
-> LedgerPeersConsensusInterface extraAPI m
getLedgerStateCtx = ledgerCtx :: LedgerPeersConsensusInterface (LedgerPeersConsensusInterface m) m
ledgerCtx@LedgerPeersConsensusInterface {
lpExtraAPI :: forall extraAPI (m :: * -> *).
LedgerPeersConsensusInterface extraAPI m -> extraAPI
lpExtraAPI = Cardano.LedgerPeersConsensusInterface {
getLedgerStateJudgement :: forall (m :: * -> *).
LedgerPeersConsensusInterface m -> STM m LedgerStateJudgement
Cardano.getLedgerStateJudgement = STM m LedgerStateJudgement
readLedgerStateJudgement
}
}
, PublicExtraPeersAPI (ExtraPeers peeraddr) peeraddr
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 peeraddr) peeraddr
extraPeersAPI
}
st :: PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st@PeerSelectionState{ PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicRootPeers extraPeers peeraddr
publicRootPeers :: PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers,
KnownPeers peeraddr
knownPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> KnownPeers peeraddr
knownPeers :: KnownPeers peeraddr
knownPeers,
EstablishedPeers peeraddr peerconn
establishedPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> EstablishedPeers peeraddr peerconn
establishedPeers :: EstablishedPeers peeraddr peerconn
establishedPeers,
Set peeraddr
inProgressPromoteCold :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressPromoteCold :: Set peeraddr
inProgressPromoteCold,
Set peeraddr
inProgressPromoteWarm :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressPromoteWarm :: Set peeraddr
inProgressPromoteWarm,
Maybe LedgerPeerSnapshot
ledgerPeerSnapshot :: Maybe LedgerPeerSnapshot
ledgerPeerSnapshot :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Maybe LedgerPeerSnapshot
ledgerPeerSnapshot,
extraState :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState = cpst :: ExtraState
cpst@Cardano.ExtraState {
UseBootstrapPeers
bootstrapPeersFlag :: ExtraState -> UseBootstrapPeers
bootstrapPeersFlag :: UseBootstrapPeers
Cardano.bootstrapPeersFlag,
LedgerStateJudgement
ledgerStateJudgement :: ExtraState -> LedgerStateJudgement
ledgerStateJudgement :: LedgerStateJudgement
Cardano.ledgerStateJudgement,
ConsensusMode
consensusMode :: ExtraState -> ConsensusMode
consensusMode :: ConsensusMode
Cardano.consensusMode
}
}
| ConsensusMode
GenesisMode <- ConsensusMode
consensusMode =
Maybe Time
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> m a -> Guarded m a
Guarded Maybe Time
forall a. Maybe a
Nothing (STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ do
lsj <- STM m LedgerStateJudgement
readLedgerStateJudgement
check (lsj /= ledgerStateJudgement)
return $ \Time
_now ->
Decision {
decisionTrace :: [TracePeerSelection
extraDebugState extraFlags (ExtraPeers peeraddr) peeraddr]
decisionTrace = [LedgerStateJudgement
-> TracePeerSelection
extraDebugState extraFlags (ExtraPeers peeraddr) peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
LedgerStateJudgement
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceLedgerStateJudgementChanged LedgerStateJudgement
lsj],
decisionJobs :: [Job
()
m
(Completion
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)]
decisionJobs = case (LedgerStateJudgement
lsj, Maybe LedgerPeerSnapshot
ledgerPeerSnapshot) of
(LedgerStateJudgement
TooOld, Just LedgerPeerSnapshot
ledgerPeerSnapshot') ->
[LedgerPeerSnapshot
-> LedgerPeersConsensusInterface
(LedgerPeersConsensusInterface m) m
-> Job
()
m
(Completion
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) extraAPI extraState extraDebugState extraFlags
extraPeers peeraddr peerconn.
MonadSTM m =>
LedgerPeerSnapshot
-> LedgerPeersConsensusInterface extraAPI m
-> Job
()
m
(Completion
m
extraState
extraDebugState
extraFlags
extraPeers
peeraddr
peerconn)
jobVerifyPeerSnapshot LedgerPeerSnapshot
ledgerPeerSnapshot' LedgerPeersConsensusInterface (LedgerPeersConsensusInterface m) m
ledgerCtx]
(LedgerStateJudgement, Maybe LedgerPeerSnapshot)
_otherwise -> [],
decisionState :: PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
decisionState = PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st {
extraState = cpst {
Cardano.ledgerStateJudgement = lsj
}
}
}
| ConsensusMode
PraosMode <- ConsensusMode
consensusMode
, UseBootstrapPeers -> Bool
isBootstrapPeersEnabled UseBootstrapPeers
bootstrapPeersFlag =
Maybe Time
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> m a -> Guarded m a
Guarded Maybe Time
forall a. Maybe a
Nothing (STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ do
lsj <- STM m LedgerStateJudgement
readLedgerStateJudgement
check (lsj /= ledgerStateJudgement)
st' <- case lsj of
LedgerStateJudgement
TooOld -> do
(Time
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn)
-> STM
m
(Time
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn)
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return (\Time
now -> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st
{ targets =
PeerSelectionTargets
{ targetNumberOfRootPeers = 0
, targetNumberOfKnownPeers = 0
, targetNumberOfEstablishedPeers = 0
, targetNumberOfActivePeers = 0
, targetNumberOfKnownBigLedgerPeers = 0
, targetNumberOfEstablishedBigLedgerPeers = 0
, targetNumberOfActiveBigLedgerPeers = 0
}
, localRootPeers = LocalRootPeers.empty
, publicRootBackoffs = 0
, publicRootRetryTime = now
, extraState = cpst {
Cardano.ledgerStateJudgement = lsj
, Cardano.hasOnlyBootstrapPeers = False
, Cardano.bootstrapPeersTimeout = Just (addTime governor_BOOTSTRAP_PEERS_TIMEOUT now)
}
})
LedgerStateJudgement
YoungEnough -> do
let nonEstablishedBootstrapPeers :: Set peeraddr
nonEstablishedBootstrapPeers =
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\
EstablishedPeers peeraddr peerconn -> Set peeraddr
forall peeraddr peerconn.
EstablishedPeers peeraddr peerconn -> Set peeraddr
EstablishedPeers.toSet EstablishedPeers peeraddr peerconn
establishedPeers
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\
(Set peeraddr
inProgressPromoteCold Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Semigroup a => a -> a -> a
<> Set peeraddr
inProgressPromoteWarm)
(Time
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn)
-> STM
m
(Time
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn)
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return (\Time
now -> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st
{ knownPeers =
KnownPeers.delete
nonEstablishedBootstrapPeers
knownPeers
, publicRootPeers =
PublicRootPeers.difference (differenceExtraPeers extraPeersAPI)
publicRootPeers
nonEstablishedBootstrapPeers
, publicRootBackoffs = 0
, publicRootRetryTime = now
, extraState = cpst {
Cardano.ledgerStateJudgement = lsj
, Cardano.hasOnlyBootstrapPeers = False
, Cardano.bootstrapPeersTimeout = Nothing
}
})
return $ \Time
now ->
Decision {
decisionTrace :: [TracePeerSelection
extraDebugState extraFlags (ExtraPeers peeraddr) peeraddr]
decisionTrace = [LedgerStateJudgement
-> TracePeerSelection
extraDebugState extraFlags (ExtraPeers peeraddr) peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
LedgerStateJudgement
-> TracePeerSelection
extraDebugState extraFlags extraPeers peeraddr
TraceLedgerStateJudgementChanged LedgerStateJudgement
lsj],
decisionJobs :: [Job
()
m
(Completion
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)]
decisionJobs = [],
decisionState :: PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
decisionState = Time
-> PeerSelectionState
ExtraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
st' Time
now
}
| Bool
otherwise = Maybe Time
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
extraFlags
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> Guarded m a
GuardedSkip Maybe Time
forall a. Maybe a
Nothing
waitForSystemToQuiesce
:: ( MonadSTM m
, Ord peeraddr
)
=> PeerSelectionState
Cardano.ExtraState
PeerTrustable
(Cardano.ExtraPeers peeraddr)
peeraddr
peerconn
-> Guarded (STM m)
(TimedDecision m Cardano.ExtraState extraDebugState PeerTrustable
(Cardano.ExtraPeers peeraddr) peeraddr peerconn)
waitForSystemToQuiesce :: forall (m :: * -> *) peeraddr peerconn extraDebugState.
(MonadSTM m, Ord peeraddr) =>
PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
waitForSystemToQuiesce st :: PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st@PeerSelectionState{
KnownPeers peeraddr
knownPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> KnownPeers peeraddr
knownPeers :: KnownPeers peeraddr
knownPeers
, LocalRootPeers PeerTrustable peeraddr
localRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> LocalRootPeers extraFlags peeraddr
localRootPeers :: LocalRootPeers PeerTrustable peeraddr
localRootPeers
, PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> PublicRootPeers extraPeers peeraddr
publicRootPeers :: PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
, Set peeraddr
inProgressPromoteCold :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressPromoteCold :: Set peeraddr
inProgressPromoteCold
, Set peeraddr
inProgressPromoteWarm :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressPromoteWarm :: Set peeraddr
inProgressPromoteWarm
, Int
inProgressPeerShareReqs :: Int
inProgressPeerShareReqs :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Int
inProgressPeerShareReqs
, Bool
inProgressPublicRootsReq :: Bool
inProgressPublicRootsReq :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Bool
inProgressPublicRootsReq
, Bool
inProgressBigLedgerPeersReq :: Bool
inProgressBigLedgerPeersReq :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> Bool
inProgressBigLedgerPeersReq
, extraState :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState = cpst :: ExtraState
cpst@Cardano.ExtraState {
LedgerStateJudgement
ledgerStateJudgement :: ExtraState -> LedgerStateJudgement
ledgerStateJudgement :: LedgerStateJudgement
Cardano.ledgerStateJudgement
, UseBootstrapPeers
bootstrapPeersFlag :: ExtraState -> UseBootstrapPeers
bootstrapPeersFlag :: UseBootstrapPeers
Cardano.bootstrapPeersFlag
, Bool
hasOnlyBootstrapPeers :: ExtraState -> Bool
hasOnlyBootstrapPeers :: Bool
Cardano.hasOnlyBootstrapPeers
}
}
| UseBootstrapPeers -> LedgerStateJudgement -> Bool
requiresBootstrapPeers UseBootstrapPeers
bootstrapPeersFlag LedgerStateJudgement
ledgerStateJudgement
, Bool -> Bool
not Bool
hasOnlyBootstrapPeers
, (LocalRootConfig PeerTrustable -> Bool)
-> Map peeraddr (LocalRootConfig PeerTrustable) -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\case
LocalRootConfig { extraFlags :: forall extraFlags. LocalRootConfig extraFlags -> extraFlags
extraFlags = PeerTrustable
IsTrustable }
-> Bool
True
LocalRootConfig PeerTrustable
_ -> Bool
False
)
(LocalRootPeers PeerTrustable peeraddr
-> Map peeraddr (LocalRootConfig PeerTrustable)
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr
-> Map peeraddr (LocalRootConfig extraFlags)
LocalRootPeers.toMap LocalRootPeers PeerTrustable peeraddr
localRootPeers)
, KnownPeers peeraddr -> Set peeraddr
forall peeraddr. KnownPeers peeraddr -> Set peeraddr
KnownPeers.toSet KnownPeers peeraddr
knownPeers Set peeraddr -> Set peeraddr -> Bool
forall a. Ord a => Set a -> Set a -> Bool
`Set.isSubsetOf`
( PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Semigroup a => a -> a -> a
<> LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr -> Set peeraddr
LocalRootPeers.keysSet (LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
forall peeraddr.
Ord peeraddr =>
LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
LocalRootPeers.clampToTrustable LocalRootPeers PeerTrustable peeraddr
localRootPeers)
)
, Set peeraddr -> Bool
forall a. Set a -> Bool
Set.null Set peeraddr
inProgressPromoteCold
, Set peeraddr -> Bool
forall a. Set a -> Bool
Set.null Set peeraddr
inProgressPromoteWarm
, Int
inProgressPeerShareReqs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
, Bool -> Bool
not Bool
inProgressBigLedgerPeersReq
, Bool -> Bool
not Bool
inProgressPublicRootsReq =
Maybe Time
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> m a -> Guarded m a
Guarded Maybe Time
forall a. Maybe a
Nothing (STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn))
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ do
TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn))
-> TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn
-> STM
m
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall a b. (a -> b) -> a -> b
$ \Time
_now ->
Decision { decisionTrace :: [TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr]
decisionTrace = [TracePeerSelection
extraDebugState PeerTrustable (ExtraPeers peeraddr) peeraddr
forall extraDebugState extraFlags extraPeers peeraddr.
TracePeerSelection extraDebugState extraFlags extraPeers peeraddr
TraceOnlyBootstrapPeers],
decisionJobs :: [Job
()
m
(Completion
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)]
decisionJobs = [],
decisionState :: PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
decisionState = PeerSelectionState
ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st { extraState = cpst {
Cardano.hasOnlyBootstrapPeers = True
, Cardano.bootstrapPeersTimeout = Nothing
}
}
}
| Bool
otherwise = Maybe Time
-> Guarded
(STM m)
(TimedDecision
m
ExtraState
extraDebugState
PeerTrustable
(ExtraPeers peeraddr)
peeraddr
peerconn)
forall (m :: * -> *) a. Maybe Time -> Guarded m a
GuardedSkip Maybe Time
forall a. Maybe a
Nothing