@@ -18,6 +18,7 @@ module Ouroboros.Consensus.Node.Genesis (
18
18
, mkGenesisConfig
19
19
-- * NodeKernel helpers
20
20
, GenesisNodeKernelArgs (.. )
21
+ , LoEAndGDDNodeKernelArgs (.. )
21
22
, mkGenesisNodeKernelArgs
22
23
, setGetLoEFragment
23
24
) where
@@ -54,7 +55,7 @@ data GenesisConfig = GenesisConfig
54
55
{ gcBlockFetchConfig :: ! GenesisBlockFetchConfiguration
55
56
, gcChainSyncLoPBucketConfig :: ! ChainSyncLoPBucketConfig
56
57
, gcCSJConfig :: ! CSJConfig
57
- , gcLoEAndGDDConfig :: ! (LoEAndGDDConfig () )
58
+ , gcLoEAndGDDConfig :: ! (LoEAndGDDConfig LoEAndGDDParams )
58
59
} deriving stock (Eq , Generic , Show )
59
60
60
61
-- | Genesis configuration flags and low-level args, as parsed from config file or CLI
@@ -66,6 +67,7 @@ data GenesisConfigFlags = GenesisConfigFlags
66
67
, gcfBucketCapacity :: Maybe Integer
67
68
, gcfBucketRate :: Maybe Integer
68
69
, gcfCSJJumpSize :: Maybe Integer
70
+ , gcfGDDRateLimit :: Maybe DiffTime
69
71
} deriving stock (Eq , Generic , Show )
70
72
71
73
defaultGenesisConfigFlags :: GenesisConfigFlags
@@ -77,6 +79,7 @@ defaultGenesisConfigFlags = GenesisConfigFlags
77
79
, gcfBucketCapacity = Nothing
78
80
, gcfBucketRate = Nothing
79
81
, gcfCSJJumpSize = Nothing
82
+ , gcfGDDRateLimit = Nothing
80
83
}
81
84
82
85
enableGenesisConfigDefault :: GenesisConfig
@@ -113,7 +116,7 @@ mkGenesisConfig (Just GenesisConfigFlags{..}) =
113
116
}
114
117
else CSJDisabled
115
118
, gcLoEAndGDDConfig = if gcfEnableLoEAndGDD
116
- then LoEAndGDDEnabled ()
119
+ then LoEAndGDDEnabled LoEAndGDDParams {lgpGDDRateLimit}
117
120
else LoEAndGDDDisabled
118
121
}
119
122
where
@@ -124,21 +127,34 @@ mkGenesisConfig (Just GenesisConfigFlags{..}) =
124
127
-- 3 * 2160 * 20 works in more recent ranges of slots, but causes syncing to
125
128
-- block in byron.
126
129
defaultCSJJumpSize = 2 * 2160
130
+ defaultGDDRateLimit = 1.0 -- seconds
127
131
128
132
gbfcBulkSyncGracePeriod = fromInteger $ fromMaybe defaultBulkSyncGracePeriod gcfBulkSyncGracePeriod
129
133
csbcCapacity = fromInteger $ fromMaybe defaultCapacity gcfBucketCapacity
130
134
csbcRate = fromInteger $ fromMaybe defaultRate gcfBucketRate
131
135
csjcJumpSize = fromInteger $ fromMaybe defaultCSJJumpSize gcfCSJJumpSize
136
+ lgpGDDRateLimit = fromMaybe defaultGDDRateLimit gcfGDDRateLimit
137
+
138
+ newtype LoEAndGDDParams = LoEAndGDDParams
139
+ { -- | How often to evaluate GDD. 0 means as soon as possible.
140
+ -- Otherwise, no faster than once every T seconds, where T is the
141
+ -- value of the field.
142
+ lgpGDDRateLimit :: DiffTime
143
+ } deriving stock (Eq , Generic , Show )
132
144
133
145
-- | Genesis-related arguments needed by the NodeKernel initialization logic.
134
146
data GenesisNodeKernelArgs m blk = GenesisNodeKernelArgs {
147
+ gnkaLoEAndGDDArgs :: ! (LoEAndGDDConfig (LoEAndGDDNodeKernelArgs m blk ))
148
+ }
149
+
150
+ data LoEAndGDDNodeKernelArgs m blk = LoEAndGDDNodeKernelArgs {
135
151
-- | A TVar containing an action that returns the 'ChainDB.GetLoEFragment'
136
152
-- action. We use this extra indirection to update this action after we
137
153
-- opened the ChainDB (which happens before we initialize the NodeKernel).
138
154
-- After that, this TVar will not be modified again.
139
- gnkaGetLoEFragment :: ! (LoEAndGDDConfig (StrictTVar m (ChainDB. GetLoEFragment m blk )))
155
+ lgnkaLoEFragmentTVar :: ! (StrictTVar m (ChainDB. GetLoEFragment m blk ))
156
+ , lgnkaGDDRateLimit :: DiffTime
140
157
}
141
-
142
158
-- | Create the initial 'GenesisNodeKernelArgs" (with a temporary
143
159
-- 'ChainDB.GetLoEFragment' that will be replaced via 'setGetLoEFragment') and a
144
160
-- function to update the 'ChainDbArgs' accordingly.
@@ -149,20 +165,24 @@ mkGenesisNodeKernelArgs ::
149
165
, Complete ChainDbArgs m blk -> Complete ChainDbArgs m blk
150
166
)
151
167
mkGenesisNodeKernelArgs gcfg = do
152
- gnkaGetLoEFragment <- for (gcLoEAndGDDConfig gcfg) $ \ () ->
153
- newTVarIO $ pure $
168
+ gnkaLoEAndGDDArgs <- for (gcLoEAndGDDConfig gcfg) $ \ p -> do
169
+ loeFragmentTVar <- newTVarIO $ pure $
154
170
-- Use the most conservative LoE fragment until 'setGetLoEFragment'
155
171
-- is called.
156
172
ChainDB. LoEEnabled $ AF. Empty AF. AnchorGenesis
157
- let updateChainDbArgs = case gnkaGetLoEFragment of
173
+ pure LoEAndGDDNodeKernelArgs
174
+ { lgnkaLoEFragmentTVar = loeFragmentTVar
175
+ , lgnkaGDDRateLimit = lgpGDDRateLimit p
176
+ }
177
+ let updateChainDbArgs = case gnkaLoEAndGDDArgs of
158
178
LoEAndGDDDisabled -> id
159
- LoEAndGDDEnabled varGetLoEFragment -> \ cfg ->
179
+ LoEAndGDDEnabled lgnkArgs -> \ cfg ->
160
180
cfg { ChainDB. cdbsArgs =
161
181
(ChainDB. cdbsArgs cfg) { ChainDB. cdbsLoE = getLoEFragment }
162
182
}
163
183
where
164
- getLoEFragment = join $ readTVarIO varGetLoEFragment
165
- pure (GenesisNodeKernelArgs {gnkaGetLoEFragment }, updateChainDbArgs)
184
+ getLoEFragment = join $ readTVarIO $ lgnkaLoEFragmentTVar lgnkArgs
185
+ pure (GenesisNodeKernelArgs {gnkaLoEAndGDDArgs }, updateChainDbArgs)
166
186
167
187
-- | Set 'gnkaGetLoEFragment' to the actual logic for determining the current
168
188
-- LoE fragment.
0 commit comments