@@ -28,6 +28,7 @@ module Cardano.Node.Configuration.POM
2828where
2929
3030import Cardano.Crypto (RequiresNetworkMagic (.. ))
31+ import Cardano.Ledger.BaseTypes
3132import Cardano.Logging.Types
3233import Cardano.Network.ConsensusMode (ConsensusMode (.. ), defaultConsensusMode )
3334import qualified Cardano.Network.Diffusion.Configuration as Cardano
@@ -46,7 +47,9 @@ import Ouroboros.Consensus.Node.Genesis (GenesisConfig, GenesisConfigF
4647 defaultGenesisConfigFlags , mkGenesisConfig )
4748import Ouroboros.Consensus.Storage.LedgerDB.Args (QueryBatchSize (.. ))
4849import Ouroboros.Consensus.Storage.LedgerDB.Snapshots (NumOfDiskSnapshots (.. ),
49- SnapshotInterval (.. ))
50+ SnapshotDelayRange (.. ), SnapshotFrequency (.. ), SnapshotFrequencyArgs (.. ),
51+ SnapshotPolicyArgs (.. ), defaultSnapshotPolicyArgs )
52+ import Ouroboros.Consensus.Util.Args (OverrideOrDefault (.. ))
5053import Ouroboros.Consensus.Storage.LedgerDB.V1.Args (FlushFrequency (.. ))
5154import Ouroboros.Network.Diffusion.Configuration as Configuration
5255import qualified Ouroboros.Network.Diffusion.Configuration as Ouroboros
@@ -484,8 +487,14 @@ instance FromJSON PartialNodeConfiguration where
484487 Nothing -> return Nothing
485488
486489 parseLedgerDbConfig v = do
487- let snapInterval x = fmap (RequestedSnapshotInterval . secondsToDiffTime) <$> x .:? " SnapshotInterval"
488- snapNum x = fmap RequestedNumOfDiskSnapshots <$> x .:? " NumOfDiskSnapshots"
490+ -- TODO maybe don't silently convert old format (which was in seconds)
491+ -- to new format (which is in slots), despite these being the same on
492+ -- mainnet?
493+ let snapInterval x = do
494+ si <- x .:? " SnapshotInterval"
495+ when (any (<= 0 ) si) $ fail $ " Non-positive SnapshotInterval: " <> show si
496+ pure $ Override . SlotNo <$> si
497+ snapNum x = fmap (Override . NumOfDiskSnapshots ) <$> x .:? " NumOfDiskSnapshots"
489498
490499 mTopLevelSnapInterval <- snapInterval v
491500 mTopLevelSnapNum <- snapNum v
@@ -499,12 +508,48 @@ instance FromJSON PartialNodeConfiguration where
499508 mLedgerDB <- v .:? " LedgerDB"
500509 case mLedgerDB of
501510 Nothing -> do
502- let si = fromMaybe DefaultSnapshotInterval mTopLevelSnapInterval
503- sn = fromMaybe DefaultNumOfDiskSnapshots mTopLevelSnapNum
504- return $ Just $ LedgerDbConfiguration sn si DefaultQueryBatchSize V2InMemory deprecatedOpts
511+ let si = fromMaybe UseDefault mTopLevelSnapInterval
512+ sn = fromMaybe UseDefault mTopLevelSnapNum
513+ sf = SnapshotFrequencyArgs {
514+ sfaInterval = unsafeNonZero . unSlotNo <$> si
515+ , sfaOffset = UseDefault
516+ , sfaRateLimit = UseDefault
517+ , sfaDelaySnapshotRange = UseDefault
518+ }
519+ spArgs = SnapshotPolicyArgs (SnapshotFrequency sf) sn
520+ return $ Just $ LedgerDbConfiguration spArgs DefaultQueryBatchSize V2InMemory deprecatedOpts
505521 Just ledgerDB -> flip (withObject " LedgerDB" ) ledgerDB $ \ o -> do
506- ldbSnapInterval <- (getLast . (Last mTopLevelSnapInterval <> ) . Last <$> snapInterval o) .!= DefaultSnapshotInterval
507- ldbSnapNum <- (getLast . (Last mTopLevelSnapNum <> ) . Last <$> snapNum o) .!= DefaultNumOfDiskSnapshots
522+ -- Parse snapshot options from the "Snapshots" sub-object if present,
523+ -- otherwise fall back to the LedgerDB object for backward compatibility.
524+ let parseSnapshotOpts s = do
525+ sInterval <- (getLast . (Last mTopLevelSnapInterval <> ) . Last <$> snapInterval s) .!= UseDefault
526+ sNum <- (getLast . (Last mTopLevelSnapNum <> ) . Last <$> snapNum s) .!= UseDefault
527+ sOffset <- (fmap Override <$> s .:? " SlotOffset" ) .!= UseDefault
528+ sRateLimit <- (fmap (Override . secondsToDiffTime) <$> s .:? " RateLimit" ) .!= UseDefault
529+ sMinDelay <- s .:? " MinDelay"
530+ sMaxDelay <- s .:? " MaxDelay"
531+ sDelayRange <-
532+ case (sMinDelay, sMaxDelay) of
533+ (Just minDelay, Just maxDelay) ->
534+ if minDelay <= maxDelay then
535+ pure (Override (SnapshotDelayRange (secondsToDiffTime minDelay) (secondsToDiffTime maxDelay)))
536+ else fail $ " Invalid ledger snapshot delay range, MinDelay > MaxDelay: "
537+ <> show minDelay <> " > " <> show maxDelay
538+ -- use the default delay range if either min or max is unspecified
539+ _ -> pure UseDefault
540+ let sf = SnapshotFrequencyArgs {
541+ sfaInterval = unsafeNonZero . unSlotNo <$> sInterval
542+ , sfaOffset = sOffset
543+ , sfaRateLimit = sRateLimit
544+ , sfaDelaySnapshotRange = sDelayRange
545+ }
546+ pure $ SnapshotPolicyArgs (SnapshotFrequency sf) sNum
547+
548+ mSnapshotsVal <- o .:? " Snapshots"
549+ spArgs <- case mSnapshotsVal of
550+ Nothing -> parseSnapshotOpts o
551+ Just sv -> flip (withObject " Snapshots" ) sv parseSnapshotOpts
552+
508553 qsize <- (fmap RequestedQueryBatchSize <$> o .:? " QueryBatchSize" ) .!= DefaultQueryBatchSize
509554 backend <- o .:? " Backend" .!= " V2InMemory"
510555 selector <- case backend of
@@ -519,7 +564,7 @@ instance FromJSON PartialNodeConfiguration where
519564 lsmPath :: Maybe FilePath <- o .:? " LSMDatabasePath"
520565 pure $ V2LSM lsmPath
521566 _ -> fail $ " Malformed LedgerDB Backend: " <> backend
522- pure $ Just $ LedgerDbConfiguration ldbSnapNum ldbSnapInterval qsize selector deprecatedOpts
567+ pure $ Just $ LedgerDbConfiguration spArgs qsize selector deprecatedOpts
523568
524569 parseByronProtocol v = do
525570 primary <- v .:? " ByronGenesisFile"
@@ -683,8 +728,7 @@ defaultPartialNodeConfiguration =
683728 , pncLedgerDbConfig =
684729 Last $ Just $
685730 LedgerDbConfiguration
686- DefaultNumOfDiskSnapshots
687- DefaultSnapshotInterval
731+ defaultSnapshotPolicyArgs
688732 DefaultQueryBatchSize
689733 V2InMemory
690734 noDeprecatedOptions
0 commit comments