{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
module Ouroboros.Network.BlockFetch.ConsensusInterface
( PraosFetchMode (..)
, FetchMode (..)
, BlockFetchConsensusInterface (..)
, FromConsensus (..)
, ChainSelStarvation (..)
, mkReadFetchMode
) where
import Control.Monad.Class.MonadSTM
import Control.Monad.Class.MonadTime (UTCTime)
import Control.Monad.Class.MonadTime.SI (Time)
import Data.Functor ((<&>))
import Data.Map.Strict (Map)
import GHC.Generics (Generic)
import GHC.Stack (HasCallStack)
import NoThunks.Class (NoThunks)
import Ouroboros.Network.AnchoredFragment (AnchoredFragment)
import Ouroboros.Network.Block
import Ouroboros.Network.ConsensusMode (ConsensusMode (..))
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
(LedgerStateJudgement (..))
import Ouroboros.Network.SizeInBytes (SizeInBytes)
data PraosFetchMode =
FetchModeBulkSync
| FetchModeDeadline
deriving (PraosFetchMode -> PraosFetchMode -> Bool
(PraosFetchMode -> PraosFetchMode -> Bool)
-> (PraosFetchMode -> PraosFetchMode -> Bool) -> Eq PraosFetchMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PraosFetchMode -> PraosFetchMode -> Bool
== :: PraosFetchMode -> PraosFetchMode -> Bool
$c/= :: PraosFetchMode -> PraosFetchMode -> Bool
/= :: PraosFetchMode -> PraosFetchMode -> Bool
Eq, Int -> PraosFetchMode -> ShowS
[PraosFetchMode] -> ShowS
PraosFetchMode -> String
(Int -> PraosFetchMode -> ShowS)
-> (PraosFetchMode -> String)
-> ([PraosFetchMode] -> ShowS)
-> Show PraosFetchMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PraosFetchMode -> ShowS
showsPrec :: Int -> PraosFetchMode -> ShowS
$cshow :: PraosFetchMode -> String
show :: PraosFetchMode -> String
$cshowList :: [PraosFetchMode] -> ShowS
showList :: [PraosFetchMode] -> ShowS
Show)
data FetchMode = FetchModeGenesis | PraosFetchMode PraosFetchMode
deriving (FetchMode -> FetchMode -> Bool
(FetchMode -> FetchMode -> Bool)
-> (FetchMode -> FetchMode -> Bool) -> Eq FetchMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FetchMode -> FetchMode -> Bool
== :: FetchMode -> FetchMode -> Bool
$c/= :: FetchMode -> FetchMode -> Bool
/= :: FetchMode -> FetchMode -> Bool
Eq, Int -> FetchMode -> ShowS
[FetchMode] -> ShowS
FetchMode -> String
(Int -> FetchMode -> ShowS)
-> (FetchMode -> String)
-> ([FetchMode] -> ShowS)
-> Show FetchMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FetchMode -> ShowS
showsPrec :: Int -> FetchMode -> ShowS
$cshow :: FetchMode -> String
show :: FetchMode -> String
$cshowList :: [FetchMode] -> ShowS
showList :: [FetchMode] -> ShowS
Show)
mkReadFetchMode
:: Functor m
=> ConsensusMode
-> m LedgerStateJudgement
-> m PraosFetchMode
-> m FetchMode
mkReadFetchMode :: forall (m :: * -> *).
Functor m =>
ConsensusMode
-> m LedgerStateJudgement -> m PraosFetchMode -> m FetchMode
mkReadFetchMode ConsensusMode
consensusMode m LedgerStateJudgement
getLedgerStateJudgement m PraosFetchMode
getFetchMode =
case ConsensusMode
consensusMode of
ConsensusMode
GenesisMode -> m LedgerStateJudgement
getLedgerStateJudgement m LedgerStateJudgement
-> (LedgerStateJudgement -> FetchMode) -> m FetchMode
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
LedgerStateJudgement
YoungEnough -> PraosFetchMode -> FetchMode
PraosFetchMode PraosFetchMode
FetchModeDeadline
LedgerStateJudgement
TooOld -> FetchMode
FetchModeGenesis
ConsensusMode
PraosMode -> PraosFetchMode -> FetchMode
PraosFetchMode (PraosFetchMode -> FetchMode) -> m PraosFetchMode -> m FetchMode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PraosFetchMode
getFetchMode
data BlockFetchConsensusInterface peer header block m =
BlockFetchConsensusInterface {
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> STM m (Map peer (AnchoredFragment header))
readCandidateChains :: STM m (Map peer (AnchoredFragment header)),
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> STM m (AnchoredFragment header)
readCurrentChain :: STM m (AnchoredFragment header),
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m -> STM m FetchMode
readFetchMode :: STM m FetchMode,
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> STM m (Point block -> Bool)
readFetchedBlocks :: STM m (Point block -> Bool),
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> STM m (Point block -> block -> m ())
mkAddFetchedBlock :: STM m (Point block -> block -> m ()),
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m -> STM m MaxSlotNo
readFetchedMaxSlotNo :: STM m MaxSlotNo,
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> HasCallStack =>
AnchoredFragment header -> AnchoredFragment header -> Bool
plausibleCandidateChain :: HasCallStack
=> AnchoredFragment header
-> AnchoredFragment header -> Bool,
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> HasCallStack =>
AnchoredFragment header -> AnchoredFragment header -> Ordering
compareCandidateChains :: HasCallStack
=> AnchoredFragment header
-> AnchoredFragment header
-> Ordering,
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> header -> SizeInBytes
blockFetchSize :: header -> SizeInBytes,
:: header -> block -> Bool,
:: FromConsensus header -> STM m UTCTime,
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m
-> STM m ChainSelStarvation
readChainSelStarvation :: STM m ChainSelStarvation,
forall peer header block (m :: * -> *).
BlockFetchConsensusInterface peer header block m -> peer -> m ()
demoteChainSyncJumpingDynamo :: peer -> m ()
}
data ChainSelStarvation
= ChainSelStarvationOngoing
| ChainSelStarvationEndedAt Time
deriving (ChainSelStarvation -> ChainSelStarvation -> Bool
(ChainSelStarvation -> ChainSelStarvation -> Bool)
-> (ChainSelStarvation -> ChainSelStarvation -> Bool)
-> Eq ChainSelStarvation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ChainSelStarvation -> ChainSelStarvation -> Bool
== :: ChainSelStarvation -> ChainSelStarvation -> Bool
$c/= :: ChainSelStarvation -> ChainSelStarvation -> Bool
/= :: ChainSelStarvation -> ChainSelStarvation -> Bool
Eq, Int -> ChainSelStarvation -> ShowS
[ChainSelStarvation] -> ShowS
ChainSelStarvation -> String
(Int -> ChainSelStarvation -> ShowS)
-> (ChainSelStarvation -> String)
-> ([ChainSelStarvation] -> ShowS)
-> Show ChainSelStarvation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ChainSelStarvation -> ShowS
showsPrec :: Int -> ChainSelStarvation -> ShowS
$cshow :: ChainSelStarvation -> String
show :: ChainSelStarvation -> String
$cshowList :: [ChainSelStarvation] -> ShowS
showList :: [ChainSelStarvation] -> ShowS
Show, Context -> ChainSelStarvation -> IO (Maybe ThunkInfo)
Proxy ChainSelStarvation -> String
(Context -> ChainSelStarvation -> IO (Maybe ThunkInfo))
-> (Context -> ChainSelStarvation -> IO (Maybe ThunkInfo))
-> (Proxy ChainSelStarvation -> String)
-> NoThunks ChainSelStarvation
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> ChainSelStarvation -> IO (Maybe ThunkInfo)
noThunks :: Context -> ChainSelStarvation -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> ChainSelStarvation -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> ChainSelStarvation -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy ChainSelStarvation -> String
showTypeOf :: Proxy ChainSelStarvation -> String
NoThunks, (forall x. ChainSelStarvation -> Rep ChainSelStarvation x)
-> (forall x. Rep ChainSelStarvation x -> ChainSelStarvation)
-> Generic ChainSelStarvation
forall x. Rep ChainSelStarvation x -> ChainSelStarvation
forall x. ChainSelStarvation -> Rep ChainSelStarvation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ChainSelStarvation -> Rep ChainSelStarvation x
from :: forall x. ChainSelStarvation -> Rep ChainSelStarvation x
$cto :: forall x. Rep ChainSelStarvation x -> ChainSelStarvation
to :: forall x. Rep ChainSelStarvation x -> ChainSelStarvation
Generic)
newtype FromConsensus a = FromConsensus {forall a. FromConsensus a -> a
unFromConsensus :: a}
deriving ((forall a b. (a -> b) -> FromConsensus a -> FromConsensus b)
-> (forall a b. a -> FromConsensus b -> FromConsensus a)
-> Functor FromConsensus
forall a b. a -> FromConsensus b -> FromConsensus a
forall a b. (a -> b) -> FromConsensus a -> FromConsensus b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> FromConsensus a -> FromConsensus b
fmap :: forall a b. (a -> b) -> FromConsensus a -> FromConsensus b
$c<$ :: forall a b. a -> FromConsensus b -> FromConsensus a
<$ :: forall a b. a -> FromConsensus b -> FromConsensus a
Functor)
instance Applicative FromConsensus where
pure :: forall a. a -> FromConsensus a
pure = a -> FromConsensus a
forall a. a -> FromConsensus a
FromConsensus
FromConsensus a -> b
f <*> :: forall a b.
FromConsensus (a -> b) -> FromConsensus a -> FromConsensus b
<*> FromConsensus a
a = b -> FromConsensus b
forall a. a -> FromConsensus a
FromConsensus (a -> b
f a
a)