11{-# LANGUAGE BangPatterns #-}
2+ {-# LANGUAGE DuplicateRecordFields #-}
23{-# LANGUAGE FlexibleContexts #-}
34{-# LANGUAGE NamedFieldPuns #-}
45{-# LANGUAGE NondecreasingIndentation #-}
@@ -73,11 +74,18 @@ data BlockEvent
7374 | Pruned
7475 deriving (Show )
7576
77+ data ConformanceEvent
78+ = Slot { slot :: ! SlotNo }
79+ | NoIBGenerated { slot :: ! SlotNo }
80+ | NoEBGenerated { slot :: ! SlotNo }
81+ | NoVTGenerated { slot :: ! SlotNo }
82+ deriving (Show )
7683data LeiosNodeEvent
7784 = PraosNodeEvent ! (PraosNode. PraosNodeEvent RankingBlockBody )
7885 | LeiosNodeEventCPU ! CPUTask
7986 | LeiosNodeEvent ! BlockEvent ! LeiosEventBlock
8087 | LeiosNodeEventLedgerState ! RankingBlockId
88+ | LeiosNodeEventConformance ! ConformanceEvent
8189 deriving (Show )
8290
8391--------------------------------------------------------------
@@ -103,6 +111,7 @@ data LeiosNodeConfig = LeiosNodeConfig
103111 , processingQueueBound :: ! Natural
104112 , processingCores :: ! NumCores
105113 , blockGeneration :: ! BlockGeneration
114+ , conformanceEvents :: ! Bool
106115 }
107116
108117--------------------------------------------------------------
@@ -801,7 +810,7 @@ generator ::
801810 LeiosNodeState m ->
802811 m ()
803812generator tracer cfg st = do
804- schedule <- mkSchedule cfg
813+ schedule <- mkSchedule tracer cfg
805814 let buffers = mkBuffersView cfg st
806815 let
807816 withDelay d (lbl, m) = do
@@ -926,13 +935,14 @@ mkBuffersView cfg st = BuffersView{..}
926935 ]
927936 return EndorseBlocksSnapshot {.. }
928937
929- mkSchedule :: MonadSTM m => LeiosNodeConfig -> m (SlotNo -> m [(SomeRole , Word64 )])
930- mkSchedule cfg = do
938+ mkSchedule :: MonadSTM m => Tracer m LeiosNodeEvent -> LeiosNodeConfig -> m (SlotNo -> m [(SomeRole , Word64 )])
939+ mkSchedule tracer cfg = do
931940 -- For each pipeline, we want to deploy all our votes in a single
932941 -- message to cut down on traffic, so we pick one slot out of each
933942 -- active voting range (they are assumed not to overlap).
934943 votingSlots <- newTVarIO $ pickFromRanges rng1 $ votingRanges cfg. leios
935- mkScheduler rng2 (rates votingSlots)
944+ sched <- mkScheduler' rng2 (rates votingSlots)
945+ pure $! if cfg. conformanceEvents then logMissedBlocks sched else fmap filterWins . sched
936946 where
937947 (rng1, rng2) = split cfg. rng
938948 calcWins rate = Just $ \ sample ->
@@ -949,6 +959,7 @@ mkSchedule cfg = do
949959 , (SomeRole Generate. Base , const $ calcWins (NetworkRate cfg. leios. praos. blockFrequencyPerSlot))
950960 ]
951961 rates votingSlots slot = do
962+ when cfg. conformanceEvents $ traceWith tracer $ LeiosNodeEventConformance Slot {.. }
952963 vote <- atomically $ do
953964 vs <- readTVar votingSlots
954965 case vs of
@@ -966,7 +977,20 @@ mkSchedule cfg = do
966977 pickFromRanges rng0 rs = snd $ mapAccumL f rng0 rs
967978 where
968979 f rng r = coerce $ swap $ uniformR (coerce r :: (Word64 , Word64 )) rng
969-
980+ logMissedBlocks sched slot = do
981+ xs <- sched slot
982+ forM_ xs $ \ (SomeRole role, wins) -> do
983+ when (wins == 0 ) $
984+ case role of
985+ Generate. Propose {} -> do
986+ traceWith tracer $ LeiosNodeEventConformance $ NoIBGenerated {.. }
987+ Generate. Endorse {} -> do
988+ traceWith tracer $ LeiosNodeEventConformance $ NoEBGenerated {.. }
989+ Generate. Vote {} -> do
990+ traceWith tracer $ LeiosNodeEventConformance $ NoVTGenerated {.. }
991+ Generate. Base {} -> return ()
992+ return $ filterWins xs
993+ filterWins = filter ((>= 1 ) . snd )
970994-- * Utils
971995
972996partitionRBVar ::
0 commit comments