{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Ouroboros.Consensus.Storage.LedgerDB.V1.DbChangelog
(
DbChangelog (..)
, DbChangelog'
, empty
, pruneToImmTipOnly
, reapplyThenPush
, withKeysReadSets
, KeySetsReader
, UnforwardedReadSets (..)
, readKeySets
, readKeySetsWith
, trivialKeySetsReader
, RewindReadFwdError (..)
, forwardTableKeySets
, forwardTableKeySets'
, DiffsToFlush (..)
, splitForFlushing
, anchor
, current
, flushableLength
, getPastLedgerAt
, rollback
, snapshots
, tip
, volatileStatesBimap
, extend
, immutableTipSlot
, isSaturated
, maxRollback
, prune
, rollbackN
, rollbackToAnchor
, rollbackToPoint
, reapplyThenPush'
, reapplyThenPushMany'
, switch
, switch'
) where
import Cardano.Ledger.BaseTypes
import Cardano.Slotting.Slot
import Control.Exception as Exn
import Data.Bifunctor (bimap)
import Data.Functor.Identity
import Data.Map.Diff.Strict as AntiDiff (applyDiffForKeys)
import Data.SOP (K, unK)
import Data.SOP.Functors
import Data.Word
import GHC.Generics (Generic)
import Ouroboros.Consensus.Block
import Ouroboros.Consensus.Config
import Ouroboros.Consensus.Ledger.Abstract
import Ouroboros.Consensus.Ledger.Extended
import Ouroboros.Consensus.Ledger.Tables.Utils
import Ouroboros.Consensus.Storage.LedgerDB.API
import Ouroboros.Consensus.Storage.LedgerDB.Forker
import Ouroboros.Consensus.Storage.LedgerDB.V1.BackingStore.API
import qualified Ouroboros.Consensus.Storage.LedgerDB.V1.DiffSeq as DS
import Ouroboros.Consensus.Util (repeatedlyM)
import Ouroboros.Consensus.Util.IOLike
import Ouroboros.Network.AnchoredSeq (AnchoredSeq)
import qualified Ouroboros.Network.AnchoredSeq as AS
data DbChangelog l = DbChangelog
{ forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState :: !(l EmptyMK)
, forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs :: !(LedgerTables l SeqDiffMK)
, forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates ::
!( AnchoredSeq
(WithOrigin SlotNo)
(l EmptyMK)
(l EmptyMK)
)
}
deriving (forall x. DbChangelog l -> Rep (DbChangelog l) x)
-> (forall x. Rep (DbChangelog l) x -> DbChangelog l)
-> Generic (DbChangelog l)
forall x. Rep (DbChangelog l) x -> DbChangelog l
forall x. DbChangelog l -> Rep (DbChangelog l) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (l :: (* -> * -> *) -> *) x.
Rep (DbChangelog l) x -> DbChangelog l
forall (l :: (* -> * -> *) -> *) x.
DbChangelog l -> Rep (DbChangelog l) x
$cfrom :: forall (l :: (* -> * -> *) -> *) x.
DbChangelog l -> Rep (DbChangelog l) x
from :: forall x. DbChangelog l -> Rep (DbChangelog l) x
$cto :: forall (l :: (* -> * -> *) -> *) x.
Rep (DbChangelog l) x -> DbChangelog l
to :: forall x. Rep (DbChangelog l) x -> DbChangelog l
Generic
deriving instance
(Eq (TxIn l), Eq (TxOut l), Eq (l EmptyMK)) =>
Eq (DbChangelog l)
deriving instance
(NoThunks (TxIn l), NoThunks (TxOut l), NoThunks (l EmptyMK)) =>
NoThunks (DbChangelog l)
deriving instance
(Show (TxIn l), Show (TxOut l), Show (l EmptyMK)) =>
Show (DbChangelog l)
type DbChangelog' blk = DbChangelog (ExtLedgerState blk)
instance GetTip l => AS.Anchorable (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) where
asAnchor :: l EmptyMK -> l EmptyMK
asAnchor = l EmptyMK -> l EmptyMK
forall a. a -> a
id
getAnchorMeasure :: Proxy (l EmptyMK) -> l EmptyMK -> WithOrigin SlotNo
getAnchorMeasure Proxy (l EmptyMK)
_ = l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot
instance IsLedger l => GetTip (K (DbChangelog l)) where
getTip :: forall (mk :: * -> * -> *).
K (DbChangelog l) mk -> Point (K (DbChangelog l))
getTip =
Point l -> Point (K (DbChangelog l))
forall {k1} {k2} (b :: k1) (b' :: k2).
Coercible (HeaderHash b) (HeaderHash b') =>
Point b -> Point b'
castPoint
(Point l -> Point (K (DbChangelog l)))
-> (K (DbChangelog l) mk -> Point l)
-> K (DbChangelog l) mk
-> Point (K (DbChangelog l))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. l EmptyMK -> Point l
forall (mk :: * -> * -> *). l mk -> Point l
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> Point l
getTip
(l EmptyMK -> Point l)
-> (K (DbChangelog l) mk -> l EmptyMK)
-> K (DbChangelog l) mk
-> Point l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (l EmptyMK -> l EmptyMK)
-> (l EmptyMK -> l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either l EmptyMK -> l EmptyMK
forall a. a -> a
id l EmptyMK -> l EmptyMK
forall a. a -> a
id
(Either (l EmptyMK) (l EmptyMK) -> l EmptyMK)
-> (K (DbChangelog l) mk -> Either (l EmptyMK) (l EmptyMK))
-> K (DbChangelog l) mk
-> l EmptyMK
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK)
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Either a b
AS.head
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK))
-> (K (DbChangelog l) mk
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> K (DbChangelog l) mk
-> Either (l EmptyMK) (l EmptyMK)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
(DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> (K (DbChangelog l) mk -> DbChangelog l)
-> K (DbChangelog l) mk
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. K (DbChangelog l) mk -> DbChangelog l
forall {k} a (b :: k). K a b -> a
unK
type instance
(K @MapKind (DbChangelog l)) =
HeaderHash l
empty ::
(HasLedgerTables l, GetTip l) =>
l EmptyMK -> DbChangelog l
empty :: forall (l :: (* -> * -> *) -> *).
(HasLedgerTables l, GetTip l) =>
l EmptyMK -> DbChangelog l
empty l EmptyMK
theAnchor =
DbChangelog
{ changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState = l EmptyMK
theAnchor
, changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs = (forall k v. LedgerTableConstraints' l k v => SeqDiffMK k v)
-> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk k v)
-> LedgerTables l mk
ltpure (DiffSeq k v -> SeqDiffMK k v
forall k v. DiffSeq k v -> SeqDiffMK k v
SeqDiffMK DiffSeq k v
forall k v. (Ord k, Eq v) => DiffSeq k v
DS.empty)
, changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates = l EmptyMK
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall v a b. Anchorable v a b => a -> AnchoredSeq v a b
AS.Empty l EmptyMK
theAnchor
}
reapplyBlock ::
forall m l blk.
(ApplyBlock l blk, Monad m) =>
ComputeLedgerEvents ->
LedgerCfg l ->
blk ->
KeySetsReader m l ->
DbChangelog l ->
m (l DiffMK)
reapplyBlock :: forall (m :: * -> *) (l :: (* -> * -> *) -> *) blk.
(ApplyBlock l blk, Monad m) =>
ComputeLedgerEvents
-> LedgerCfg l
-> blk
-> KeySetsReader m l
-> DbChangelog l
-> m (l DiffMK)
reapplyBlock ComputeLedgerEvents
evs LedgerCfg l
cfg blk
b KeySetsReader m l
ksReader DbChangelog l
db =
l EmptyMK
-> KeySetsReader m l
-> DbChangelog l
-> LedgerTables l KeysMK
-> (l ValuesMK -> m (l DiffMK))
-> m (l DiffMK)
forall (l :: (* -> * -> *) -> *) (m :: * -> *) a.
(HasLedgerTables l, Monad m, GetTip l) =>
l EmptyMK
-> KeySetsReader m l
-> DbChangelog l
-> LedgerTables l KeysMK
-> (l ValuesMK -> m a)
-> m a
withKeysReadSets (DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> l EmptyMK
current DbChangelog l
db) KeySetsReader m l
ksReader DbChangelog l
db (blk -> LedgerTables l KeysMK
forall (l :: (* -> * -> *) -> *) blk.
ApplyBlock l blk =>
blk -> LedgerTables l KeysMK
getBlockKeySets blk
b) (l DiffMK -> m (l DiffMK)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (l DiffMK -> m (l DiffMK))
-> (l ValuesMK -> l DiffMK) -> l ValuesMK -> m (l DiffMK)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ComputeLedgerEvents -> LedgerCfg l -> blk -> l ValuesMK -> l DiffMK
forall (l :: (* -> * -> *) -> *) blk.
ApplyBlock l blk =>
ComputeLedgerEvents -> LedgerCfg l -> blk -> l ValuesMK -> l DiffMK
tickThenReapply ComputeLedgerEvents
evs LedgerCfg l
cfg blk
b)
reapplyThenPush ::
(Monad m, ApplyBlock l blk) =>
LedgerDbCfg l ->
blk ->
KeySetsReader m l ->
DbChangelog l ->
m (DbChangelog l)
reapplyThenPush :: forall (m :: * -> *) (l :: (* -> * -> *) -> *) blk.
(Monad m, ApplyBlock l blk) =>
LedgerDbCfg l
-> blk -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
reapplyThenPush LedgerDbCfg l
cfg blk
ap KeySetsReader m l
ksReader DbChangelog l
db =
(\l DiffMK
current' -> LedgerDbPrune -> DbChangelog l -> DbChangelog l
forall (l :: (* -> * -> *) -> *).
GetTip l =>
LedgerDbPrune -> DbChangelog l -> DbChangelog l
prune (SecurityParam -> LedgerDbPrune
LedgerDbPruneKeeping (LedgerDbCfg l -> HKD Identity SecurityParam
forall (f :: * -> *) (l :: (* -> * -> *) -> *).
LedgerDbCfgF f l -> HKD f SecurityParam
ledgerDbCfgSecParam LedgerDbCfg l
cfg)) (DbChangelog l -> DbChangelog l) -> DbChangelog l -> DbChangelog l
forall a b. (a -> b) -> a -> b
$ l DiffMK -> DbChangelog l -> DbChangelog l
forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
l DiffMK -> DbChangelog l -> DbChangelog l
extend l DiffMK
current' DbChangelog l
db)
(l DiffMK -> DbChangelog l) -> m (l DiffMK) -> m (DbChangelog l)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ComputeLedgerEvents
-> LedgerCfg l
-> blk
-> KeySetsReader m l
-> DbChangelog l
-> m (l DiffMK)
forall (m :: * -> *) (l :: (* -> * -> *) -> *) blk.
(ApplyBlock l blk, Monad m) =>
ComputeLedgerEvents
-> LedgerCfg l
-> blk
-> KeySetsReader m l
-> DbChangelog l
-> m (l DiffMK)
reapplyBlock (LedgerDbCfg l -> ComputeLedgerEvents
forall (f :: * -> *) (l :: (* -> * -> *) -> *).
LedgerDbCfgF f l -> ComputeLedgerEvents
ledgerDbCfgComputeLedgerEvents LedgerDbCfg l
cfg) (LedgerDbCfg l -> HKD Identity (LedgerCfg l)
forall (f :: * -> *) (l :: (* -> * -> *) -> *).
LedgerDbCfgF f l -> HKD f (LedgerCfg l)
ledgerDbCfg LedgerDbCfg l
cfg) blk
ap KeySetsReader m l
ksReader DbChangelog l
db
prune ::
GetTip l =>
LedgerDbPrune ->
DbChangelog l ->
DbChangelog l
prune :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
LedgerDbPrune -> DbChangelog l -> DbChangelog l
prune (LedgerDbPruneKeeping (SecurityParam NonZero Word64
k)) DbChangelog l
dblog =
DbChangelog l
dblog{changelogStates = vol'}
where
DbChangelog{AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates} = DbChangelog l
dblog
nvol :: Int
nvol = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
vol' :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
vol' =
if Int -> Word64
forall a. Enum a => Int -> a
toEnum Int
nvol Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
<= NonZero Word64 -> Word64
forall a. NonZero a -> a
unNonZero NonZero Word64
k
then AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
else (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall a b. (a, b) -> b
snd ((AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall a b. (a -> b) -> a -> b
$ Int
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
forall v a b.
Anchorable v a b =>
Int -> AnchoredSeq v a b -> (AnchoredSeq v a b, AnchoredSeq v a b)
AS.splitAt (Int
nvol Int -> Int -> Int
forall a. Num a => a -> a -> a
- Word64 -> Int
forall a. Enum a => a -> Int
fromEnum (NonZero Word64 -> Word64
forall a. NonZero a -> a
unNonZero NonZero Word64
k)) AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
prune LedgerDbPrune
LedgerDbPruneAll DbChangelog l
dblog =
DbChangelog l
dblog{changelogStates = vol'}
where
DbChangelog{AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates} = DbChangelog l
dblog
nvol :: Int
nvol = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
vol' :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
vol' =
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall a b. (a, b) -> b
snd ((AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall a b. (a -> b) -> a -> b
$ Int
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK),
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
forall v a b.
Anchorable v a b =>
Int -> AnchoredSeq v a b -> (AnchoredSeq v a b, AnchoredSeq v a b)
AS.splitAt Int
nvol AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
{-# INLINE prune #-}
extend ::
(GetTip l, HasLedgerTables l) =>
l DiffMK ->
DbChangelog l ->
DbChangelog l
extend :: forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
l DiffMK -> DbChangelog l -> DbChangelog l
extend l DiffMK
newState DbChangelog l
dblog =
DbChangelog
{ changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState = l EmptyMK
changelogLastFlushedState
, changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs = (forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> DiffMK k v -> SeqDiffMK k v)
-> LedgerTables l SeqDiffMK
-> LedgerTables l DiffMK
-> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *) (mk3 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v.
LedgerTableConstraints' l k v =>
mk1 k v -> mk2 k v -> mk3 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2 -> LedgerTables l mk3
ltliftA2 SeqDiffMK k v -> DiffMK k v -> SeqDiffMK k v
forall k v.
(Ord k, Eq v) =>
SeqDiffMK k v -> DiffMK k v -> SeqDiffMK k v
forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> DiffMK k v -> SeqDiffMK k v
ext LedgerTables l SeqDiffMK
changelogDiffs LedgerTables l DiffMK
tablesDiff
, changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall v a b.
Anchorable v a b =>
AnchoredSeq v a b -> b -> AnchoredSeq v a b
AS.:> l EmptyMK
l'
}
where
slot :: SlotNo
slot = case l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot l EmptyMK
l' of
WithOrigin SlotNo
Origin -> String -> SlotNo
forall a. HasCallStack => String -> a
error String
"impossible! extending a DbChangelog with a state at Origin"
At SlotNo
s -> SlotNo
s
ext ::
(Ord k, Eq v) =>
SeqDiffMK k v ->
DiffMK k v ->
SeqDiffMK k v
ext :: forall k v.
(Ord k, Eq v) =>
SeqDiffMK k v -> DiffMK k v -> SeqDiffMK k v
ext (SeqDiffMK DiffSeq k v
sq) (DiffMK Diff k v
d) =
DiffSeq k v -> SeqDiffMK k v
forall k v. DiffSeq k v -> SeqDiffMK k v
SeqDiffMK (DiffSeq k v -> SeqDiffMK k v) -> DiffSeq k v -> SeqDiffMK k v
forall a b. (a -> b) -> a -> b
$ DiffSeq k v -> SlotNo -> Diff k v -> DiffSeq k v
forall k v.
SM k v =>
DiffSeq k v -> SlotNo -> Diff k v -> DiffSeq k v
DS.extend DiffSeq k v
sq SlotNo
slot (Diff k v -> DiffSeq k v) -> Diff k v -> DiffSeq k v
forall a b. (a -> b) -> a -> b
$ Diff k v -> Diff k v
forall k v. Diff k v -> Diff k v
DS.toAntiDiff Diff k v
d
l' :: l EmptyMK
l' = l DiffMK -> l EmptyMK
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
HasLedgerTables l =>
l mk -> l EmptyMK
forgetLedgerTables l DiffMK
newState
tablesDiff :: LedgerTables l DiffMK
tablesDiff = l DiffMK -> LedgerTables l DiffMK
forall (mk :: * -> * -> *).
(CanMapMK mk, CanMapKeysMK mk, ZeroableMK mk) =>
l mk -> LedgerTables l mk
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
(HasLedgerTables l, CanMapMK mk, CanMapKeysMK mk, ZeroableMK mk) =>
l mk -> LedgerTables l mk
projectLedgerTables l DiffMK
newState
DbChangelog
{ l EmptyMK
changelogLastFlushedState :: forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState
, LedgerTables l SeqDiffMK
changelogDiffs :: forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs
, AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
} = DbChangelog l
dblog
type KeySetsReader m l = l EmptyMK -> LedgerTables l KeysMK -> m (UnforwardedReadSets l)
readKeySets ::
IOLike m =>
LedgerBackingStore m l ->
KeySetsReader m l
readKeySets :: forall (m :: * -> *) (l :: (* -> * -> *) -> *).
IOLike m =>
LedgerBackingStore m l -> KeySetsReader m l
readKeySets LedgerBackingStore m l
backingStore l EmptyMK
st LedgerTables l KeysMK
rew = do
LedgerBackingStore m l
-> (BackingStoreValueHandle
m (LedgerTables l KeysMK) (LedgerTables l ValuesMK)
-> m (UnforwardedReadSets l))
-> m (UnforwardedReadSets l)
forall (m :: * -> *) keys values diff a.
MonadThrow m =>
BackingStore m keys values diff
-> (BackingStoreValueHandle m keys values -> m a) -> m a
withBsValueHandle LedgerBackingStore m l
backingStore (\BackingStoreValueHandle
m (LedgerTables l KeysMK) (LedgerTables l ValuesMK)
bsvh -> BackingStoreValueHandle
m (LedgerTables l KeysMK) (LedgerTables l ValuesMK)
-> KeySetsReader m l
forall (m :: * -> *) (l :: (* -> * -> *) -> *).
Monad m =>
LedgerBackingStoreValueHandle m l -> KeySetsReader m l
readKeySetsWith BackingStoreValueHandle
m (LedgerTables l KeysMK) (LedgerTables l ValuesMK)
bsvh l EmptyMK
st LedgerTables l KeysMK
rew)
readKeySetsWith ::
Monad m =>
LedgerBackingStoreValueHandle m l ->
KeySetsReader m l
readKeySetsWith :: forall (m :: * -> *) (l :: (* -> * -> *) -> *).
Monad m =>
LedgerBackingStoreValueHandle m l -> KeySetsReader m l
readKeySetsWith LedgerBackingStoreValueHandle m l
bsvh l EmptyMK
st LedgerTables l KeysMK
rew = do
values <- LedgerBackingStoreValueHandle m l
-> ReadHint (LedgerTables l ValuesMK)
-> LedgerTables l KeysMK
-> m (LedgerTables l ValuesMK)
forall (m :: * -> *) keys values.
BackingStoreValueHandle m keys values
-> ReadHint values -> keys -> m values
bsvhRead LedgerBackingStoreValueHandle m l
bsvh l EmptyMK
ReadHint (LedgerTables l ValuesMK)
st LedgerTables l KeysMK
rew
pure
UnforwardedReadSets
{ ursSeqNo = bsvhAtSlot bsvh
, ursValues = values
, ursKeys = rew
}
withKeysReadSets ::
(HasLedgerTables l, Monad m, GetTip l) =>
l EmptyMK ->
KeySetsReader m l ->
DbChangelog l ->
LedgerTables l KeysMK ->
(l ValuesMK -> m a) ->
m a
withKeysReadSets :: forall (l :: (* -> * -> *) -> *) (m :: * -> *) a.
(HasLedgerTables l, Monad m, GetTip l) =>
l EmptyMK
-> KeySetsReader m l
-> DbChangelog l
-> LedgerTables l KeysMK
-> (l ValuesMK -> m a)
-> m a
withKeysReadSets l EmptyMK
st KeySetsReader m l
ksReader DbChangelog l
dbch LedgerTables l KeysMK
ks l ValuesMK -> m a
f = do
urs <- KeySetsReader m l
ksReader l EmptyMK
st LedgerTables l KeysMK
ks
case withHydratedLedgerState urs of
Left RewindReadFwdError
err ->
String -> m a
forall a. HasCallStack => String -> a
error (String -> m a) -> String -> m a
forall a b. (a -> b) -> a -> b
$ String
"Changelog rewind;read;forward sequence failed, " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RewindReadFwdError -> String
forall a. Show a => a -> String
show RewindReadFwdError
err
Right m a
res -> m a
res
where
withHydratedLedgerState :: UnforwardedReadSets l -> Either RewindReadFwdError (m a)
withHydratedLedgerState UnforwardedReadSets l
urs =
l ValuesMK -> m a
f
(l ValuesMK -> m a)
-> (LedgerTables l ValuesMK -> l ValuesMK)
-> LedgerTables l ValuesMK
-> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. l EmptyMK -> LedgerTables l ValuesMK -> l ValuesMK
forall (mk :: * -> * -> *) (any :: * -> * -> *).
(CanMapMK mk, CanMapKeysMK mk, ZeroableMK mk) =>
l any -> LedgerTables l mk -> l mk
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *)
(any :: * -> * -> *).
(HasLedgerTables l, CanMapMK mk, CanMapKeysMK mk, ZeroableMK mk) =>
l any -> LedgerTables l mk -> l mk
withLedgerTables l EmptyMK
st
(LedgerTables l ValuesMK -> m a)
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
-> Either RewindReadFwdError (m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DbChangelog l
-> UnforwardedReadSets l
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forall (l :: (* -> * -> *) -> *).
(HasLedgerTables l, GetTip l) =>
DbChangelog l
-> UnforwardedReadSets l
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forwardTableKeySets DbChangelog l
dbch UnforwardedReadSets l
urs
trivialKeySetsReader ::
(Monad m, LedgerTablesAreTrivial l) =>
WithOrigin SlotNo ->
KeySetsReader m l
trivialKeySetsReader :: forall (m :: * -> *) (l :: (* -> * -> *) -> *).
(Monad m, LedgerTablesAreTrivial l) =>
WithOrigin SlotNo -> KeySetsReader m l
trivialKeySetsReader WithOrigin SlotNo
s l EmptyMK
_st LedgerTables l KeysMK
_ =
UnforwardedReadSets l -> m (UnforwardedReadSets l)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (UnforwardedReadSets l -> m (UnforwardedReadSets l))
-> UnforwardedReadSets l -> m (UnforwardedReadSets l)
forall a b. (a -> b) -> a -> b
$ WithOrigin SlotNo
-> LedgerTables l ValuesMK
-> LedgerTables l KeysMK
-> UnforwardedReadSets l
forall (l :: (* -> * -> *) -> *).
WithOrigin SlotNo
-> LedgerTables l ValuesMK
-> LedgerTables l KeysMK
-> UnforwardedReadSets l
UnforwardedReadSets WithOrigin SlotNo
s LedgerTables l ValuesMK
forall (mk :: * -> * -> *) (l :: (* -> * -> *) -> *).
(ZeroableMK mk, LedgerTablesAreTrivial l) =>
LedgerTables l mk
trivialLedgerTables LedgerTables l KeysMK
forall (mk :: * -> * -> *) (l :: (* -> * -> *) -> *).
(ZeroableMK mk, LedgerTablesAreTrivial l) =>
LedgerTables l mk
trivialLedgerTables
data UnforwardedReadSets l = UnforwardedReadSets
{ :: !(WithOrigin SlotNo)
, forall (l :: (* -> * -> *) -> *).
UnforwardedReadSets l -> LedgerTables l ValuesMK
ursValues :: !(LedgerTables l ValuesMK)
, forall (l :: (* -> * -> *) -> *).
UnforwardedReadSets l -> LedgerTables l KeysMK
ursKeys :: !(LedgerTables l KeysMK)
}
data RewindReadFwdError = RewindReadFwdError
{ RewindReadFwdError -> WithOrigin SlotNo
rrfBackingStoreAt :: !(WithOrigin SlotNo)
, RewindReadFwdError -> WithOrigin SlotNo
rrfDbChangelogAt :: !(WithOrigin SlotNo)
}
deriving Int -> RewindReadFwdError -> ShowS
[RewindReadFwdError] -> ShowS
RewindReadFwdError -> String
(Int -> RewindReadFwdError -> ShowS)
-> (RewindReadFwdError -> String)
-> ([RewindReadFwdError] -> ShowS)
-> Show RewindReadFwdError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RewindReadFwdError -> ShowS
showsPrec :: Int -> RewindReadFwdError -> ShowS
$cshow :: RewindReadFwdError -> String
show :: RewindReadFwdError -> String
$cshowList :: [RewindReadFwdError] -> ShowS
showList :: [RewindReadFwdError] -> ShowS
Show
forwardTableKeySets' ::
HasLedgerTables l =>
WithOrigin SlotNo ->
LedgerTables l SeqDiffMK ->
UnforwardedReadSets l ->
Either
RewindReadFwdError
(LedgerTables l ValuesMK)
forwardTableKeySets' :: forall (l :: (* -> * -> *) -> *).
HasLedgerTables l =>
WithOrigin SlotNo
-> LedgerTables l SeqDiffMK
-> UnforwardedReadSets l
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forwardTableKeySets' WithOrigin SlotNo
seqNo LedgerTables l SeqDiffMK
chdiffs = \(UnforwardedReadSets WithOrigin SlotNo
seqNo' LedgerTables l ValuesMK
values LedgerTables l KeysMK
keys) ->
if WithOrigin SlotNo
seqNo WithOrigin SlotNo -> WithOrigin SlotNo -> Bool
forall a. Eq a => a -> a -> Bool
/= WithOrigin SlotNo
seqNo'
then RewindReadFwdError
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forall a b. a -> Either a b
Left (RewindReadFwdError
-> Either RewindReadFwdError (LedgerTables l ValuesMK))
-> RewindReadFwdError
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forall a b. (a -> b) -> a -> b
$ WithOrigin SlotNo -> WithOrigin SlotNo -> RewindReadFwdError
RewindReadFwdError WithOrigin SlotNo
seqNo' WithOrigin SlotNo
seqNo
else LedgerTables l ValuesMK
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forall a b. b -> Either a b
Right (LedgerTables l ValuesMK
-> Either RewindReadFwdError (LedgerTables l ValuesMK))
-> LedgerTables l ValuesMK
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forall a b. (a -> b) -> a -> b
$ (forall k v.
LedgerTableConstraints' l k v =>
ValuesMK k v -> KeysMK k v -> SeqDiffMK k v -> ValuesMK k v)
-> LedgerTables l ValuesMK
-> LedgerTables l KeysMK
-> LedgerTables l SeqDiffMK
-> LedgerTables l ValuesMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *) (mk3 :: * -> * -> *) (mk4 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v.
LedgerTableConstraints' l k v =>
mk1 k v -> mk2 k v -> mk3 k v -> mk4 k v)
-> LedgerTables l mk1
-> LedgerTables l mk2
-> LedgerTables l mk3
-> LedgerTables l mk4
ltliftA3 ValuesMK k v -> KeysMK k v -> SeqDiffMK k v -> ValuesMK k v
forall k v.
(Ord k, Eq v) =>
ValuesMK k v -> KeysMK k v -> SeqDiffMK k v -> ValuesMK k v
forall k v.
LedgerTableConstraints' l k v =>
ValuesMK k v -> KeysMK k v -> SeqDiffMK k v -> ValuesMK k v
forward LedgerTables l ValuesMK
values LedgerTables l KeysMK
keys LedgerTables l SeqDiffMK
chdiffs
where
forward ::
(Ord k, Eq v) =>
ValuesMK k v ->
KeysMK k v ->
SeqDiffMK k v ->
ValuesMK k v
forward :: forall k v.
(Ord k, Eq v) =>
ValuesMK k v -> KeysMK k v -> SeqDiffMK k v -> ValuesMK k v
forward (ValuesMK Map k v
values) (KeysMK Set k
keys) (SeqDiffMK DiffSeq k v
diffs) =
Map k v -> ValuesMK k v
forall k v. Map k v -> ValuesMK k v
ValuesMK (Map k v -> ValuesMK k v) -> Map k v -> ValuesMK k v
forall a b. (a -> b) -> a -> b
$ Map k v -> Set k -> Diff k v -> Map k v
forall k v. Ord k => Map k v -> Set k -> Diff k v -> Map k v
AntiDiff.applyDiffForKeys Map k v
values Set k
keys (DiffSeq k v -> Diff k v
forall k v. SM k v => DiffSeq k v -> Diff k v
DS.cumulativeDiff DiffSeq k v
diffs)
forwardTableKeySets ::
(HasLedgerTables l, GetTip l) =>
DbChangelog l ->
UnforwardedReadSets l ->
Either
RewindReadFwdError
(LedgerTables l ValuesMK)
forwardTableKeySets :: forall (l :: (* -> * -> *) -> *).
(HasLedgerTables l, GetTip l) =>
DbChangelog l
-> UnforwardedReadSets l
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forwardTableKeySets DbChangelog l
dblog =
WithOrigin SlotNo
-> LedgerTables l SeqDiffMK
-> UnforwardedReadSets l
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forall (l :: (* -> * -> *) -> *).
HasLedgerTables l =>
WithOrigin SlotNo
-> LedgerTables l SeqDiffMK
-> UnforwardedReadSets l
-> Either RewindReadFwdError (LedgerTables l ValuesMK)
forwardTableKeySets'
(l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot (l EmptyMK -> WithOrigin SlotNo) -> l EmptyMK -> WithOrigin SlotNo
forall a b. (a -> b) -> a -> b
$ DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState DbChangelog l
dblog)
(DbChangelog l -> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs DbChangelog l
dblog)
pruneToImmTipOnly ::
GetTip l =>
DbChangelog l ->
DbChangelog l
pruneToImmTipOnly :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> DbChangelog l
pruneToImmTipOnly = LedgerDbPrune -> DbChangelog l -> DbChangelog l
forall (l :: (* -> * -> *) -> *).
GetTip l =>
LedgerDbPrune -> DbChangelog l -> DbChangelog l
prune LedgerDbPrune
LedgerDbPruneAll
rollbackN ::
(GetTip l, HasLedgerTables l) =>
Word64 ->
DbChangelog l ->
Maybe (DbChangelog l)
rollbackN :: forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
Word64 -> DbChangelog l -> Maybe (DbChangelog l)
rollbackN Word64
n DbChangelog l
dblog
| Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
<= DbChangelog l -> Word64
forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> Word64
maxRollback DbChangelog l
dblog =
DbChangelog l -> Maybe (DbChangelog l)
forall a. a -> Maybe a
Just (DbChangelog l -> Maybe (DbChangelog l))
-> DbChangelog l -> Maybe (DbChangelog l)
forall a b. (a -> b) -> a -> b
$
DbChangelog l
dblog
{ changelogDiffs = ltmap truncSeqDiff changelogDiffs
, changelogStates = AS.dropNewest (fromIntegral n) changelogStates
}
| Bool
otherwise =
Maybe (DbChangelog l)
forall a. Maybe a
Nothing
where
truncSeqDiff :: (Ord k, Eq v) => SeqDiffMK k v -> SeqDiffMK k v
truncSeqDiff :: forall k v. (Ord k, Eq v) => SeqDiffMK k v -> SeqDiffMK k v
truncSeqDiff (SeqDiffMK DiffSeq k v
sq) =
DiffSeq k v -> SeqDiffMK k v
forall k v. DiffSeq k v -> SeqDiffMK k v
SeqDiffMK (DiffSeq k v -> SeqDiffMK k v) -> DiffSeq k v -> SeqDiffMK k v
forall a b. (a -> b) -> a -> b
$ (DiffSeq k v, DiffSeq k v) -> DiffSeq k v
forall a b. (a, b) -> a
fst ((DiffSeq k v, DiffSeq k v) -> DiffSeq k v)
-> (DiffSeq k v, DiffSeq k v) -> DiffSeq k v
forall a b. (a -> b) -> a -> b
$ Int -> DiffSeq k v -> (DiffSeq k v, DiffSeq k v)
forall k v.
(SM k v, HasCallStack) =>
Int -> DiffSeq k v -> (DiffSeq k v, DiffSeq k v)
DS.splitAtFromEnd (Word64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
n) DiffSeq k v
sq
DbChangelog
{ LedgerTables l SeqDiffMK
changelogDiffs :: forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs
, AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
} = DbChangelog l
dblog
splitForFlushing ::
forall l.
(GetTip l, HasLedgerTables l) =>
DbChangelog l ->
(Maybe (DiffsToFlush l), DbChangelog l)
splitForFlushing :: forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
DbChangelog l -> (Maybe (DiffsToFlush l), DbChangelog l)
splitForFlushing DbChangelog l
dblog =
if l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot l EmptyMK
immTip WithOrigin SlotNo -> WithOrigin SlotNo -> Bool
forall a. Eq a => a -> a -> Bool
== WithOrigin SlotNo
forall t. WithOrigin t
Origin Bool -> Bool -> Bool
|| LedgerTables l (K2 Int) -> Int
forall (l :: (* -> * -> *) -> *) a. LedgerTables l (K2 a) -> a
ltcollapse ((forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> K2 Int k v)
-> LedgerTables l SeqDiffMK -> LedgerTables l (K2 Int)
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap (Int -> K2 Int k v
forall k1 k2 a (b :: k1) (c :: k2). a -> K2 a b c
K2 (Int -> K2 Int k v)
-> (SeqDiffMK k v -> Int) -> SeqDiffMK k v -> K2 Int k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffSeq k v -> Int
forall k v. SM k v => DiffSeq k v -> Int
DS.length (DiffSeq k v -> Int)
-> (SeqDiffMK k v -> DiffSeq k v) -> SeqDiffMK k v -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SeqDiffMK k v -> DiffSeq k v
forall k v. SeqDiffMK k v -> DiffSeq k v
getSeqDiffMK) LedgerTables l SeqDiffMK
l) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then (Maybe (DiffsToFlush l)
forall a. Maybe a
Nothing, DbChangelog l
dblog)
else (DiffsToFlush l -> Maybe (DiffsToFlush l)
forall a. a -> Maybe a
Just DiffsToFlush l
ldblog, DbChangelog l
rdblog)
where
DbChangelog
{ l EmptyMK
changelogLastFlushedState :: forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState
, LedgerTables l SeqDiffMK
changelogDiffs :: forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs
, AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
} = DbChangelog l
dblog
immTip :: l EmptyMK
immTip = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall v a b. AnchoredSeq v a b -> a
AS.anchor AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
splitSeqDiff ::
(Ord k, Eq v) =>
SeqDiffMK k v ->
(SeqDiffMK k v, SeqDiffMK k v)
splitSeqDiff :: forall k v.
(Ord k, Eq v) =>
SeqDiffMK k v -> (SeqDiffMK k v, SeqDiffMK k v)
splitSeqDiff (SeqDiffMK DiffSeq k v
sq) =
let numToFlush :: Int
numToFlush = DiffSeq k v -> Int
forall k v. SM k v => DiffSeq k v -> Int
DS.length DiffSeq k v
sq Int -> Int -> Int
forall a. Num a => a -> a -> a
- AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
in (Maybe (DiffSeq k v) -> SeqDiffMK k v)
-> (DiffSeq k v -> SeqDiffMK k v)
-> (Maybe (DiffSeq k v), DiffSeq k v)
-> (SeqDiffMK k v, SeqDiffMK k v)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap (SeqDiffMK k v
-> (DiffSeq k v -> SeqDiffMK k v)
-> Maybe (DiffSeq k v)
-> SeqDiffMK k v
forall b a. b -> (a -> b) -> Maybe a -> b
maybe SeqDiffMK k v
forall k v. (Ord k, Eq v) => SeqDiffMK k v
forall (mk :: * -> * -> *) k v.
(ZeroableMK mk, Ord k, Eq v) =>
mk k v
emptyMK DiffSeq k v -> SeqDiffMK k v
forall k v. DiffSeq k v -> SeqDiffMK k v
SeqDiffMK) DiffSeq k v -> SeqDiffMK k v
forall k v. DiffSeq k v -> SeqDiffMK k v
SeqDiffMK ((Maybe (DiffSeq k v), DiffSeq k v)
-> (SeqDiffMK k v, SeqDiffMK k v))
-> (Maybe (DiffSeq k v), DiffSeq k v)
-> (SeqDiffMK k v, SeqDiffMK k v)
forall a b. (a -> b) -> a -> b
$
if Int
numToFlush Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0
then
let (DiffSeq k v
tf, DiffSeq k v
tk) = Int -> DiffSeq k v -> (DiffSeq k v, DiffSeq k v)
forall k v.
SM k v =>
Int -> DiffSeq k v -> (DiffSeq k v, DiffSeq k v)
DS.splitAt Int
numToFlush DiffSeq k v
sq
in (DiffSeq k v -> Maybe (DiffSeq k v)
forall a. a -> Maybe a
Just DiffSeq k v
tf, DiffSeq k v
tk)
else (Maybe (DiffSeq k v)
forall a. Maybe a
Nothing, DiffSeq k v
sq)
lr :: LedgerTables l (Product2 SeqDiffMK SeqDiffMK)
lr = (forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> Product2 SeqDiffMK SeqDiffMK k v)
-> LedgerTables l SeqDiffMK
-> LedgerTables l (Product2 SeqDiffMK SeqDiffMK)
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap ((SeqDiffMK k v
-> SeqDiffMK k v -> Product2 SeqDiffMK SeqDiffMK k v)
-> (SeqDiffMK k v, SeqDiffMK k v)
-> Product2 SeqDiffMK SeqDiffMK k v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry SeqDiffMK k v -> SeqDiffMK k v -> Product2 SeqDiffMK SeqDiffMK k v
forall (f :: * -> * -> *) (g :: * -> * -> *) x y.
f x y -> g x y -> Product2 f g x y
Pair2 ((SeqDiffMK k v, SeqDiffMK k v)
-> Product2 SeqDiffMK SeqDiffMK k v)
-> (SeqDiffMK k v -> (SeqDiffMK k v, SeqDiffMK k v))
-> SeqDiffMK k v
-> Product2 SeqDiffMK SeqDiffMK k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SeqDiffMK k v -> (SeqDiffMK k v, SeqDiffMK k v)
forall k v.
(Ord k, Eq v) =>
SeqDiffMK k v -> (SeqDiffMK k v, SeqDiffMK k v)
splitSeqDiff) LedgerTables l SeqDiffMK
changelogDiffs
l :: LedgerTables l SeqDiffMK
l = (forall k v.
LedgerTableConstraints' l k v =>
Product2 SeqDiffMK SeqDiffMK k v -> SeqDiffMK k v)
-> LedgerTables l (Product2 SeqDiffMK SeqDiffMK)
-> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap (\(Pair2 SeqDiffMK k v
x SeqDiffMK k v
_) -> SeqDiffMK k v
x) LedgerTables l (Product2 SeqDiffMK SeqDiffMK)
lr
r :: LedgerTables l SeqDiffMK
r = (forall k v.
LedgerTableConstraints' l k v =>
Product2 SeqDiffMK SeqDiffMK k v -> SeqDiffMK k v)
-> LedgerTables l (Product2 SeqDiffMK SeqDiffMK)
-> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap (\(Pair2 SeqDiffMK k v
_ SeqDiffMK k v
y) -> SeqDiffMK k v
y) LedgerTables l (Product2 SeqDiffMK SeqDiffMK)
lr
prj ::
(Ord k, Eq v) =>
SeqDiffMK k v ->
DiffMK k v
prj :: forall k v. (Ord k, Eq v) => SeqDiffMK k v -> DiffMK k v
prj (SeqDiffMK DiffSeq k v
sq) = Diff k v -> DiffMK k v
forall k v. Diff k v -> DiffMK k v
DiffMK (Diff k v -> Diff k v
forall k v. Diff k v -> Diff k v
DS.fromAntiDiff (Diff k v -> Diff k v) -> Diff k v -> Diff k v
forall a b. (a -> b) -> a -> b
$ DiffSeq k v -> Diff k v
forall k v. SM k v => DiffSeq k v -> Diff k v
DS.cumulativeDiff DiffSeq k v
sq)
ldblog :: DiffsToFlush l
ldblog =
DiffsToFlush
{ toFlushDiffs :: LedgerTables l DiffMK
toFlushDiffs = (forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> DiffMK k v)
-> LedgerTables l SeqDiffMK -> LedgerTables l DiffMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap SeqDiffMK k v -> DiffMK k v
forall k v. (Ord k, Eq v) => SeqDiffMK k v -> DiffMK k v
forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> DiffMK k v
prj LedgerTables l SeqDiffMK
l
, toFlushState :: (l EmptyMK, l EmptyMK)
toFlushState = (l EmptyMK
changelogLastFlushedState, l EmptyMK
immTip)
, toFlushSlot :: SlotNo
toFlushSlot =
SlotNo -> WithOrigin SlotNo -> SlotNo
forall t. t -> WithOrigin t -> t
fromWithOrigin (String -> SlotNo
forall a. HasCallStack => String -> a
error String
"Flushing a DbChangelog at origin should never happen") (WithOrigin SlotNo -> SlotNo) -> WithOrigin SlotNo -> SlotNo
forall a b. (a -> b) -> a -> b
$
l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot l EmptyMK
immTip
}
rdblog :: DbChangelog l
rdblog =
DbChangelog
{ changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState = l EmptyMK
immTip
, changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs = LedgerTables l SeqDiffMK
r
, changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
}
current :: GetTip l => DbChangelog l -> l EmptyMK
current :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> l EmptyMK
current =
(l EmptyMK -> l EmptyMK)
-> (l EmptyMK -> l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either l EmptyMK -> l EmptyMK
forall a. a -> a
id l EmptyMK -> l EmptyMK
forall a. a -> a
id
(Either (l EmptyMK) (l EmptyMK) -> l EmptyMK)
-> (DbChangelog l -> Either (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> l EmptyMK
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK)
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Either a b
AS.head
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK))
-> (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> Either (l EmptyMK) (l EmptyMK)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
anchor :: DbChangelog l -> l EmptyMK
anchor :: forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
anchor =
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall v a b. AnchoredSeq v a b -> a
AS.anchor
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK)
-> (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> l EmptyMK
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
snapshots :: DbChangelog l -> [(Word64, l EmptyMK)]
snapshots :: forall (l :: (* -> * -> *) -> *).
DbChangelog l -> [(Word64, l EmptyMK)]
snapshots =
[Word64] -> [l EmptyMK] -> [(Word64, l EmptyMK)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Word64
0 ..]
([l EmptyMK] -> [(Word64, l EmptyMK)])
-> (DbChangelog l -> [l EmptyMK])
-> DbChangelog l
-> [(Word64, l EmptyMK)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> [l EmptyMK]
forall v a b. AnchoredSeq v a b -> [b]
AS.toNewestFirst
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> [l EmptyMK])
-> (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> [l EmptyMK]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
maxRollback :: GetTip l => DbChangelog l -> Word64
maxRollback :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> Word64
maxRollback =
Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral
(Int -> Word64)
-> (DbChangelog l -> Int) -> DbChangelog l -> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int)
-> (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
tip :: GetTip l => DbChangelog l -> Point l
tip :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> Point l
tip = Point l -> Point l
forall {k1} {k2} (b :: k1) (b' :: k2).
Coercible (HeaderHash b) (HeaderHash b') =>
Point b -> Point b'
castPoint (Point l -> Point l)
-> (DbChangelog l -> Point l) -> DbChangelog l -> Point l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. l EmptyMK -> Point l
forall (mk :: * -> * -> *). l mk -> Point l
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> Point l
getTip (l EmptyMK -> Point l)
-> (DbChangelog l -> l EmptyMK) -> DbChangelog l -> Point l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> l EmptyMK
current
isSaturated :: GetTip l => SecurityParam -> DbChangelog l -> Bool
isSaturated :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
SecurityParam -> DbChangelog l -> Bool
isSaturated (SecurityParam NonZero Word64
k) DbChangelog l
db =
DbChangelog l -> Word64
forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> Word64
maxRollback DbChangelog l
db Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
>= NonZero Word64 -> Word64
forall a. NonZero a -> a
unNonZero NonZero Word64
k
getPastLedgerAt ::
( HasHeader blk
, IsLedger l
, HeaderHash l ~ HeaderHash blk
, StandardHash l
, HasLedgerTables l
) =>
Point blk ->
DbChangelog l ->
Maybe (l EmptyMK)
getPastLedgerAt :: forall blk (l :: (* -> * -> *) -> *).
(HasHeader blk, IsLedger l, HeaderHash l ~ HeaderHash blk,
StandardHash l, HasLedgerTables l) =>
Point blk -> DbChangelog l -> Maybe (l EmptyMK)
getPastLedgerAt Point blk
pt DbChangelog l
db = DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> l EmptyMK
current (DbChangelog l -> l EmptyMK)
-> Maybe (DbChangelog l) -> Maybe (l EmptyMK)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Point blk -> DbChangelog l -> Maybe (DbChangelog l)
forall blk (l :: (* -> * -> *) -> *).
(HasHeader blk, IsLedger l, HeaderHash l ~ HeaderHash blk,
StandardHash l, HasLedgerTables l) =>
Point blk -> DbChangelog l -> Maybe (DbChangelog l)
rollback Point blk
pt DbChangelog l
db
rollbackToPoint ::
( StandardHash l
, GetTip l
, HasLedgerTables l
) =>
Point l -> DbChangelog l -> Maybe (DbChangelog l)
rollbackToPoint :: forall (l :: (* -> * -> *) -> *).
(StandardHash l, GetTip l, HasLedgerTables l) =>
Point l -> DbChangelog l -> Maybe (DbChangelog l)
rollbackToPoint Point l
pt DbChangelog l
dblog = do
vol' <-
WithOrigin SlotNo
-> (Either (l EmptyMK) (l EmptyMK) -> Bool)
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> Maybe (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
forall v a b.
Anchorable v a b =>
v
-> (Either a b -> Bool)
-> AnchoredSeq v a b
-> Maybe (AnchoredSeq v a b)
AS.rollback
(Point l -> WithOrigin SlotNo
forall {k} (block :: k). Point block -> WithOrigin SlotNo
pointSlot Point l
pt)
((Point l -> Point l -> Bool
forall a. Eq a => a -> a -> Bool
== Point l
pt) (Point l -> Bool)
-> (Either (l EmptyMK) (l EmptyMK) -> Point l)
-> Either (l EmptyMK) (l EmptyMK)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. l EmptyMK -> Point l
forall (mk :: * -> * -> *). l mk -> Point l
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> Point l
getTip (l EmptyMK -> Point l)
-> (Either (l EmptyMK) (l EmptyMK) -> l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK)
-> Point l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (l EmptyMK -> l EmptyMK)
-> (l EmptyMK -> l EmptyMK)
-> Either (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either l EmptyMK -> l EmptyMK
forall a. a -> a
id l EmptyMK -> l EmptyMK
forall a. a -> a
id)
AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
let ndropped = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates Int -> Int -> Int
forall a. Num a => a -> a -> a
- AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
vol'
diffs' = (forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> SeqDiffMK k v)
-> LedgerTables l SeqDiffMK -> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap (Int -> SeqDiffMK k v -> SeqDiffMK k v
forall k v. (Ord k, Eq v) => Int -> SeqDiffMK k v -> SeqDiffMK k v
trunc Int
ndropped) LedgerTables l SeqDiffMK
changelogDiffs
Exn.assert (ndropped >= 0) $
pure
DbChangelog
{ changelogLastFlushedState
, changelogDiffs = diffs'
, changelogStates = vol'
}
where
DbChangelog
{ l EmptyMK
changelogLastFlushedState :: forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState
, LedgerTables l SeqDiffMK
changelogDiffs :: forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs
, AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
} = DbChangelog l
dblog
rollbackToAnchor ::
(GetTip l, HasLedgerTables l) =>
DbChangelog l -> DbChangelog l
rollbackToAnchor :: forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
DbChangelog l -> DbChangelog l
rollbackToAnchor DbChangelog l
dblog =
DbChangelog
{ l EmptyMK
changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState
, changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs = LedgerTables l SeqDiffMK
diffs'
, changelogStates :: AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates = l EmptyMK
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall v a b. Anchorable v a b => a -> AnchoredSeq v a b
AS.Empty (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall v a b. AnchoredSeq v a b -> a
AS.anchor AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
vol)
}
where
DbChangelog
{ l EmptyMK
changelogLastFlushedState :: forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState :: l EmptyMK
changelogLastFlushedState
, LedgerTables l SeqDiffMK
changelogDiffs :: forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs :: LedgerTables l SeqDiffMK
changelogDiffs
, changelogStates :: forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
vol
} = DbChangelog l
dblog
ndropped :: Int
ndropped = AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
vol
diffs' :: LedgerTables l SeqDiffMK
diffs' = (forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> SeqDiffMK k v)
-> LedgerTables l SeqDiffMK -> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap (Int -> SeqDiffMK k v -> SeqDiffMK k v
forall k v. (Ord k, Eq v) => Int -> SeqDiffMK k v -> SeqDiffMK k v
trunc Int
ndropped) LedgerTables l SeqDiffMK
changelogDiffs
trunc ::
(Ord k, Eq v) =>
Int -> SeqDiffMK k v -> SeqDiffMK k v
trunc :: forall k v. (Ord k, Eq v) => Int -> SeqDiffMK k v -> SeqDiffMK k v
trunc Int
n (SeqDiffMK DiffSeq k v
sq) =
DiffSeq k v -> SeqDiffMK k v
forall k v. DiffSeq k v -> SeqDiffMK k v
SeqDiffMK (DiffSeq k v -> SeqDiffMK k v) -> DiffSeq k v -> SeqDiffMK k v
forall a b. (a -> b) -> a -> b
$ (DiffSeq k v, DiffSeq k v) -> DiffSeq k v
forall a b. (a, b) -> a
fst ((DiffSeq k v, DiffSeq k v) -> DiffSeq k v)
-> (DiffSeq k v, DiffSeq k v) -> DiffSeq k v
forall a b. (a -> b) -> a -> b
$ Int -> DiffSeq k v -> (DiffSeq k v, DiffSeq k v)
forall k v.
(SM k v, HasCallStack) =>
Int -> DiffSeq k v -> (DiffSeq k v, DiffSeq k v)
DS.splitAtFromEnd Int
n DiffSeq k v
sq
rollback ::
( HasHeader blk
, IsLedger l
, HeaderHash l ~ HeaderHash blk
, StandardHash l
, HasLedgerTables l
) =>
Point blk ->
DbChangelog l ->
Maybe (DbChangelog l)
rollback :: forall blk (l :: (* -> * -> *) -> *).
(HasHeader blk, IsLedger l, HeaderHash l ~ HeaderHash blk,
StandardHash l, HasLedgerTables l) =>
Point blk -> DbChangelog l -> Maybe (DbChangelog l)
rollback Point blk
pt DbChangelog l
db
| Point blk
pt Point blk -> Point blk -> Bool
forall a. Eq a => a -> a -> Bool
== Point l -> Point blk
forall {k1} {k2} (b :: k1) (b' :: k2).
Coercible (HeaderHash b) (HeaderHash b') =>
Point b -> Point b'
castPoint (l EmptyMK -> Point l
forall (mk :: * -> * -> *). l mk -> Point l
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> Point l
getTip (DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
anchor DbChangelog l
db)) =
DbChangelog l -> Maybe (DbChangelog l)
forall a. a -> Maybe a
Just (DbChangelog l -> Maybe (DbChangelog l))
-> DbChangelog l -> Maybe (DbChangelog l)
forall a b. (a -> b) -> a -> b
$ DbChangelog l -> DbChangelog l
forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
DbChangelog l -> DbChangelog l
rollbackToAnchor DbChangelog l
db
| Bool
otherwise =
Point l -> DbChangelog l -> Maybe (DbChangelog l)
forall (l :: (* -> * -> *) -> *).
(StandardHash l, GetTip l, HasLedgerTables l) =>
Point l -> DbChangelog l -> Maybe (DbChangelog l)
rollbackToPoint (Point blk -> Point l
forall {k1} {k2} (b :: k1) (b' :: k2).
Coercible (HeaderHash b) (HeaderHash b') =>
Point b -> Point b'
castPoint Point blk
pt) DbChangelog l
db
immutableTipSlot ::
GetTip l =>
DbChangelog l -> WithOrigin SlotNo
immutableTipSlot :: forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> WithOrigin SlotNo
immutableTipSlot =
l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot
(l EmptyMK -> WithOrigin SlotNo)
-> (DbChangelog l -> l EmptyMK)
-> DbChangelog l
-> WithOrigin SlotNo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK
forall v a b. AnchoredSeq v a b -> a
AS.anchor
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> l EmptyMK)
-> (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> l EmptyMK
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
flushableLength ::
(HasLedgerTables l, GetTip l) =>
DbChangelog l ->
Word64
flushableLength :: forall (l :: (* -> * -> *) -> *).
(HasLedgerTables l, GetTip l) =>
DbChangelog l -> Word64
flushableLength DbChangelog l
chlog =
(\Word64
x -> Word64
x Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK) -> Int
forall v a b. Anchorable v a b => AnchoredSeq v a b -> Int
AS.length (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates DbChangelog l
chlog)))
(Word64 -> Word64)
-> (LedgerTables l SeqDiffMK -> Word64)
-> LedgerTables l SeqDiffMK
-> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LedgerTables l (K2 Word64) -> Word64
forall (l :: (* -> * -> *) -> *) a. LedgerTables l (K2 a) -> a
ltcollapse
(LedgerTables l (K2 Word64) -> Word64)
-> (LedgerTables l SeqDiffMK -> LedgerTables l (K2 Word64))
-> LedgerTables l SeqDiffMK
-> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall k v.
LedgerTableConstraints' l k v =>
SeqDiffMK k v -> K2 Word64 k v)
-> LedgerTables l SeqDiffMK -> LedgerTables l (K2 Word64)
forall (l :: (* -> * -> *) -> *) (mk1 :: * -> * -> *)
(mk2 :: * -> * -> *).
LedgerTableConstraints l =>
(forall k v. LedgerTableConstraints' l k v => mk1 k v -> mk2 k v)
-> LedgerTables l mk1 -> LedgerTables l mk2
ltmap (Word64 -> K2 Word64 k v
forall k1 k2 a (b :: k1) (c :: k2). a -> K2 a b c
K2 (Word64 -> K2 Word64 k v)
-> (SeqDiffMK k v -> Word64) -> SeqDiffMK k v -> K2 Word64 k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SeqDiffMK k v -> Word64
forall k v. (Ord k, Eq v) => SeqDiffMK k v -> Word64
f)
(LedgerTables l SeqDiffMK -> Word64)
-> LedgerTables l SeqDiffMK -> Word64
forall a b. (a -> b) -> a -> b
$ DbChangelog l -> LedgerTables l SeqDiffMK
forall (l :: (* -> * -> *) -> *).
DbChangelog l -> LedgerTables l SeqDiffMK
changelogDiffs DbChangelog l
chlog
where
f ::
(Ord k, Eq v) =>
SeqDiffMK k v ->
Word64
f :: forall k v. (Ord k, Eq v) => SeqDiffMK k v -> Word64
f (SeqDiffMK DiffSeq k v
sq) = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word64) -> Int -> Word64
forall a b. (a -> b) -> a -> b
$ DiffSeq k v -> Int
forall k v. SM k v => DiffSeq k v -> Int
DS.length DiffSeq k v
sq
volatileStatesBimap ::
AS.Anchorable (WithOrigin SlotNo) a b =>
(l EmptyMK -> a) ->
(l EmptyMK -> b) ->
DbChangelog l ->
AS.AnchoredSeq (WithOrigin SlotNo) a b
volatileStatesBimap :: forall a b (l :: (* -> * -> *) -> *).
Anchorable (WithOrigin SlotNo) a b =>
(l EmptyMK -> a)
-> (l EmptyMK -> b)
-> DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) a b
volatileStatesBimap l EmptyMK -> a
f l EmptyMK -> b
g =
(l EmptyMK -> a)
-> (l EmptyMK -> b)
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> AnchoredSeq (WithOrigin SlotNo) a b
forall v2 a2 b2 a1 b1 v1.
Anchorable v2 a2 b2 =>
(a1 -> a2)
-> (b1 -> b2) -> AnchoredSeq v1 a1 b1 -> AnchoredSeq v2 a2 b2
AS.bimap l EmptyMK -> a
f l EmptyMK -> b
g
(AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
-> AnchoredSeq (WithOrigin SlotNo) a b)
-> (DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK))
-> DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
forall (l :: (* -> * -> *) -> *).
DbChangelog l
-> AnchoredSeq (WithOrigin SlotNo) (l EmptyMK) (l EmptyMK)
changelogStates
reapplyThenPush' ::
ApplyBlock l blk =>
LedgerDbCfg l ->
blk ->
KeySetsReader Identity l ->
DbChangelog l ->
DbChangelog l
reapplyThenPush' :: forall (l :: (* -> * -> *) -> *) blk.
ApplyBlock l blk =>
LedgerDbCfg l
-> blk
-> KeySetsReader Identity l
-> DbChangelog l
-> DbChangelog l
reapplyThenPush' LedgerDbCfg l
cfg blk
b KeySetsReader Identity l
bk = Identity (DbChangelog l) -> DbChangelog l
forall a. Identity a -> a
runIdentity (Identity (DbChangelog l) -> DbChangelog l)
-> (DbChangelog l -> Identity (DbChangelog l))
-> DbChangelog l
-> DbChangelog l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LedgerDbCfg l
-> blk
-> KeySetsReader Identity l
-> DbChangelog l
-> Identity (DbChangelog l)
forall (m :: * -> *) (l :: (* -> * -> *) -> *) blk.
(Monad m, ApplyBlock l blk) =>
LedgerDbCfg l
-> blk -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
reapplyThenPush LedgerDbCfg l
cfg blk
b KeySetsReader Identity l
bk
reapplyThenPushMany' ::
(ApplyBlock l blk, LedgerTablesAreTrivial l) =>
LedgerDbCfg l ->
[blk] ->
DbChangelog l ->
DbChangelog l
reapplyThenPushMany' :: forall (l :: (* -> * -> *) -> *) blk.
(ApplyBlock l blk, LedgerTablesAreTrivial l) =>
LedgerDbCfg l -> [blk] -> DbChangelog l -> DbChangelog l
reapplyThenPushMany' LedgerDbCfg l
cfg [blk]
bs DbChangelog l
dblog =
Identity (DbChangelog l) -> DbChangelog l
forall a. Identity a -> a
runIdentity
(Identity (DbChangelog l) -> DbChangelog l)
-> (DbChangelog l -> Identity (DbChangelog l))
-> DbChangelog l
-> DbChangelog l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LedgerDbCfg l
-> [blk]
-> KeySetsReader Identity l
-> DbChangelog l
-> Identity (DbChangelog l)
forall (l :: (* -> * -> *) -> *) blk (m :: * -> *).
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l
-> [blk] -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
reapplyThenPushMany LedgerDbCfg l
cfg [blk]
bs (WithOrigin SlotNo -> KeySetsReader Identity l
forall (m :: * -> *) (l :: (* -> * -> *) -> *).
(Monad m, LedgerTablesAreTrivial l) =>
WithOrigin SlotNo -> KeySetsReader m l
trivialKeySetsReader (l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot (DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState DbChangelog l
dblog)))
(DbChangelog l -> DbChangelog l) -> DbChangelog l -> DbChangelog l
forall a b. (a -> b) -> a -> b
$ DbChangelog l
dblog
reapplyThenPushMany ::
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l ->
[blk] ->
KeySetsReader m l ->
DbChangelog l ->
m (DbChangelog l)
reapplyThenPushMany :: forall (l :: (* -> * -> *) -> *) blk (m :: * -> *).
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l
-> [blk] -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
reapplyThenPushMany LedgerDbCfg l
cfg [blk]
aps KeySetsReader m l
ksReader =
(blk -> DbChangelog l -> m (DbChangelog l))
-> [blk] -> DbChangelog l -> m (DbChangelog l)
forall (m :: * -> *) a b.
Monad m =>
(a -> b -> m b) -> [a] -> b -> m b
repeatedlyM (\blk
ap -> LedgerDbCfg l
-> blk -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
forall (m :: * -> *) (l :: (* -> * -> *) -> *) blk.
(Monad m, ApplyBlock l blk) =>
LedgerDbCfg l
-> blk -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
reapplyThenPush LedgerDbCfg l
cfg blk
ap KeySetsReader m l
ksReader) [blk]
aps
switch ::
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l ->
Word64 ->
[blk] ->
KeySetsReader m l ->
DbChangelog l ->
m (Either ExceededRollback (DbChangelog l))
switch :: forall (l :: (* -> * -> *) -> *) blk (m :: * -> *).
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l
-> Word64
-> [blk]
-> KeySetsReader m l
-> DbChangelog l
-> m (Either ExceededRollback (DbChangelog l))
switch LedgerDbCfg l
cfg Word64
numRollbacks [blk]
newBlocks KeySetsReader m l
ksReader DbChangelog l
db =
case Word64 -> DbChangelog l -> Maybe (DbChangelog l)
forall (l :: (* -> * -> *) -> *).
(GetTip l, HasLedgerTables l) =>
Word64 -> DbChangelog l -> Maybe (DbChangelog l)
rollbackN Word64
numRollbacks DbChangelog l
db of
Maybe (DbChangelog l)
Nothing ->
Either ExceededRollback (DbChangelog l)
-> m (Either ExceededRollback (DbChangelog l))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either ExceededRollback (DbChangelog l)
-> m (Either ExceededRollback (DbChangelog l)))
-> Either ExceededRollback (DbChangelog l)
-> m (Either ExceededRollback (DbChangelog l))
forall a b. (a -> b) -> a -> b
$
ExceededRollback -> Either ExceededRollback (DbChangelog l)
forall a b. a -> Either a b
Left (ExceededRollback -> Either ExceededRollback (DbChangelog l))
-> ExceededRollback -> Either ExceededRollback (DbChangelog l)
forall a b. (a -> b) -> a -> b
$
ExceededRollback
{ rollbackMaximum :: Word64
rollbackMaximum = DbChangelog l -> Word64
forall (l :: (* -> * -> *) -> *).
GetTip l =>
DbChangelog l -> Word64
maxRollback DbChangelog l
db
, rollbackRequested :: Word64
rollbackRequested = Word64
numRollbacks
}
Just DbChangelog l
db' ->
if [blk] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [blk]
newBlocks
then Either ExceededRollback (DbChangelog l)
-> m (Either ExceededRollback (DbChangelog l))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either ExceededRollback (DbChangelog l)
-> m (Either ExceededRollback (DbChangelog l)))
-> Either ExceededRollback (DbChangelog l)
-> m (Either ExceededRollback (DbChangelog l))
forall a b. (a -> b) -> a -> b
$ DbChangelog l -> Either ExceededRollback (DbChangelog l)
forall a b. b -> Either a b
Right DbChangelog l
db'
else
DbChangelog l -> Either ExceededRollback (DbChangelog l)
forall a b. b -> Either a b
Right
(DbChangelog l -> Either ExceededRollback (DbChangelog l))
-> m (DbChangelog l) -> m (Either ExceededRollback (DbChangelog l))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LedgerDbCfg l
-> [blk] -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
forall (l :: (* -> * -> *) -> *) blk (m :: * -> *).
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l
-> [blk] -> KeySetsReader m l -> DbChangelog l -> m (DbChangelog l)
reapplyThenPushMany
LedgerDbCfg l
cfg
[blk]
newBlocks
KeySetsReader m l
ksReader
DbChangelog l
db'
switch' ::
(ApplyBlock l blk, LedgerTablesAreTrivial l) =>
LedgerDbCfg l ->
Word64 ->
[blk] ->
DbChangelog l ->
Maybe (DbChangelog l)
switch' :: forall (l :: (* -> * -> *) -> *) blk.
(ApplyBlock l blk, LedgerTablesAreTrivial l) =>
LedgerDbCfg l
-> Word64 -> [blk] -> DbChangelog l -> Maybe (DbChangelog l)
switch' LedgerDbCfg l
cfg Word64
n [blk]
bs DbChangelog l
db =
case Identity (Either ExceededRollback (DbChangelog l))
-> Either ExceededRollback (DbChangelog l)
forall a. Identity a -> a
runIdentity (Identity (Either ExceededRollback (DbChangelog l))
-> Either ExceededRollback (DbChangelog l))
-> Identity (Either ExceededRollback (DbChangelog l))
-> Either ExceededRollback (DbChangelog l)
forall a b. (a -> b) -> a -> b
$ LedgerDbCfg l
-> Word64
-> [blk]
-> KeySetsReader Identity l
-> DbChangelog l
-> Identity (Either ExceededRollback (DbChangelog l))
forall (l :: (* -> * -> *) -> *) blk (m :: * -> *).
(ApplyBlock l blk, Monad m) =>
LedgerDbCfg l
-> Word64
-> [blk]
-> KeySetsReader m l
-> DbChangelog l
-> m (Either ExceededRollback (DbChangelog l))
switch LedgerDbCfg l
cfg Word64
n [blk]
bs (WithOrigin SlotNo -> KeySetsReader Identity l
forall (m :: * -> *) (l :: (* -> * -> *) -> *).
(Monad m, LedgerTablesAreTrivial l) =>
WithOrigin SlotNo -> KeySetsReader m l
trivialKeySetsReader (l EmptyMK -> WithOrigin SlotNo
forall (l :: (* -> * -> *) -> *) (mk :: * -> * -> *).
GetTip l =>
l mk -> WithOrigin SlotNo
getTipSlot (DbChangelog l -> l EmptyMK
forall (l :: (* -> * -> *) -> *). DbChangelog l -> l EmptyMK
changelogLastFlushedState DbChangelog l
db))) DbChangelog l
db of
Left ExceededRollback{} -> Maybe (DbChangelog l)
forall a. Maybe a
Nothing
Right DbChangelog l
db' -> DbChangelog l -> Maybe (DbChangelog l)
forall a. a -> Maybe a
Just DbChangelog l
db'