@@ -37,7 +37,6 @@ import qualified Data.Set as Set
37
37
import qualified Data.Text as T
38
38
import Data.Traversable
39
39
import Data.Tuple (swap )
40
- import Debug.Trace (trace )
41
40
import LeiosProtocol.Common
42
41
import LeiosProtocol.Config
43
42
import LeiosProtocol.Relay
@@ -56,7 +55,6 @@ import qualified PraosProtocol.PraosNode as PraosNode
56
55
import STMCompat
57
56
import SimTypes (cpuTask )
58
57
import System.Random
59
- import Text.Printf (printf )
60
58
61
59
--------------------------------------------------------------
62
60
---- Events
@@ -282,21 +280,25 @@ relayEBConfig _tracer cfg@LeiosNodeConfig{leios = LeiosConfig{pipeline = (_ :: S
282
280
, submitBlocks = \ hbs t k ->
283
281
submitBlocks (map (first (. id )) hbs) t (k . map (\ (i, b) -> (RelayHeader i b. slot, b)))
284
282
, 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
300
302
}
301
303
302
304
relayVoteConfig ::
@@ -489,13 +491,14 @@ pruneExpiredUnadoptedEBs ::
489
491
LeiosNodeConfig ->
490
492
LeiosNodeState m ->
491
493
m ()
492
- pruneExpiredUnadoptedEBs tracer LeiosNodeConfig {nodeId, leios, slotConfig} st = go (toEnum 0 )
494
+ pruneExpiredUnadoptedEBs tracer LeiosNodeConfig {leios, slotConfig} st = go (toEnum 0 )
493
495
where
494
496
go :: PipelineNo -> m ()
495
497
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
499
502
chain <- atomically $ PraosNode. preferredChain st. praosState
500
503
let rbsOnChain = takeWhile (\ rb -> rb. blockHeader. headerSlot > endorseStart) . Chain. toNewestFirst $ chain
501
504
let ebIdsOnChain =
@@ -513,7 +516,7 @@ pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st =
513
516
RB. partition $ \ ebEntry -> do
514
517
let ebId = (snd ebEntry. value). id
515
518
let ebSlot = (fst ebEntry. value). slot
516
- let ebInPipeline = endorseStart <= ebSlot && ebSlot <= endorseEnd
519
+ let ebInPipeline = ebSlot `inRange` ebRange
517
520
let ebAdopted = ebId `Set.member` ebIdsOnChain
518
521
-- NOTE: pruneExpiredUnadoptedEBs runs long after pruneExpiredUncertifiedEBs,
519
522
-- hence any EB from pipeline p MUST be certified at this point
@@ -525,12 +528,12 @@ pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st =
525
528
-- Prune st.ibsNeededForEBVar for *certified* EBs in ebIdsToPrune:
526
529
modifyTVar' st. ibsNeededForEBVar (`Map.withoutKeys` ebIdsToPrune)
527
530
-- Update st.prunedUnadoptedEBStateToVar with the slot number pruned to.
531
+ -- TODO: Unused
528
532
writeTVar st. prunedUnadoptedEBStateToVar $! pruneTo
529
533
-- Return the pruned EBs.
530
534
pure ebsPruned
531
535
-- Emit trace events for pruning each EB
532
536
for_ ebsPruned $ \ eb -> do
533
- trace (printf " Node %d pruned certified EB #%d" (coerce @ _ @ Int nodeId) eb. id . num) $ pure ()
534
537
traceWith tracer $ LeiosNodeEvent Pruned (EventEB eb)
535
538
-- Continue with the next pipeline.
536
539
go (succ p)
@@ -544,13 +547,14 @@ pruneExpiredUncertifiedEBs ::
544
547
LeiosNodeConfig ->
545
548
LeiosNodeState m ->
546
549
m ()
547
- pruneExpiredUncertifiedEBs tracer LeiosNodeConfig {nodeId, leios, slotConfig} st = go (toEnum 0 )
550
+ pruneExpiredUncertifiedEBs tracer LeiosNodeConfig {leios, slotConfig} st = go (toEnum 0 )
548
551
where
549
552
go :: PipelineNo -> m ()
550
553
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
554
558
ebsPruned <-
555
559
atomically $ do
556
560
votesForEB <- readTVar st. votesForEBVar
@@ -559,10 +563,10 @@ pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st
559
563
fmap (fmap snd . RB. values) . stateTVar st. relayEBState. relayBufferVar . RB. partition $ \ ebEntry -> do
560
564
let ebId = (fst ebEntry. value). id
561
565
let ebSlot = (fst ebEntry. value). slot
562
- let ebInPipeline = endorseStart <= ebSlot && ebSlot <= endorseEnd
566
+ let ebAlreadyVotedOn = ebSlot < pruneTo
563
567
let ebNumVotes = maybe 0 (fromIntegral . sum . Map. elems) (Map. lookup ebId votesForEB)
564
568
let ebCertified = ebNumVotes >= leios. votesForCertificate
565
- ebInPipeline && not ebCertified
569
+ ebAlreadyVotedOn && not ebCertified
566
570
-- Create set of EB ids to prune:
567
571
let ebIdsToPrune = Set. fromList [eb. id | eb <- ebsPruned]
568
572
-- Prune st.votesForEBVar for uncertified EBs in ebIdsToPrune:
@@ -575,7 +579,6 @@ pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{nodeId, leios, slotConfig} st
575
579
pure ebsPruned
576
580
-- Emit trace events for pruning each EB
577
581
for_ ebsPruned $ \ eb -> do
578
- trace (printf " Node %d pruned uncertified EB #%d" (coerce @ _ @ Int nodeId) eb. id . num) $ pure ()
579
582
traceWith tracer $ LeiosNodeEvent Pruned (EventEB eb)
580
583
-- Continue with the next pipeline.
581
584
go (succ p)
0 commit comments