Skip to content

Commit 7ad2a46

Browse files
committed
simulation: minor cleanup
1 parent ddc63ca commit 7ad2a46

File tree

1 file changed

+33
-30
lines changed
  • simulation/src/LeiosProtocol/Short

1 file changed

+33
-30
lines changed

simulation/src/LeiosProtocol/Short/Node.hs

+33-30
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import qualified Data.Set as Set
3737
import qualified Data.Text as T
3838
import Data.Traversable
3939
import Data.Tuple (swap)
40-
import Debug.Trace (trace)
4140
import LeiosProtocol.Common
4241
import LeiosProtocol.Config
4342
import LeiosProtocol.Relay
@@ -56,7 +55,6 @@ import qualified PraosProtocol.PraosNode as PraosNode
5655
import STMCompat
5756
import SimTypes (cpuTask)
5857
import System.Random
59-
import Text.Printf (printf)
6058

6159
--------------------------------------------------------------
6260
---- Events
@@ -282,21 +280,25 @@ relayEBConfig _tracer cfg@LeiosNodeConfig{leios = LeiosConfig{pipeline = (_ :: S
282280
, submitBlocks = \hbs t k ->
283281
submitBlocks (map (first (.id)) hbs) t (k . map (\(i, b) -> (RelayHeader i b.slot, b)))
284282
, shouldIgnore = do
285-
-- FIXME: we want to ignore EBs that we pruned.
286-
currSlot <- currentSlotNo cfg.slotConfig
287-
atomically $ do
288-
ebBuffer <- readTVar st.relayBufferVar
289-
prunedTo <- readTVar leiosState.prunedUncertifiedEBStateToVar
290-
pure $ \ebHeader -> do
291-
-- Check whether or not the EB is older than prunedUncertifiedEBStateTo
292-
let ebTooOld1 = ebHeader.slot < prunedTo
293-
-- Check whether or not the EB is older than "eb-max-age-for-relay-slots"
294-
let (endorseStart, _endorseEnd) = endorseRange cfg.leios $ pipelineOf @p cfg.leios Short.Endorse ebHeader.slot
295-
let ebMaxSlotForRelay = endorseStart + fromIntegral cfg.leios.maxEndorseBlockAgeForRelaySlots
296-
let ebTooOld2 = ebMaxSlotForRelay < currSlot
297-
-- Check whether or not the EB is already in the relay buffer
298-
let ebAlreadyInBuffer = RB.member ebHeader.id ebBuffer
299-
ebTooOld1 || ebTooOld2 || ebAlreadyInBuffer
283+
-- We possibly prune certified EBs (not referenced in the
284+
-- chain) after maxEndorseBlockAgeSlots, so we should not end
285+
-- up asking for their bodies again, in the remote possibility
286+
-- they get offered.
287+
assert (cfg.leios.maxEndorseBlockAgeForRelaySlots <= cfg.leios.maxEndorseBlockAgeSlots) $ do
288+
currSlot <- currentSlotNo cfg.slotConfig
289+
let oldestEBToRelay = currSlot - fromIntegral cfg.leios.maxEndorseBlockAgeForRelaySlots
290+
atomically $ do
291+
ebBuffer <- readTVar st.relayBufferVar
292+
prunedTo <- readTVar leiosState.prunedUncertifiedEBStateToVar
293+
pure $ \ebHeader -> do
294+
-- Check whether or not the EB is older than prunedUncertifiedEBStateTo
295+
-- Should be redundant with check against oldestEBToRelay: only EBs from previous pipeline are pruned this way.
296+
let ebTooOld1 = ebHeader.slot < prunedTo
297+
-- Check whether or not the EB is older than "eb-max-age-for-relay-slots"
298+
let ebTooOld2 = ebHeader.slot < oldestEBToRelay
299+
-- Check whether or not the EB is already in the relay buffer
300+
let ebAlreadyInBuffer = RB.member ebHeader.id ebBuffer
301+
ebTooOld1 || ebTooOld2 || ebAlreadyInBuffer
300302
}
301303

302304
relayVoteConfig ::
@@ -489,13 +491,14 @@ pruneExpiredUnadoptedEBs ::
489491
LeiosNodeConfig ->
490492
LeiosNodeState m ->
491493
m ()
492-
pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st = go (toEnum 0)
494+
pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{leios, slotConfig} st = go (toEnum 0)
493495
where
494496
go :: PipelineNo -> m ()
495497
go p = do
496-
let (endorseStart, endorseEnd) = endorseRange leios p
497-
let pruneTo = succ (lastUnadoptedEB leios p)
498-
_ <- waitNextSlot slotConfig pruneTo
498+
let ebRange@(endorseStart, endorseEnd) = endorseRange leios p
499+
let slotWhenEBsTooOldForRBs = succ $ endorseEnd + fromIntegral leios.maxEndorseBlockAgeSlots
500+
let pruneTo = succ endorseEnd
501+
_ <- waitNextSlot slotConfig slotWhenEBsTooOldForRBs
499502
chain <- atomically $ PraosNode.preferredChain st.praosState
500503
let rbsOnChain = takeWhile (\rb -> rb.blockHeader.headerSlot > endorseStart) . Chain.toNewestFirst $ chain
501504
let ebIdsOnChain =
@@ -513,7 +516,7 @@ pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st =
513516
RB.partition $ \ebEntry -> do
514517
let ebId = (snd ebEntry.value).id
515518
let ebSlot = (fst ebEntry.value).slot
516-
let ebInPipeline = endorseStart <= ebSlot && ebSlot <= endorseEnd
519+
let ebInPipeline = ebSlot `inRange` ebRange
517520
let ebAdopted = ebId `Set.member` ebIdsOnChain
518521
-- NOTE: pruneExpiredUnadoptedEBs runs long after pruneExpiredUncertifiedEBs,
519522
-- hence any EB from pipeline p MUST be certified at this point
@@ -525,12 +528,12 @@ pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st =
525528
-- Prune st.ibsNeededForEBVar for *certified* EBs in ebIdsToPrune:
526529
modifyTVar' st.ibsNeededForEBVar (`Map.withoutKeys` ebIdsToPrune)
527530
-- Update st.prunedUnadoptedEBStateToVar with the slot number pruned to.
531+
-- TODO: Unused
528532
writeTVar st.prunedUnadoptedEBStateToVar $! pruneTo
529533
-- Return the pruned EBs.
530534
pure ebsPruned
531535
-- Emit trace events for pruning each EB
532536
for_ ebsPruned $ \eb -> do
533-
trace (printf "Node %d pruned certified EB #%d" (coerce @_ @Int nodeId) eb.id.num) $ pure ()
534537
traceWith tracer $ LeiosNodeEvent Pruned (EventEB eb)
535538
-- Continue with the next pipeline.
536539
go (succ p)
@@ -544,13 +547,14 @@ pruneExpiredUncertifiedEBs ::
544547
LeiosNodeConfig ->
545548
LeiosNodeState m ->
546549
m ()
547-
pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st = go (toEnum 0)
550+
pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{leios, slotConfig} st = go (toEnum 0)
548551
where
549552
go :: PipelineNo -> m ()
550553
go p = do
551-
let (endorseStart, endorseEnd) = endorseRange leios p
552-
let pruneTo = succ (lastVoteRecv leios p)
553-
_ <- waitNextSlot slotConfig pruneTo
554+
let (_, endorseEnd) = endorseRange leios p
555+
let endOfVoting = succ (lastVoteRecv leios p)
556+
let pruneTo = succ endorseEnd
557+
_ <- waitNextSlot slotConfig endOfVoting
554558
ebsPruned <-
555559
atomically $ do
556560
votesForEB <- readTVar st.votesForEBVar
@@ -559,10 +563,10 @@ pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st
559563
fmap (fmap snd . RB.values) . stateTVar st.relayEBState.relayBufferVar . RB.partition $ \ebEntry -> do
560564
let ebId = (fst ebEntry.value).id
561565
let ebSlot = (fst ebEntry.value).slot
562-
let ebInPipeline = endorseStart <= ebSlot && ebSlot <= endorseEnd
566+
let ebAlreadyVotedOn = ebSlot < pruneTo
563567
let ebNumVotes = maybe 0 (fromIntegral . sum . Map.elems) (Map.lookup ebId votesForEB)
564568
let ebCertified = ebNumVotes >= leios.votesForCertificate
565-
ebInPipeline && not ebCertified
569+
ebAlreadyVotedOn && not ebCertified
566570
-- Create set of EB ids to prune:
567571
let ebIdsToPrune = Set.fromList [eb.id | eb <- ebsPruned]
568572
-- Prune st.votesForEBVar for uncertified EBs in ebIdsToPrune:
@@ -575,7 +579,6 @@ pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st
575579
pure ebsPruned
576580
-- Emit trace events for pruning each EB
577581
for_ ebsPruned $ \eb -> do
578-
trace (printf "Node %d pruned uncertified EB #%d" (coerce @_ @Int nodeId) eb.id.num) $ pure ()
579582
traceWith tracer $ LeiosNodeEvent Pruned (EventEB eb)
580583
-- Continue with the next pipeline.
581584
go (succ p)

0 commit comments

Comments
 (0)