{-# LANGUAGE DeriveFunctor    #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns   #-}

module Ouroboros.Cardano.Network.PeerSelection.Governor.Types where

import Cardano.Network.ConsensusMode (ConsensusMode (..))
import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (..),
           requiresBootstrapPeers)
import Cardano.Network.PeerSelection.LocalRootPeers
           (OutboundConnectionsState (..))
import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable)
import Cardano.Network.Types (LedgerStateJudgement (..),
           getNumberOfBigLedgerPeers)
import Control.Applicative (Alternative)
import Control.Concurrent.Class.MonadSTM
import Data.Set (Set)
import Data.Set qualified as Set
import Ouroboros.Cardano.Network.LedgerPeerConsensusInterface qualified as Cardano
import Ouroboros.Cardano.Network.PeerSelection.Governor.Monitor
           (monitorBootstrapPeersFlag, monitorLedgerStateJudgement,
           waitForSystemToQuiesce)
import Ouroboros.Cardano.Network.PeerSelection.Governor.Monitor 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 (readAssociationMode)
import Ouroboros.Network.PeerSelection.Governor.Types (AssociationMode (..),
           BootstrapPeersCriticalTimeoutError (..), ExtraGuardedDecisions (..),
           PeerSelectionActions (..), PeerSelectionGovernorArgs (..),
           PeerSelectionInterfaces (..), PeerSelectionSetsWithSizes,
           PeerSelectionState (..), PeerSelectionView (..))
import Ouroboros.Network.PeerSelection.LedgerPeers
           (LedgerPeersConsensusInterface (lpExtraAPI))
import Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers
import Ouroboros.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers

-- | Peer selection view.
--
-- This is a functor which is used to hold computation of various peer sets and
-- their sizes.  See `peerSelectionStateToView`, `peerSelectionStateToCounters`.
--
data ExtraPeerSelectionSetsWithSizes peeraddr =
  ExtraPeerSelectionSetsWithSizes {
    forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewKnownBootstrapPeers           :: (Set peeraddr, Int)
  , forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewColdBootstrapPeersPromotions  :: (Set peeraddr, Int)
  , forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewEstablishedBootstrapPeers     :: (Set peeraddr, Int)
  , forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewWarmBootstrapPeersDemotions   :: (Set peeraddr, Int)
  , forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewWarmBootstrapPeersPromotions  :: (Set peeraddr, Int)
  , forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewActiveBootstrapPeers          :: (Set peeraddr, Int)
  , forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewActiveBootstrapPeersDemotions :: (Set peeraddr, Int)
  } deriving (ExtraPeerSelectionSetsWithSizes peeraddr
-> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool
(ExtraPeerSelectionSetsWithSizes peeraddr
 -> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool)
-> (ExtraPeerSelectionSetsWithSizes peeraddr
    -> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool)
-> Eq (ExtraPeerSelectionSetsWithSizes peeraddr)
forall peeraddr.
Eq peeraddr =>
ExtraPeerSelectionSetsWithSizes peeraddr
-> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall peeraddr.
Eq peeraddr =>
ExtraPeerSelectionSetsWithSizes peeraddr
-> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool
== :: ExtraPeerSelectionSetsWithSizes peeraddr
-> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool
$c/= :: forall peeraddr.
Eq peeraddr =>
ExtraPeerSelectionSetsWithSizes peeraddr
-> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool
/= :: ExtraPeerSelectionSetsWithSizes peeraddr
-> ExtraPeerSelectionSetsWithSizes peeraddr -> Bool
Eq, Int -> ExtraPeerSelectionSetsWithSizes peeraddr -> ShowS
[ExtraPeerSelectionSetsWithSizes peeraddr] -> ShowS
ExtraPeerSelectionSetsWithSizes peeraddr -> String
(Int -> ExtraPeerSelectionSetsWithSizes peeraddr -> ShowS)
-> (ExtraPeerSelectionSetsWithSizes peeraddr -> String)
-> ([ExtraPeerSelectionSetsWithSizes peeraddr] -> ShowS)
-> Show (ExtraPeerSelectionSetsWithSizes peeraddr)
forall peeraddr.
Show peeraddr =>
Int -> ExtraPeerSelectionSetsWithSizes peeraddr -> ShowS
forall peeraddr.
Show peeraddr =>
[ExtraPeerSelectionSetsWithSizes peeraddr] -> ShowS
forall peeraddr.
Show peeraddr =>
ExtraPeerSelectionSetsWithSizes peeraddr -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall peeraddr.
Show peeraddr =>
Int -> ExtraPeerSelectionSetsWithSizes peeraddr -> ShowS
showsPrec :: Int -> ExtraPeerSelectionSetsWithSizes peeraddr -> ShowS
$cshow :: forall peeraddr.
Show peeraddr =>
ExtraPeerSelectionSetsWithSizes peeraddr -> String
show :: ExtraPeerSelectionSetsWithSizes peeraddr -> String
$cshowList :: forall peeraddr.
Show peeraddr =>
[ExtraPeerSelectionSetsWithSizes peeraddr] -> ShowS
showList :: [ExtraPeerSelectionSetsWithSizes peeraddr] -> ShowS
Show)

empty :: ExtraPeerSelectionSetsWithSizes peeraddr
empty :: forall peeraddr. ExtraPeerSelectionSetsWithSizes peeraddr
empty = ExtraPeerSelectionSetsWithSizes {
    viewKnownBootstrapPeers :: (Set peeraddr, Int)
viewKnownBootstrapPeers           = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  , viewColdBootstrapPeersPromotions :: (Set peeraddr, Int)
viewColdBootstrapPeersPromotions  = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  , viewEstablishedBootstrapPeers :: (Set peeraddr, Int)
viewEstablishedBootstrapPeers     = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  , viewWarmBootstrapPeersDemotions :: (Set peeraddr, Int)
viewWarmBootstrapPeersDemotions   = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  , viewWarmBootstrapPeersPromotions :: (Set peeraddr, Int)
viewWarmBootstrapPeersPromotions  = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  , viewActiveBootstrapPeers :: (Set peeraddr, Int)
viewActiveBootstrapPeers          = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  , viewActiveBootstrapPeersDemotions :: (Set peeraddr, Int)
viewActiveBootstrapPeersDemotions = (Set peeraddr
forall a. Set a
Set.empty, Int
0)
  }


cardanoPeerSelectionStatetoCounters
  :: Ord peeraddr
  => PeerSelectionState
      extraState
      extraFlags
      (Cardano.ExtraPeers peeraddr)
      peeraddr
      peerconn
  -> ExtraPeerSelectionSetsWithSizes peeraddr
cardanoPeerSelectionStatetoCounters :: forall peeraddr extraState extraFlags peerconn.
Ord peeraddr =>
PeerSelectionState
  extraState extraFlags (ExtraPeers peeraddr) peeraddr peerconn
-> ExtraPeerSelectionSetsWithSizes peeraddr
cardanoPeerSelectionStatetoCounters
  PeerSelectionState {
    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,
    PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers :: PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> PublicRootPeers extraPeers 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,
    Set peeraddr
inProgressDemoteWarm :: Set peeraddr
inProgressDemoteWarm :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressDemoteWarm,
    Set peeraddr
inProgressDemoteHot :: Set peeraddr
inProgressDemoteHot :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> Set peeraddr
inProgressDemoteHot
  } =
  ExtraPeerSelectionSetsWithSizes {
    viewKnownBootstrapPeers :: (Set peeraddr, Int)
viewKnownBootstrapPeers           = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size   Set peeraddr
knownBootstrapPeersSet
  , viewColdBootstrapPeersPromotions :: (Set peeraddr, Int)
viewColdBootstrapPeersPromotions  = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size (Set peeraddr -> (Set peeraddr, Int))
-> Set peeraddr -> (Set peeraddr, Int)
forall a b. (a -> b) -> a -> b
$ Set peeraddr
knownBootstrapPeersSet
                                        Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
inProgressPromoteCold
  , viewEstablishedBootstrapPeers :: (Set peeraddr, Int)
viewEstablishedBootstrapPeers     = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size   Set peeraddr
establishedBootstrapPeersSet
  , viewWarmBootstrapPeersDemotions :: (Set peeraddr, Int)
viewWarmBootstrapPeersDemotions   = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size (Set peeraddr -> (Set peeraddr, Int))
-> Set peeraddr -> (Set peeraddr, Int)
forall a b. (a -> b) -> a -> b
$ Set peeraddr
establishedBootstrapPeersSet
                                        Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
inProgressDemoteWarm
  , viewWarmBootstrapPeersPromotions :: (Set peeraddr, Int)
viewWarmBootstrapPeersPromotions  = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size (Set peeraddr -> (Set peeraddr, Int))
-> Set peeraddr -> (Set peeraddr, Int)
forall a b. (a -> b) -> a -> b
$ Set peeraddr
establishedBootstrapPeersSet
                                        Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
inProgressPromoteWarm
  , viewActiveBootstrapPeers :: (Set peeraddr, Int)
viewActiveBootstrapPeers          = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size   Set peeraddr
activeBootstrapPeersSet
  , viewActiveBootstrapPeersDemotions :: (Set peeraddr, Int)
viewActiveBootstrapPeersDemotions = Set peeraddr -> (Set peeraddr, Int)
forall {a}. Set a -> (Set a, Int)
size (Set peeraddr -> (Set peeraddr, Int))
-> Set peeraddr -> (Set peeraddr, Int)
forall a b. (a -> b) -> a -> b
$ Set peeraddr
activeBootstrapPeersSet
                                        Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
inProgressDemoteHot
  }
  where
    size :: Set a -> (Set a, Int)
size Set a
s = (Set a
s, Set a -> Int
forall a. Set a -> Int
Set.size Set a
s)

    -- common sets
    establishedSet :: Set peeraddr
establishedSet = EstablishedPeers peeraddr peerconn -> Set peeraddr
forall peeraddr peerconn.
EstablishedPeers peeraddr peerconn -> Set peeraddr
EstablishedPeers.toSet EstablishedPeers peeraddr peerconn
establishedPeers
    bigLedgerSet :: Set peeraddr
bigLedgerSet   = PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall extraPeers peeraddr.
PublicRootPeers extraPeers peeraddr -> Set peeraddr
PublicRootPeers.getBigLedgerPeers PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers

    -- non big ledger peers
    establishedPeersSet :: Set peeraddr
establishedPeersSet = Set peeraddr
establishedSet Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\ Set peeraddr
establishedBigLedgerPeersSet
    activePeersSet :: Set peeraddr
activePeersSet      = Set peeraddr
activePeers Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
Set.\\ Set peeraddr
activeBigLedgerPeersSet

    -- big ledger peers
    establishedBigLedgerPeersSet :: Set peeraddr
establishedBigLedgerPeersSet = Set peeraddr
establishedSet Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
bigLedgerSet
    activeBigLedgerPeersSet :: Set peeraddr
activeBigLedgerPeersSet      = Set peeraddr
establishedBigLedgerPeersSet Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
activePeers

    -- bootstrap peers
    bootstrapSet :: Set peeraddr
bootstrapSet                 = PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
forall peeraddr.
PublicRootPeers (ExtraPeers peeraddr) peeraddr -> Set peeraddr
PublicRootPeers.getBootstrapPeers PublicRootPeers (ExtraPeers peeraddr) peeraddr
publicRootPeers
    -- bootstrap peers and big ledger peers are disjoint, hence we can use
    -- `knownPeersSet`, `establishedPeersSet` and `activePeersSet` below.
    knownBootstrapPeersSet :: Set peeraddr
knownBootstrapPeersSet       = Set peeraddr
bootstrapSet
    establishedBootstrapPeersSet :: Set peeraddr
establishedBootstrapPeersSet = Set peeraddr
establishedPeersSet Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
bootstrapSet
    activeBootstrapPeersSet :: Set peeraddr
activeBootstrapPeersSet      = Set peeraddr
activePeersSet Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Ord a => Set a -> Set a -> Set a
`Set.intersection` Set peeraddr
bootstrapSet


outboundConnectionsState
    :: Ord peeraddr
    => AssociationMode
    -> PeerSelectionSetsWithSizes (ExtraPeerSelectionSetsWithSizes peeraddr) peeraddr
    -> PeerSelectionState Cardano.ExtraState PeerTrustable extraPeers peeraddr peerconn
    -> OutboundConnectionsState
outboundConnectionsState :: forall peeraddr extraPeers peerconn.
Ord peeraddr =>
AssociationMode
-> PeerSelectionSetsWithSizes
     (ExtraPeerSelectionSetsWithSizes peeraddr) peeraddr
-> PeerSelectionState
     ExtraState PeerTrustable extraPeers peeraddr peerconn
-> OutboundConnectionsState
outboundConnectionsState
    AssociationMode
associationMode
    PeerSelectionView {
      viewEstablishedPeers :: forall extraViews a. PeerSelectionView extraViews a -> a
viewEstablishedPeers       = (Set peeraddr
viewEstablishedPeers, Int
_),
        viewActiveBigLedgerPeers :: forall extraViews a. PeerSelectionView extraViews a -> a
viewActiveBigLedgerPeers = (Set peeraddr
_, Int
activeNumBigLedgerPeers),
      viewExtraViews :: forall extraViews a. PeerSelectionView extraViews a -> extraViews
viewExtraViews = ExtraPeerSelectionSetsWithSizes {
        viewEstablishedBootstrapPeers :: forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewEstablishedBootstrapPeers = (Set peeraddr
viewEstablishedBootstrapPeers, Int
_),
        viewActiveBootstrapPeers :: forall peeraddr.
ExtraPeerSelectionSetsWithSizes peeraddr -> (Set peeraddr, Int)
viewActiveBootstrapPeers      = (Set peeraddr
viewActiveBootstrapPeers, Int
_)
      }
    }
    PeerSelectionState {
      LocalRootPeers PeerTrustable peeraddr
localRootPeers :: LocalRootPeers PeerTrustable peeraddr
localRootPeers :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> LocalRootPeers extraFlags peeraddr
localRootPeers,
      extraState :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState = Cardano.ExtraState {
        ConsensusMode
consensusMode :: ConsensusMode
consensusMode :: ExtraState -> ConsensusMode
Cardano.consensusMode,
        UseBootstrapPeers
bootstrapPeersFlag :: UseBootstrapPeers
bootstrapPeersFlag :: ExtraState -> UseBootstrapPeers
Cardano.bootstrapPeersFlag,
        NumberOfBigLedgerPeers
minNumberOfBigLedgerPeers :: NumberOfBigLedgerPeers
minNumberOfBigLedgerPeers :: ExtraState -> NumberOfBigLedgerPeers
Cardano.minNumberOfBigLedgerPeers
      }
    }
    =
    case (AssociationMode
associationMode, UseBootstrapPeers
bootstrapPeersFlag, ConsensusMode
consensusMode) of
      (AssociationMode
LocalRootsOnly, UseBootstrapPeers
_, ConsensusMode
_)
        |  -- we are only connected to trusted local root
           -- peers
           Set peeraddr
viewEstablishedPeers Set peeraddr -> Set peeraddr -> Bool
forall a. Ord a => Set a -> Set a -> Bool
`Set.isSubsetOf` Set peeraddr
trustableLocalRootSet
        -> OutboundConnectionsState
TrustedStateWithExternalPeers

        |  Bool
otherwise
        -> OutboundConnectionsState
UntrustedState

       -- bootstrap mode
      (AssociationMode
Unrestricted, UseBootstrapPeers {}, ConsensusMode
_)
        |  -- we are only connected to trusted local root
           -- peers or bootstrap peers
           Set peeraddr
viewEstablishedPeers Set peeraddr -> Set peeraddr -> Bool
forall a. Ord a => Set a -> Set a -> Bool
`Set.isSubsetOf` (Set peeraddr
viewEstablishedBootstrapPeers Set peeraddr -> Set peeraddr -> Set peeraddr
forall a. Semigroup a => a -> a -> a
<> Set peeraddr
trustableLocalRootSet)
           -- there's at least one active bootstrap peer
        ,  Bool -> Bool
not (Set peeraddr -> Bool
forall a. Set a -> Bool
Set.null Set peeraddr
viewActiveBootstrapPeers)
        -> OutboundConnectionsState
TrustedStateWithExternalPeers

        |  Bool
otherwise
        -> OutboundConnectionsState
UntrustedState

       -- praos mode with public roots
      (AssociationMode
Unrestricted, UseBootstrapPeers
DontUseBootstrapPeers, ConsensusMode
PraosMode)
        -> OutboundConnectionsState
UntrustedState

      -- Genesis mode
      (AssociationMode
Unrestricted, UseBootstrapPeers
DontUseBootstrapPeers, ConsensusMode
GenesisMode)
        |  Int
activeNumBigLedgerPeers Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= NumberOfBigLedgerPeers -> Int
getNumberOfBigLedgerPeers NumberOfBigLedgerPeers
minNumberOfBigLedgerPeers
        -> OutboundConnectionsState
TrustedStateWithExternalPeers

        |  Bool
otherwise
        -> OutboundConnectionsState
UntrustedState
  where
    trustableLocalRootSet :: Set peeraddr
trustableLocalRootSet = LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
forall peeraddr.
LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
LocalRootPeers.trustableKeysSet LocalRootPeers PeerTrustable peeraddr
localRootPeers


cardanoPeerSelectionGovernorArgs
  :: ( MonadSTM m
     , Alternative (STM m)
     , Ord peeraddr
     )
  => Cardano.ExtraPeerSelectionActions m
  -> PeerSelectionGovernorArgs
       Cardano.ExtraState
       extraDebugState
       PeerTrustable
       (Cardano.ExtraPeers peeraddr)
       (Cardano.LedgerPeersConsensusInterface m)
       (ExtraPeerSelectionSetsWithSizes peeraddr)
       peeraddr
       peerconn
       BootstrapPeersCriticalTimeoutError
       m
cardanoPeerSelectionGovernorArgs :: forall (m :: * -> *) peeraddr extraDebugState peerconn.
(MonadSTM m, Alternative (STM m), Ord peeraddr) =>
ExtraPeerSelectionActions m
-> PeerSelectionGovernorArgs
     ExtraState
     extraDebugState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     BootstrapPeersCriticalTimeoutError
     m
cardanoPeerSelectionGovernorArgs ExtraPeerSelectionActions m
extraActions =
  PeerSelectionGovernorArgs {
    -- If by any chance the node takes more than 15 minutes to converge to a
    -- clean state, we crash the node. This could happen in very rare
    -- conditions such as a global network issue, DNS, or a bug in the code.
    -- In any case crashing the node will force the node to be restarted,
    -- starting in the correct state for it to make progress.
    abortGovernor :: Time
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Maybe BootstrapPeersCriticalTimeoutError
abortGovernor   = \Time
blockedAt PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st ->
      case ExtraState -> Maybe Time
Cardano.bootstrapPeersTimeout (PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> ExtraState
forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st) of
        Maybe Time
Nothing -> Maybe BootstrapPeersCriticalTimeoutError
forall a. Maybe a
Nothing
        Just Time
t
          | Time
blockedAt Time -> Time -> Bool
forall a. Ord a => a -> a -> Bool
>= Time
t -> BootstrapPeersCriticalTimeoutError
-> Maybe BootstrapPeersCriticalTimeoutError
forall a. a -> Maybe a
Just BootstrapPeersCriticalTimeoutError
BootstrapPeersCriticalTimeoutError
          | Bool
otherwise      -> Maybe BootstrapPeersCriticalTimeoutError
forall a. Maybe a
Nothing
  , updateWithState :: PeerSelectionInterfaces
  ExtraState
  PeerTrustable
  (ExtraPeers peeraddr)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionSetsWithSizes
     (ExtraPeerSelectionSetsWithSizes peeraddr) peeraddr
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> STM m ()
updateWithState = \PeerSelectionInterfaces { STM m UseLedgerPeers
readUseLedgerPeers :: STM m UseLedgerPeers
readUseLedgerPeers :: forall extraState extraFlags extraPeers extraCounters peeraddr
       peerconn (m :: * -> *).
PeerSelectionInterfaces
  extraState extraFlags extraPeers extraCounters peeraddr peerconn m
-> STM m UseLedgerPeers
readUseLedgerPeers }
                       PeerSelectionActions { LedgerPeersConsensusInterface (LedgerPeersConsensusInterface m) m
getLedgerStateCtx :: LedgerPeersConsensusInterface (LedgerPeersConsensusInterface m) m
getLedgerStateCtx :: forall extraState extraFlags extraPeers extraAPI extraCounters
       peeraddr peerconn (m :: * -> *).
PeerSelectionActions
  extraState
  extraFlags
  extraPeers
  extraAPI
  extraCounters
  peeraddr
  peerconn
  m
-> LedgerPeersConsensusInterface extraAPI m
getLedgerStateCtx,
                                              PeerSharing
peerSharing :: PeerSharing
peerSharing :: forall extraState extraFlags extraPeers extraAPI extraCounters
       peeraddr peerconn (m :: * -> *).
PeerSelectionActions
  extraState
  extraFlags
  extraPeers
  extraAPI
  extraCounters
  peeraddr
  peerconn
  m
-> PeerSharing
peerSharing }
                       PeerSelectionSetsWithSizes
  (ExtraPeerSelectionSetsWithSizes peeraddr) peeraddr
psv PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st -> do
      associationMode <- STM m UseLedgerPeers
-> PeerSharing -> UseBootstrapPeers -> STM m AssociationMode
forall (m :: * -> *).
MonadSTM m =>
STM m UseLedgerPeers
-> PeerSharing -> UseBootstrapPeers -> STM m AssociationMode
readAssociationMode STM m UseLedgerPeers
readUseLedgerPeers
                                             PeerSharing
peerSharing
                                             (ExtraState -> UseBootstrapPeers
Cardano.bootstrapPeersFlag (PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> ExtraState
forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> extraState
extraState PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
st))
      Cardano.updateOutboundConnectionsState
        (lpExtraAPI getLedgerStateCtx)
        (outboundConnectionsState associationMode psv st)
  , extraDecisions :: ExtraGuardedDecisions
  ExtraState
  extraDebugState
  PeerTrustable
  (ExtraPeers peeraddr)
  (LedgerPeersConsensusInterface m)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
extraDecisions  =
      ExtraGuardedDecisions {
        preBlocking :: PeerSelectionPolicy peeraddr m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
preBlocking     = \PeerSelectionPolicy peeraddr m
_ PeerSelectionActions
  ExtraState
  PeerTrustable
  (ExtraPeers peeraddr)
  (LedgerPeersConsensusInterface m)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
psa PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
pst ->
             ExtraPeerSelectionActions m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
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   ExtraPeerSelectionActions m
extraActions PeerSelectionActions
  ExtraState
  PeerTrustable
  (ExtraPeers peeraddr)
  (LedgerPeersConsensusInterface m)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
psa PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
pst
          Guarded
  (STM m)
  (TimedDecision
     m
     ExtraState
     extraDebugState
     PeerTrustable
     (ExtraPeers peeraddr)
     peeraddr
     peerconn)
-> Guarded
     (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. Semigroup a => a -> a -> a
<> PeerSelectionActions
  ExtraState
  PeerTrustable
  (ExtraPeers peeraddr)
  (LedgerPeersConsensusInterface m)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
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
  ExtraState
  PeerTrustable
  (ExtraPeers peeraddr)
  (LedgerPeersConsensusInterface m)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
psa PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
pst
          Guarded
  (STM m)
  (TimedDecision
     m
     ExtraState
     extraDebugState
     PeerTrustable
     (ExtraPeers peeraddr)
     peeraddr
     peerconn)
-> Guarded
     (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. Semigroup a => a -> a -> a
<> PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
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          PeerSelectionState
  ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
pst
      , postBlocking :: PeerSelectionPolicy peeraddr m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
postBlocking    = PeerSelectionPolicy peeraddr m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
forall a. Monoid a => a
mempty
      , postNonBlocking :: PeerSelectionPolicy peeraddr m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
postNonBlocking = PeerSelectionPolicy peeraddr m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
forall a. Monoid a => a
mempty
      , customTargetsAction :: Maybe
  (PeerSelectionPolicy peeraddr m
   -> PeerSelectionActions
        ExtraState
        PeerTrustable
        (ExtraPeers peeraddr)
        (LedgerPeersConsensusInterface m)
        (ExtraPeerSelectionSetsWithSizes peeraddr)
        peeraddr
        peerconn
        m
   -> PeerSelectionState
        ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
   -> Guarded
        (STM m)
        (TimedDecision
           m
           ExtraState
           extraDebugState
           PeerTrustable
           (ExtraPeers peeraddr)
           peeraddr
           peerconn))
customTargetsAction         = (PeerSelectionPolicy peeraddr m
 -> PeerSelectionActions
      ExtraState
      PeerTrustable
      (ExtraPeers peeraddr)
      (LedgerPeersConsensusInterface m)
      (ExtraPeerSelectionSetsWithSizes peeraddr)
      peeraddr
      peerconn
      m
 -> PeerSelectionState
      ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
 -> Guarded
      (STM m)
      (TimedDecision
         m
         ExtraState
         extraDebugState
         PeerTrustable
         (ExtraPeers peeraddr)
         peeraddr
         peerconn))
-> Maybe
     (PeerSelectionPolicy peeraddr m
      -> PeerSelectionActions
           ExtraState
           PeerTrustable
           (ExtraPeers peeraddr)
           (LedgerPeersConsensusInterface m)
           (ExtraPeerSelectionSetsWithSizes peeraddr)
           peeraddr
           peerconn
           m
      -> PeerSelectionState
           ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
      -> Guarded
           (STM m)
           (TimedDecision
              m
              ExtraState
              extraDebugState
              PeerTrustable
              (ExtraPeers peeraddr)
              peeraddr
              peerconn))
forall a. a -> Maybe a
Just ((PeerSelectionPolicy peeraddr m
  -> PeerSelectionActions
       ExtraState
       PeerTrustable
       (ExtraPeers peeraddr)
       (LedgerPeersConsensusInterface m)
       (ExtraPeerSelectionSetsWithSizes peeraddr)
       peeraddr
       peerconn
       m
  -> PeerSelectionState
       ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
  -> Guarded
       (STM m)
       (TimedDecision
          m
          ExtraState
          extraDebugState
          PeerTrustable
          (ExtraPeers peeraddr)
          peeraddr
          peerconn))
 -> Maybe
      (PeerSelectionPolicy peeraddr m
       -> PeerSelectionActions
            ExtraState
            PeerTrustable
            (ExtraPeers peeraddr)
            (LedgerPeersConsensusInterface m)
            (ExtraPeerSelectionSetsWithSizes peeraddr)
            peeraddr
            peerconn
            m
       -> PeerSelectionState
            ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
       -> Guarded
            (STM m)
            (TimedDecision
               m
               ExtraState
               extraDebugState
               PeerTrustable
               (ExtraPeers peeraddr)
               peeraddr
               peerconn)))
-> (PeerSelectionPolicy peeraddr m
    -> PeerSelectionActions
         ExtraState
         PeerTrustable
         (ExtraPeers peeraddr)
         (LedgerPeersConsensusInterface m)
         (ExtraPeerSelectionSetsWithSizes peeraddr)
         peeraddr
         peerconn
         m
    -> PeerSelectionState
         ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
    -> Guarded
         (STM m)
         (TimedDecision
            m
            ExtraState
            extraDebugState
            PeerTrustable
            (ExtraPeers peeraddr)
            peeraddr
            peerconn))
-> Maybe
     (PeerSelectionPolicy peeraddr m
      -> PeerSelectionActions
           ExtraState
           PeerTrustable
           (ExtraPeers peeraddr)
           (LedgerPeersConsensusInterface m)
           (ExtraPeerSelectionSetsWithSizes peeraddr)
           peeraddr
           peerconn
           m
      -> PeerSelectionState
           ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
      -> Guarded
           (STM m)
           (TimedDecision
              m
              ExtraState
              extraDebugState
              PeerTrustable
              (ExtraPeers peeraddr)
              peeraddr
              peerconn))
forall a b. (a -> b) -> a -> b
$ \PeerSelectionPolicy peeraddr m
_ -> ExtraPeerSelectionActions m
-> PeerSelectionActions
     ExtraState
     PeerTrustable
     (ExtraPeers peeraddr)
     (LedgerPeersConsensusInterface m)
     (ExtraPeerSelectionSetsWithSizes peeraddr)
     peeraddr
     peerconn
     m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
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)
Cardano.targetPeers ExtraPeerSelectionActions m
extraActions
      , customLocalRootsAction :: Maybe
  (PeerSelectionPolicy peeraddr m
   -> PeerSelectionActions
        ExtraState
        PeerTrustable
        (ExtraPeers peeraddr)
        (LedgerPeersConsensusInterface m)
        (ExtraPeerSelectionSetsWithSizes peeraddr)
        peeraddr
        peerconn
        m
   -> PeerSelectionState
        ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
   -> Guarded
        (STM m)
        (TimedDecision
           m
           ExtraState
           extraDebugState
           PeerTrustable
           (ExtraPeers peeraddr)
           peeraddr
           peerconn))
customLocalRootsAction      = (PeerSelectionPolicy peeraddr m
 -> PeerSelectionActions
      ExtraState
      PeerTrustable
      (ExtraPeers peeraddr)
      (LedgerPeersConsensusInterface m)
      (ExtraPeerSelectionSetsWithSizes peeraddr)
      peeraddr
      peerconn
      m
 -> PeerSelectionState
      ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
 -> Guarded
      (STM m)
      (TimedDecision
         m
         ExtraState
         extraDebugState
         PeerTrustable
         (ExtraPeers peeraddr)
         peeraddr
         peerconn))
-> Maybe
     (PeerSelectionPolicy peeraddr m
      -> PeerSelectionActions
           ExtraState
           PeerTrustable
           (ExtraPeers peeraddr)
           (LedgerPeersConsensusInterface m)
           (ExtraPeerSelectionSetsWithSizes peeraddr)
           peeraddr
           peerconn
           m
      -> PeerSelectionState
           ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
      -> Guarded
           (STM m)
           (TimedDecision
              m
              ExtraState
              extraDebugState
              PeerTrustable
              (ExtraPeers peeraddr)
              peeraddr
              peerconn))
forall a. a -> Maybe a
Just ((PeerSelectionPolicy peeraddr m
  -> PeerSelectionActions
       ExtraState
       PeerTrustable
       (ExtraPeers peeraddr)
       (LedgerPeersConsensusInterface m)
       (ExtraPeerSelectionSetsWithSizes peeraddr)
       peeraddr
       peerconn
       m
  -> PeerSelectionState
       ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
  -> Guarded
       (STM m)
       (TimedDecision
          m
          ExtraState
          extraDebugState
          PeerTrustable
          (ExtraPeers peeraddr)
          peeraddr
          peerconn))
 -> Maybe
      (PeerSelectionPolicy peeraddr m
       -> PeerSelectionActions
            ExtraState
            PeerTrustable
            (ExtraPeers peeraddr)
            (LedgerPeersConsensusInterface m)
            (ExtraPeerSelectionSetsWithSizes peeraddr)
            peeraddr
            peerconn
            m
       -> PeerSelectionState
            ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
       -> Guarded
            (STM m)
            (TimedDecision
               m
               ExtraState
               extraDebugState
               PeerTrustable
               (ExtraPeers peeraddr)
               peeraddr
               peerconn)))
-> (PeerSelectionPolicy peeraddr m
    -> PeerSelectionActions
         ExtraState
         PeerTrustable
         (ExtraPeers peeraddr)
         (LedgerPeersConsensusInterface m)
         (ExtraPeerSelectionSetsWithSizes peeraddr)
         peeraddr
         peerconn
         m
    -> PeerSelectionState
         ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
    -> Guarded
         (STM m)
         (TimedDecision
            m
            ExtraState
            extraDebugState
            PeerTrustable
            (ExtraPeers peeraddr)
            peeraddr
            peerconn))
-> Maybe
     (PeerSelectionPolicy peeraddr m
      -> PeerSelectionActions
           ExtraState
           PeerTrustable
           (ExtraPeers peeraddr)
           (LedgerPeersConsensusInterface m)
           (ExtraPeerSelectionSetsWithSizes peeraddr)
           peeraddr
           peerconn
           m
      -> PeerSelectionState
           ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
      -> Guarded
           (STM m)
           (TimedDecision
              m
              ExtraState
              extraDebugState
              PeerTrustable
              (ExtraPeers peeraddr)
              peeraddr
              peerconn))
forall a b. (a -> b) -> a -> b
$ \PeerSelectionPolicy peeraddr m
_ -> PeerSelectionActions
  ExtraState
  PeerTrustable
  (ExtraPeers peeraddr)
  (LedgerPeersConsensusInterface m)
  (ExtraPeerSelectionSetsWithSizes peeraddr)
  peeraddr
  peerconn
  m
-> PeerSelectionState
     ExtraState PeerTrustable (ExtraPeers peeraddr) peeraddr peerconn
-> Guarded
     (STM m)
     (TimedDecision
        m
        ExtraState
        extraDebugState
        PeerTrustable
        (ExtraPeers peeraddr)
        peeraddr
        peerconn)
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)
Cardano.localRoots
      , enableProgressMakingActions :: ExtraState -> Bool
enableProgressMakingActions = \ExtraState
st ->
          Bool -> Bool
not (UseBootstrapPeers -> LedgerStateJudgement -> Bool
requiresBootstrapPeers (ExtraState -> UseBootstrapPeers
Cardano.bootstrapPeersFlag ExtraState
st) (ExtraState -> LedgerStateJudgement
Cardano.ledgerStateJudgement ExtraState
st))
      , ledgerPeerSnapshotExtraStateChange :: ExtraState -> ExtraState
ledgerPeerSnapshotExtraStateChange = \ExtraState
st ->
          ExtraState
st { Cardano.ledgerStateJudgement = YoungEnough }
      }
  }