{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE RecordWildCards #-}
module Ouroboros.Consensus.Storage.LedgerDB.DiskPolicy (
DiskPolicy(..)
, defaultDiskPolicy
) where
import Data.Time.Clock (secondsToDiffTime)
import Data.Word
import NoThunks.Class (NoThunks, OnlyCheckWhnf (..))
import Control.Monad.Class.MonadTime
import Ouroboros.Consensus.Config.SecurityParam
data DiskPolicy = DiskPolicy {
DiskPolicy -> Word
onDiskNumSnapshots :: Word
, DiskPolicy -> Maybe DiffTime -> Word64 -> Bool
onDiskShouldTakeSnapshot :: Maybe DiffTime -> Word64 -> Bool
}
deriving Context -> DiskPolicy -> IO (Maybe ThunkInfo)
Proxy DiskPolicy -> String
(Context -> DiskPolicy -> IO (Maybe ThunkInfo))
-> (Context -> DiskPolicy -> IO (Maybe ThunkInfo))
-> (Proxy DiskPolicy -> String)
-> NoThunks DiskPolicy
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
showTypeOf :: Proxy DiskPolicy -> String
$cshowTypeOf :: Proxy DiskPolicy -> String
wNoThunks :: Context -> DiskPolicy -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> DiskPolicy -> IO (Maybe ThunkInfo)
noThunks :: Context -> DiskPolicy -> IO (Maybe ThunkInfo)
$cnoThunks :: Context -> DiskPolicy -> IO (Maybe ThunkInfo)
NoThunks via OnlyCheckWhnf DiskPolicy
defaultDiskPolicy :: SecurityParam -> DiskPolicy
defaultDiskPolicy :: SecurityParam -> DiskPolicy
defaultDiskPolicy (SecurityParam Word64
k) = DiskPolicy :: Word -> (Maybe DiffTime -> Word64 -> Bool) -> DiskPolicy
DiskPolicy {Word
Maybe DiffTime -> Word64 -> Bool
onDiskShouldTakeSnapshot :: Maybe DiffTime -> Word64 -> Bool
onDiskNumSnapshots :: Word
onDiskShouldTakeSnapshot :: Maybe DiffTime -> Word64 -> Bool
onDiskNumSnapshots :: Word
..}
where
onDiskNumSnapshots :: Word
onDiskNumSnapshots :: Word
onDiskNumSnapshots = Word
2
onDiskShouldTakeSnapshot :: Maybe DiffTime -> Word64 -> Bool
onDiskShouldTakeSnapshot :: Maybe DiffTime -> Word64 -> Bool
onDiskShouldTakeSnapshot (Just DiffTime
timeSinceLast) Word64
blocksSinceLast =
DiffTime
timeSinceLast DiffTime -> DiffTime -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer -> DiffTime
secondsToDiffTime (Word64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
k Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
2))
Bool -> Bool -> Bool
|| ( Word64
blocksSinceLast Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word64
50_000
Bool -> Bool -> Bool
&& DiffTime
timeSinceLast DiffTime -> DiffTime -> Bool
forall a. Ord a => a -> a -> Bool
> DiffTime
6 DiffTime -> DiffTime -> DiffTime
forall a. Num a => a -> a -> a
* Integer -> DiffTime
secondsToDiffTime Integer
60)
onDiskShouldTakeSnapshot Maybe DiffTime
Nothing Word64
blocksSinceLast =
Word64
blocksSinceLast Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word64
k