@@ -18,6 +18,7 @@ module Ouroboros.Consensus.Node.Genesis (
1818 , mkGenesisConfig
1919 -- * NodeKernel helpers
2020 , GenesisNodeKernelArgs (.. )
21+ , LoEAndGDDNodeKernelArgs (.. )
2122 , mkGenesisNodeKernelArgs
2223 , setGetLoEFragment
2324 ) where
@@ -59,7 +60,7 @@ data GenesisConfig = GenesisConfig
5960 { gcBlockFetchConfig :: ! GenesisBlockFetchConfiguration
6061 , gcChainSyncLoPBucketConfig :: ! ChainSyncLoPBucketConfig
6162 , gcCSJConfig :: ! CSJConfig
62- , gcLoEAndGDDConfig :: ! (LoEAndGDDConfig () )
63+ , gcLoEAndGDDConfig :: ! (LoEAndGDDConfig LoEAndGDDParams )
6364 , gcHistoricityCutoff :: ! (Maybe HistoricityCutoff )
6465 } deriving stock (Eq , Generic , Show )
6566
@@ -72,6 +73,7 @@ data GenesisConfigFlags = GenesisConfigFlags
7273 , gcfBucketCapacity :: Maybe Integer
7374 , gcfBucketRate :: Maybe Integer
7475 , gcfCSJJumpSize :: Maybe Integer
76+ , gcfGDDRateLimit :: Maybe DiffTime
7577 } deriving stock (Eq , Generic , Show )
7678
7779defaultGenesisConfigFlags :: GenesisConfigFlags
@@ -83,6 +85,7 @@ defaultGenesisConfigFlags = GenesisConfigFlags
8385 , gcfBucketCapacity = Nothing
8486 , gcfBucketRate = Nothing
8587 , gcfCSJJumpSize = Nothing
88+ , gcfGDDRateLimit = Nothing
8689 }
8790
8891enableGenesisConfigDefault :: GenesisConfig
@@ -120,7 +123,7 @@ mkGenesisConfig (Just GenesisConfigFlags{..}) =
120123 }
121124 else CSJDisabled
122125 , gcLoEAndGDDConfig = if gcfEnableLoEAndGDD
123- then LoEAndGDDEnabled ()
126+ then LoEAndGDDEnabled LoEAndGDDParams {lgpGDDRateLimit}
124127 else LoEAndGDDDisabled
125128 , -- Duration in seconds of one Cardano mainnet Shelley stability window
126129 -- (3k/f slots times one second per slot) plus one extra hour as a
@@ -147,20 +150,35 @@ mkGenesisConfig (Just GenesisConfigFlags{..}) =
147150 -- eras.
148151 defaultCSJJumpSize = 2 * 2160 -- Byron forecast range
149152
153+ -- Limiting the performance impact of the GDD.
154+ defaultGDDRateLimit = 1.0 -- seconds
155+
150156 gbfcBulkSyncGracePeriod = fromInteger $ fromMaybe defaultBulkSyncGracePeriod gcfBulkSyncGracePeriod
151157 csbcCapacity = fromInteger $ fromMaybe defaultCapacity gcfBucketCapacity
152158 csbcRate = fromInteger $ fromMaybe defaultRate gcfBucketRate
153159 csjcJumpSize = fromInteger $ fromMaybe defaultCSJJumpSize gcfCSJJumpSize
160+ lgpGDDRateLimit = fromMaybe defaultGDDRateLimit gcfGDDRateLimit
161+
162+ newtype LoEAndGDDParams = LoEAndGDDParams
163+ { -- | How often to evaluate GDD. 0 means as soon as possible.
164+ -- Otherwise, no faster than once every T seconds, where T is the
165+ -- value of the field.
166+ lgpGDDRateLimit :: DiffTime
167+ } deriving stock (Eq , Generic , Show )
154168
155169-- | Genesis-related arguments needed by the NodeKernel initialization logic.
156170data GenesisNodeKernelArgs m blk = GenesisNodeKernelArgs {
171+ gnkaLoEAndGDDArgs :: ! (LoEAndGDDConfig (LoEAndGDDNodeKernelArgs m blk ))
172+ }
173+
174+ data LoEAndGDDNodeKernelArgs m blk = LoEAndGDDNodeKernelArgs {
157175 -- | A TVar containing an action that returns the 'ChainDB.GetLoEFragment'
158176 -- action. We use this extra indirection to update this action after we
159177 -- opened the ChainDB (which happens before we initialize the NodeKernel).
160178 -- After that, this TVar will not be modified again.
161- gnkaGetLoEFragment :: ! (LoEAndGDDConfig (StrictTVar m (ChainDB. GetLoEFragment m blk )))
179+ lgnkaLoEFragmentTVar :: ! (StrictTVar m (ChainDB. GetLoEFragment m blk ))
180+ , lgnkaGDDRateLimit :: DiffTime
162181 }
163-
164182-- | Create the initial 'GenesisNodeKernelArgs" (with a temporary
165183-- 'ChainDB.GetLoEFragment' that will be replaced via 'setGetLoEFragment') and a
166184-- function to update the 'ChainDbArgs' accordingly.
@@ -171,20 +189,24 @@ mkGenesisNodeKernelArgs ::
171189 , Complete ChainDbArgs m blk -> Complete ChainDbArgs m blk
172190 )
173191mkGenesisNodeKernelArgs gcfg = do
174- gnkaGetLoEFragment <- for (gcLoEAndGDDConfig gcfg) $ \ () ->
175- newTVarIO $ pure $
192+ gnkaLoEAndGDDArgs <- for (gcLoEAndGDDConfig gcfg) $ \ p -> do
193+ loeFragmentTVar <- newTVarIO $ pure $
176194 -- Use the most conservative LoE fragment until 'setGetLoEFragment'
177195 -- is called.
178196 ChainDB. LoEEnabled $ AF. Empty AF. AnchorGenesis
179- let updateChainDbArgs = case gnkaGetLoEFragment of
197+ pure LoEAndGDDNodeKernelArgs
198+ { lgnkaLoEFragmentTVar = loeFragmentTVar
199+ , lgnkaGDDRateLimit = lgpGDDRateLimit p
200+ }
201+ let updateChainDbArgs = case gnkaLoEAndGDDArgs of
180202 LoEAndGDDDisabled -> id
181- LoEAndGDDEnabled varGetLoEFragment -> \ cfg ->
203+ LoEAndGDDEnabled lgnkArgs -> \ cfg ->
182204 cfg { ChainDB. cdbsArgs =
183205 (ChainDB. cdbsArgs cfg) { ChainDB. cdbsLoE = getLoEFragment }
184206 }
185207 where
186- getLoEFragment = join $ readTVarIO varGetLoEFragment
187- pure (GenesisNodeKernelArgs {gnkaGetLoEFragment }, updateChainDbArgs)
208+ getLoEFragment = join $ readTVarIO $ lgnkaLoEFragmentTVar lgnkArgs
209+ pure (GenesisNodeKernelArgs {gnkaLoEAndGDDArgs }, updateChainDbArgs)
188210
189211-- | Set 'gnkaGetLoEFragment' to the actual logic for determining the current
190212-- LoE fragment.
0 commit comments