1
- {-# LANGUAGE BlockArguments #-}
2
1
{-# LANGUAGE CPP #-}
3
2
{-# LANGUAGE DataKinds #-}
4
3
{-# LANGUAGE FlexibleContexts #-}
@@ -13,23 +12,29 @@ module Cardano.Node.Tracing.Tracers.StartLeadershipCheck
13
12
) where
14
13
15
14
16
- import Cardano.Ledger.BaseTypes (StrictMaybe (.. ))
17
15
import Cardano.Logging
18
- import Cardano.Node.Queries (LedgerQueries (.. ), NodeKernelData (.. ))
19
- import Cardano.Slotting.Slot (fromWithOrigin )
16
+
17
+ import Control.Concurrent.STM (atomically )
18
+ import Data.IORef (readIORef )
19
+ import Data.Word (Word64 )
20
+
21
+ import qualified Ouroboros.Network.AnchoredFragment as AF
22
+ import Ouroboros.Network.Block (BlockNo (.. ), blockNo , unBlockNo )
23
+ import Ouroboros.Network.NodeToClient (LocalConnectionId )
24
+ import Ouroboros.Network.NodeToNode (RemoteAddress )
25
+
20
26
import Ouroboros.Consensus.Block (SlotNo (.. ))
21
27
import Ouroboros.Consensus.HardFork.Combinator
22
28
import Ouroboros.Consensus.Ledger.Abstract (IsLedger )
23
- import Ouroboros.Consensus.Ledger.Extended (ledgerState )
29
+ import Ouroboros.Consensus.Ledger.Extended (ExtLedgerState , ledgerState )
24
30
import Ouroboros.Consensus.Node (NodeKernel (.. ))
25
31
import Ouroboros.Consensus.Node.Tracers
26
32
import qualified Ouroboros.Consensus.Storage.ChainDB as ChainDB
27
- import qualified Ouroboros.Network.AnchoredFragment as AF
28
- import Ouroboros.Network.Block (BlockNo (.. ), blockNo , unBlockNo )
29
33
30
- import Control.Concurrent.STM (atomically )
31
- import Data.IORef (readIORef )
32
- import Data.Word (Word64 )
34
+ import Cardano.Node.Queries (LedgerQueries (.. ), NodeKernelData (.. ))
35
+ import Cardano.Slotting.Slot (fromWithOrigin )
36
+
37
+ import Cardano.Ledger.BaseTypes (StrictMaybe (.. ))
33
38
34
39
35
40
type ForgeTracerType blk = Either (TraceForgeEvent blk )
@@ -40,8 +45,6 @@ data TraceStartLeadershipCheckPlus =
40
45
tsSlotNo :: SlotNo
41
46
, tsUtxoSize :: Int
42
47
, tsDelegMapSize :: Int
43
- , tsDRepCount :: Int
44
- , tsDRepMapSize :: Int
45
48
, tsChainDensity :: Double
46
49
}
47
50
@@ -55,41 +58,47 @@ forgeTracerTransform ::
55
58
=> NodeKernelData blk
56
59
-> Trace IO (ForgeTracerType blk)
57
60
-> IO (Trace IO (ForgeTracerType blk))
58
- forgeTracerTransform (NodeKernelData ref) (Trace tr) =
59
- let secondM f (x, y) = do -- avoiding new dep on extra pkg
60
- y' <- f y
61
- pure (x, y')
62
- in contramapM (Trace tr) $ secondM
63
- \ case
64
- Right (Left slc@ (TraceStartLeadershipCheck tsSlotNo)) -> do
65
- query <- readIORef ref >>= traverse
66
- \ NodeKernel {getChainDB} -> do
67
- ledger <- fmap ledgerState . atomically $
68
- ChainDB. getCurrentLedger getChainDB
69
- chain <- atomically $ ChainDB. getCurrentChain getChainDB
70
- pure TraceStartLeadershipCheckPlus {
71
- tsSlotNo
72
- , tsUtxoSize = ledgerUtxoSize ledger
73
- , tsDelegMapSize = ledgerDelegMapSize ledger
74
- , tsDRepCount = ledgerDRepCount ledger
75
- , tsDRepMapSize = ledgerDRepMapSize ledger
76
- , tsChainDensity = fragmentChainDensity chain }
77
- pure . Right $ case query of
78
- SNothing -> Left slc
79
- SJust tslcp -> Right tslcp
80
- Right a ->
81
- pure $ Right a
82
- Left control ->
83
- pure $ Left control
61
+ forgeTracerTransform nodeKern (Trace tr) =
62
+ contramapM (Trace tr)
63
+ (\ case
64
+ (lc, Right (Left slc@ (TraceStartLeadershipCheck slotNo))) -> do
65
+ query <- mapNodeKernelDataIO
66
+ (\ nk ->
67
+ (,,)
68
+ <$> nkQueryLedger (ledgerUtxoSize . ledgerState) nk
69
+ <*> nkQueryLedger (ledgerDelegMapSize . ledgerState) nk
70
+ <*> nkQueryChain fragmentChainDensity nk)
71
+ nodeKern
72
+ case query of
73
+ SNothing -> pure (lc, Right (Left slc))
74
+ SJust (utxoSize, delegMapSize, chainDensity) ->
75
+ let msg = TraceStartLeadershipCheckPlus
76
+ slotNo
77
+ utxoSize
78
+ delegMapSize
79
+ (fromRational chainDensity)
80
+ in pure (lc, Right (Right msg))
81
+ (lc, Right a) ->
82
+ pure (lc, Right a)
83
+ (lc, Left control) ->
84
+ pure (lc, Left control))
85
+
86
+ nkQueryLedger ::
87
+ IsLedger (LedgerState blk )
88
+ => (ExtLedgerState blk -> a )
89
+ -> NodeKernel IO RemoteAddress LocalConnectionId blk
90
+ -> IO a
91
+ nkQueryLedger f NodeKernel {getChainDB} =
92
+ f <$> atomically (ChainDB. getCurrentLedger getChainDB)
84
93
85
94
fragmentChainDensity ::
86
95
#if __GLASGOW_HASKELL__ >= 906
87
96
(AF. HasHeader blk, AF. HasHeader (Header blk))
88
97
#else
89
98
AF. HasHeader (Header blk)
90
99
#endif
91
- => AF. AnchoredFragment (Header blk) -> Double
92
- fragmentChainDensity frag = fromRational $ calcDensity blockD slotD
100
+ => AF. AnchoredFragment (Header blk) -> Rational
101
+ fragmentChainDensity frag = calcDensity blockD slotD
93
102
where
94
103
calcDensity :: Word64 -> Word64 -> Rational
95
104
calcDensity bl sl
@@ -110,3 +119,18 @@ fragmentChainDensity frag = fromRational $ calcDensity blockD slotD
110
119
-- don't let it contribute to the number of blocks
111
120
Right 0 -> 1
112
121
Right b -> b
122
+
123
+ nkQueryChain ::
124
+ (AF. AnchoredFragment (Header blk ) -> a )
125
+ -> NodeKernel IO RemoteAddress LocalConnectionId blk
126
+ -> IO a
127
+ nkQueryChain f NodeKernel {getChainDB} =
128
+ f <$> atomically (ChainDB. getCurrentChain getChainDB)
129
+
130
+
131
+ mapNodeKernelDataIO ::
132
+ (NodeKernel IO RemoteAddress LocalConnectionId blk -> IO a )
133
+ -> NodeKernelData blk
134
+ -> IO (StrictMaybe a )
135
+ mapNodeKernelDataIO f (NodeKernelData ref) =
136
+ readIORef ref >>= traverse f
0 commit comments