1- {-# LANGUAGE LambdaCase #-}
2- {-# LANGUAGE NamedFieldPuns #-}
3- {-# LANGUAGE ScopedTypeVariables #-}
1+ {-# LANGUAGE DisambiguateRecordFields #-}
2+ {-# LANGUAGE LambdaCase #-}
3+ {-# LANGUAGE NamedFieldPuns #-}
4+ {-# LANGUAGE ScopedTypeVariables #-}
45
56-- | This module contains governor decisions for monitoring tasks:
67--
@@ -18,14 +19,17 @@ module Cardano.Network.PeerSelection.Governor.Monitor
1819 , ExtraTrace (.. )
1920 ) where
2021
21- import Data.Set qualified as Set
22-
22+ import Control.Concurrent.JobPool ( Job ( .. ))
23+ import Control.Exception ( assert )
2324import Control.Monad.Class.MonadSTM
2425import Control.Monad.Class.MonadTime.SI
2526import Control.Monad.Class.MonadTimer.SI
27+ import Data.Map.Strict (Map )
28+ import Data.Map.Strict qualified as Map
29+ import Data.Set (Set )
30+ import Data.Set qualified as Set
2631
2732import Cardano.Network.ConsensusMode
28- import Cardano.Network.Diffusion.Configuration qualified as Cardano (srvPrefix )
2933import Cardano.Network.LedgerPeerConsensusInterface qualified as Cardano
3034import Cardano.Network.LedgerStateJudgement
3135import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (.. ),
@@ -37,17 +41,13 @@ import Cardano.Network.PeerSelection.Governor.PeerSelectionState qualified as Ca
3741import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable (.. ))
3842import Cardano.Network.PeerSelection.PublicRootPeers qualified as Cardano.PublicRootPeers
3943import Cardano.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers
40- import Control.Exception (assert )
41- import Data.Map.Strict (Map )
42- import Data.Map.Strict qualified as Map
43- import Data.Set (Set )
44+ import Ouroboros.Network.Block (HeaderHash , Point (.. ), SlotNo )
4445import Ouroboros.Network.PeerSelection.Governor.ActivePeers
4546 (jobDemoteActivePeer )
46- import Ouroboros.Network.PeerSelection.Governor.Monitor (jobVerifyPeerSnapshot )
4747import Ouroboros.Network.PeerSelection.Governor.Types hiding
4848 (PeerSelectionCounters )
4949import Ouroboros.Network.PeerSelection.LedgerPeers.Type
50- (LedgerPeersConsensusInterface (.. ))
50+ (LedgerPeersConsensusInterface (.. ), LedgerPeerSnapshot ( .. ) )
5151import Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
5252import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers
5353import Ouroboros.Network.PeerSelection.State.KnownPeers qualified as KnownPeers
@@ -496,8 +496,8 @@ monitorLedgerStateJudgement
496496 (TimedDecision m Cardano. ExtraState extraDebugState extraFlags
497497 (Cardano. ExtraPeers peeraddr ) ExtraTrace peeraddr peerconn )
498498monitorLedgerStateJudgement PeerSelectionActions {
499- getLedgerStateCtx = ledgerCtx @ LedgerPeersConsensusInterface {
500- lpExtraAPI = Cardano. LedgerPeersConsensusInterface {
499+ getLedgerStateCtx = LedgerPeersConsensusInterface {
500+ lpExtraAPI = lpExtraAPI @ Cardano. LedgerPeersConsensusInterface {
501501 Cardano. getLedgerStateJudgement = readLedgerStateJudgement
502502 }
503503 }
@@ -524,8 +524,9 @@ monitorLedgerStateJudgement PeerSelectionActions{
524524 Decision {
525525 decisionTrace = [ExtraTrace (TraceLedgerStateJudgementChanged lsj)],
526526 decisionJobs = case (lsj, ledgerPeerSnapshot) of
527- (TooOld , Just ledgerPeerSnapshot') ->
528- [jobVerifyPeerSnapshot Cardano. srvPrefix ledgerPeerSnapshot' ledgerCtx]
527+ (TooOld , Just (LedgerPeerSnapshotV3 point _pools))
528+ | Point (At Block { blockPointSlot, blockPointHash } ) <- point ->
529+ [jobVerifyPeerSnapshot (blockPointSlot, blockPointHash) lpExtraAPI]
529530 _otherwise -> [] ,
530531 decisionState = st {
531532 extraState = cpst {
@@ -676,6 +677,35 @@ waitForSystemToQuiesce st@PeerSelectionState{
676677 | otherwise = GuardedSkip Nothing
677678
678679
680+ -- | This job, which is initiated by monitorLedgerStateJudgement job,
681+ -- verifies whether the provided big ledger pools match up with the
682+ -- ledger state once the node catches up to the slot at which the
683+ -- snapshot was ostensibly taken
684+ --
685+ jobVerifyPeerSnapshot :: (MonadSTM m )
686+ => (SlotNo , HeaderHash LedgerPeerSnapshot )
687+ -> Cardano. LedgerPeersConsensusInterface m
688+ -> Job () m (Completion m extraState extraDebugState extraFlags extraPeers extraTrace peeraddr peerconn )
689+ jobVerifyPeerSnapshot (slotNo, theHash)
690+ Cardano. LedgerPeersConsensusInterface { lpGetBlockInfo }
691+ = Job job (const (completion False )) () " jobVerifyPeerSnapshot"
692+ where
693+ completion result = return . Completion $ \ st _now ->
694+ Decision {
695+ decisionTrace = [TraceVerifyPeerSnapshot result],
696+ decisionState = st,
697+ decisionJobs = [] }
698+
699+ job = do
700+ Block { blockPointHash } <- atomically $ lpGetBlockInfo slotNo
701+ let result = theHash == blockPointHash
702+ return . Completion $ \ st _now ->
703+ Decision {
704+ decisionTrace = [TraceVerifyPeerSnapshot result],
705+ decisionState = st,
706+ decisionJobs = [] }
707+
708+
679709-- | Extra trace points for `TracePeerSelection`.
680710--
681711-- TODO: it ought to be moved to `Types`, but that introduces a circular
0 commit comments