@@ -77,6 +77,7 @@ data LeiosNodeEvent
77
77
= PraosNodeEvent ! (PraosNode. PraosNodeEvent RankingBlockBody )
78
78
| LeiosNodeEventCPU ! CPUTask
79
79
| LeiosNodeEvent ! BlockEvent ! LeiosEventBlock
80
+ | LeiosNodeEventLedgerState ! RankingBlockId
80
81
deriving (Show )
81
82
82
83
--------------------------------------------------------------
@@ -512,8 +513,8 @@ pruneExpiredUnadoptedEBs tracer LeiosNodeConfig{leios, slotConfig} st = go (toEn
512
513
-- Prune st.relayEBState.relayBufferVar for *certified* EBs in the current pipeline
513
514
-- which were not adopted as part of the chain, and return the set of pruned EBs:
514
515
ebsPruned <-
515
- fmap (fmap snd . RB. values) . stateTVar st. relayEBState. relayBufferVar $
516
- RB. partition $ \ ebEntry -> do
516
+ (fmap . fmap ) snd . partitionRBVar st. relayEBState. relayBufferVar $
517
+ \ ebEntry -> do
517
518
let ebId = (snd ebEntry. value). id
518
519
let ebSlot = (fst ebEntry. value). slot
519
520
let ebInPipeline = ebSlot `inRange` ebRange
@@ -559,8 +560,8 @@ pruneExpiredUncertifiedEBs tracer LeiosNodeConfig{leios, slotConfig} st = go (to
559
560
atomically $ do
560
561
votesForEB <- readTVar st. votesForEBVar
561
562
-- Prune st.relayEBState.relayBufferVar for EBs in pipeline p that did not become certified.
562
- ebsPruned <-
563
- fmap ( fmap snd . RB. values) . stateTVar st . relayEBState . relayBufferVar . RB. partition $ \ ebEntry -> do
563
+ ebsPruned <- ( fmap . fmap ) snd . partitionRBVar st . relayEBState . relayBufferVar $
564
+ \ ebEntry -> do
564
565
let ebId = (fst ebEntry. value). id
565
566
let ebSlot = (fst ebEntry. value). slot
566
567
let ebAlreadyVotedOn = ebSlot < pruneTo
@@ -591,20 +592,22 @@ pruneExpiredVotes ::
591
592
LeiosNodeConfig ->
592
593
LeiosNodeState m ->
593
594
m ()
594
- pruneExpiredVotes _tracer LeiosNodeConfig {leios = leios@ LeiosConfig {pipeline = _ :: SingPipeline p }, slotConfig } st = go (toEnum 0 )
595
+ pruneExpiredVotes tracer LeiosNodeConfig {leios = leios@ LeiosConfig {pipeline = _ :: SingPipeline p }, slotConfig } st = go (toEnum 0 )
595
596
where
596
597
go p = do
597
598
let pruneIBDeliveryTo = succ $ snd (stageRangeOf @ p leios p Short. Propose )
598
599
let pruneTo = succ (lastVoteSend leios p)
599
600
_ <- waitNextSlot slotConfig (succ (lastVoteRecv leios p))
600
- atomically $ do
601
- modifyTVar' st. relayVoteState. relayBufferVar $
602
- RB. filter $ \ voteEntry ->
603
- let voteSlot = (snd voteEntry. value). slot
604
- in voteSlot >= pruneTo
601
+ votesPruned <- atomically $ do
605
602
writeTVar st. prunedVoteStateToVar $! pruneTo
606
603
-- delivery times for IBs are only needed to vote, so they can be pruned too.
607
604
modifyTVar' st. ibDeliveryTimesVar $ Map. filter $ \ (slot, _) -> slot >= pruneIBDeliveryTo
605
+ partitionRBVar st. relayVoteState. relayBufferVar $
606
+ \ voteEntry ->
607
+ let voteSlot = (snd voteEntry. value). slot
608
+ in voteSlot < pruneTo
609
+ for_ votesPruned $ \ vt -> do
610
+ traceWith tracer $ LeiosNodeEvent Pruned (EventVote $ snd vt)
608
611
go (succ p)
609
612
610
613
computeLedgerStateThread ::
@@ -614,8 +617,8 @@ computeLedgerStateThread ::
614
617
LeiosNodeConfig ->
615
618
LeiosNodeState m ->
616
619
m ()
617
- computeLedgerStateThread _tracer _cfg st = forever $ do
618
- _readyLedgerState <- atomically $ do
620
+ computeLedgerStateThread tracer _cfg st = forever $ do
621
+ readyLedgerState <- atomically $ do
619
622
-- TODO: this will get more costly as the base chain grows,
620
623
-- however it grows much more slowly than anything else.
621
624
blocks <- readTVar st. praosState. blockFetchControllerState. blocksVar
@@ -639,7 +642,8 @@ computeLedgerStateThread _tracer _cfg st = forever $ do
639
642
when (null readyLedgerState) retry
640
643
modifyTVar' st. ledgerStateVar (`Map.union` Map. fromList readyLedgerState)
641
644
return readyLedgerState
642
- -- TODO? trace readyLedgerState
645
+ for_ readyLedgerState $ \ (rb, _) -> do
646
+ traceWith tracer (LeiosNodeEventLedgerState rb)
643
647
return ()
644
648
645
649
adoptIB :: MonadSTM m => LeiosNodeState m -> InputBlock -> UTCTime -> STM m ()
@@ -720,19 +724,19 @@ dispatchValidation tracer cfg leiosState req =
720
724
then leiosState. waitingForRBVar
721
725
-- TODO: assumes payload can be validated without content of EB, check with spec.
722
726
else leiosState. waitingForLedgerStateVar
723
- modifyTVar' var $ Map. insertWith (++) prev [queue [task]]
727
+ waitFor var [( prev, [queue [task]]) ]
724
728
return []
725
729
ValidateIBS ibs deliveryTime completion -> do
726
730
-- NOTE: IBs with an RB reference have to wait for ledger state of that RB.
727
731
let waitingLedgerState =
728
- Map. fromListWith
729
- (++)
730
- [ (rbHash, [queue [valIB ib deliveryTime completion]])
731
- | ib <- ibs
732
- , BlockHash rbHash <- [(fst ib). rankingBlock]
733
- ]
732
+ [ (rbHash, [queue [valIB ib deliveryTime completion]])
733
+ | ib <- ibs
734
+ , BlockHash rbHash <- [(fst ib). rankingBlock]
735
+ ]
734
736
735
- modifyTVar' leiosState. waitingForLedgerStateVar (`Map.union` waitingLedgerState)
737
+ waitFor
738
+ leiosState. waitingForLedgerStateVar
739
+ waitingLedgerState
736
740
737
741
return [valIB ib deliveryTime completion | ib@ (h, _) <- ibs, GenesisHash <- [h. rankingBlock]]
738
742
ValidateEBS ebs completion -> do
@@ -894,3 +898,22 @@ mkSchedule cfg = do
894
898
pickFromRanges rng0 rs = snd $ mapAccumL f rng0 rs
895
899
where
896
900
f rng r = coerce $ swap $ uniformR (coerce r :: (Word64 , Word64 )) rng
901
+
902
+ -- * Utils
903
+
904
+ partitionRBVar ::
905
+ (Ord key , MonadSTM m ) =>
906
+ TVar m (RB. RelayBuffer key value ) ->
907
+ (RB. EntryWithTicket key value -> Bool ) ->
908
+ STM m [value ]
909
+ partitionRBVar var f = fmap RB. values . stateTVar' var $ RB. partition f
910
+
911
+ waitFor ::
912
+ MonadSTM m =>
913
+ TVar m (Map RankingBlockId [STM m () ]) ->
914
+ [(RankingBlockId , [STM m () ])] ->
915
+ STM m ()
916
+ waitFor var xs = do
917
+ modifyTVar'
918
+ var
919
+ (flip (Map. unionWith (++) ) $ Map. fromListWith (++) xs)
0 commit comments