{-# LANGUAGE FlexibleContexts #-}
module Ouroboros.Consensus.Mempool.Update (
implAddTx
, implRemoveTxs
, implSyncWithLedger
) where
import Control.Concurrent.Class.MonadMVar (MVar, withMVar)
import Control.Exception (assert)
import Control.Monad.Except (runExcept)
import Control.Tracer
import Data.Maybe (isJust)
import qualified Data.Measure as Measure
import qualified Data.Set as Set
import Ouroboros.Consensus.HeaderValidation
import Ouroboros.Consensus.Ledger.Abstract
import Ouroboros.Consensus.Ledger.SupportsMempool
import Ouroboros.Consensus.Mempool.API
import Ouroboros.Consensus.Mempool.Capacity
import Ouroboros.Consensus.Mempool.Impl.Common
import Ouroboros.Consensus.Mempool.TxSeq (TxTicket (..))
import qualified Ouroboros.Consensus.Mempool.TxSeq as TxSeq
import Ouroboros.Consensus.Util (whenJust)
import Ouroboros.Consensus.Util.IOLike hiding (withMVar)
implAddTx ::
( MonadSTM m
, MonadMVar m
, LedgerSupportsMempool blk
, HasTxId (GenTx blk)
)
=> StrictTVar m (InternalState blk)
-> MVar m ()
-> MVar m ()
-> LedgerConfig blk
-> Tracer m (TraceEventMempool blk)
-> AddTxOnBehalfOf
-> GenTx blk
-> m (MempoolAddTxResult blk)
implAddTx :: forall (m :: * -> *) blk.
(MonadSTM m, MonadMVar m, LedgerSupportsMempool blk,
HasTxId (GenTx blk)) =>
StrictTVar m (InternalState blk)
-> MVar m ()
-> MVar m ()
-> LedgerConfig blk
-> Tracer m (TraceEventMempool blk)
-> AddTxOnBehalfOf
-> GenTx blk
-> m (MempoolAddTxResult blk)
implAddTx StrictTVar m (InternalState blk)
istate MVar m ()
remoteFifo MVar m ()
allFifo LedgerCfg (LedgerState blk)
cfg Tracer m (TraceEventMempool blk)
trcr AddTxOnBehalfOf
onbehalf GenTx blk
tx =
case AddTxOnBehalfOf
onbehalf of
AddTxOnBehalfOf
AddTxForRemotePeer ->
MVar m ()
-> (() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk)
forall a b. MVar m a -> (a -> m b) -> m b
forall (m :: * -> *) a b.
MonadMVar m =>
MVar m a -> (a -> m b) -> m b
withMVar MVar m ()
remoteFifo ((() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk))
-> (() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk)
forall a b. (a -> b) -> a -> b
$ \() ->
MVar m ()
-> (() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk)
forall a b. MVar m a -> (a -> m b) -> m b
forall (m :: * -> *) a b.
MonadMVar m =>
MVar m a -> (a -> m b) -> m b
withMVar MVar m ()
allFifo ((() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk))
-> (() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk)
forall a b. (a -> b) -> a -> b
$ \() ->
m (MempoolAddTxResult blk)
implAddTx'
AddTxOnBehalfOf
AddTxForLocalClient ->
MVar m ()
-> (() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk)
forall a b. MVar m a -> (a -> m b) -> m b
forall (m :: * -> *) a b.
MonadMVar m =>
MVar m a -> (a -> m b) -> m b
withMVar MVar m ()
allFifo ((() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk))
-> (() -> m (MempoolAddTxResult blk)) -> m (MempoolAddTxResult blk)
forall a b. (a -> b) -> a -> b
$ \() ->
m (MempoolAddTxResult blk)
implAddTx'
where
implAddTx' :: m (MempoolAddTxResult blk)
implAddTx' = do
(MempoolAddTxResult blk
result, TraceEventMempool blk
ev) <- STM m (MempoolAddTxResult blk, TraceEventMempool blk)
-> m (MempoolAddTxResult blk, TraceEventMempool blk)
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically (STM m (MempoolAddTxResult blk, TraceEventMempool blk)
-> m (MempoolAddTxResult blk, TraceEventMempool blk))
-> STM m (MempoolAddTxResult blk, TraceEventMempool blk)
-> m (MempoolAddTxResult blk, TraceEventMempool blk)
forall a b. (a -> b) -> a -> b
$ do
TryAddTx blk
outcome <- StrictTVar m (InternalState blk)
-> LedgerCfg (LedgerState blk)
-> WhetherToIntervene
-> GenTx blk
-> STM m (TryAddTx blk)
forall (m :: * -> *) blk.
(MonadSTM m, LedgerSupportsMempool blk, HasTxId (GenTx blk)) =>
StrictTVar m (InternalState blk)
-> LedgerConfig blk
-> WhetherToIntervene
-> GenTx blk
-> STM m (TryAddTx blk)
implTryAddTx StrictTVar m (InternalState blk)
istate LedgerCfg (LedgerState blk)
cfg
(AddTxOnBehalfOf -> WhetherToIntervene
whetherToIntervene AddTxOnBehalfOf
onbehalf)
GenTx blk
tx
case TryAddTx blk
outcome of
TryAddTx Maybe (InternalState blk)
_ MempoolAddTxResult blk
result TraceEventMempool blk
ev -> do (MempoolAddTxResult blk, TraceEventMempool blk)
-> STM m (MempoolAddTxResult blk, TraceEventMempool blk)
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return (MempoolAddTxResult blk
result, TraceEventMempool blk
ev)
TryAddTx blk
NotEnoughSpaceLeft -> STM m (MempoolAddTxResult blk, TraceEventMempool blk)
forall a. STM m a
forall (m :: * -> *) a. MonadSTM m => STM m a
retry
Tracer m (TraceEventMempool blk) -> TraceEventMempool blk -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Tracer m (TraceEventMempool blk)
trcr TraceEventMempool blk
ev
MempoolAddTxResult blk -> m (MempoolAddTxResult blk)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MempoolAddTxResult blk
result
whetherToIntervene :: AddTxOnBehalfOf -> WhetherToIntervene
whetherToIntervene :: AddTxOnBehalfOf -> WhetherToIntervene
whetherToIntervene AddTxOnBehalfOf
AddTxForRemotePeer = WhetherToIntervene
DoNotIntervene
whetherToIntervene AddTxOnBehalfOf
AddTxForLocalClient = WhetherToIntervene
Intervene
data TryAddTx blk =
NotEnoughSpaceLeft
| TryAddTx
(Maybe (InternalState blk))
(MempoolAddTxResult blk)
(TraceEventMempool blk)
implTryAddTx ::
( MonadSTM m
, LedgerSupportsMempool blk
, HasTxId (GenTx blk)
)
=> StrictTVar m (InternalState blk)
-> LedgerConfig blk
-> WhetherToIntervene
-> GenTx blk
-> STM m (TryAddTx blk)
implTryAddTx :: forall (m :: * -> *) blk.
(MonadSTM m, LedgerSupportsMempool blk, HasTxId (GenTx blk)) =>
StrictTVar m (InternalState blk)
-> LedgerConfig blk
-> WhetherToIntervene
-> GenTx blk
-> STM m (TryAddTx blk)
implTryAddTx StrictTVar m (InternalState blk)
istate LedgerCfg (LedgerState blk)
cfg WhetherToIntervene
wti GenTx blk
tx = do
InternalState blk
is <- StrictTVar m (InternalState blk) -> STM m (InternalState blk)
forall (m :: * -> *) a. MonadSTM m => StrictTVar m a -> STM m a
readTVar StrictTVar m (InternalState blk)
istate
let outcome :: TryAddTx blk
outcome = LedgerCfg (LedgerState blk)
-> WhetherToIntervene
-> GenTx blk
-> InternalState blk
-> TryAddTx blk
forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk)) =>
LedgerCfg (LedgerState blk)
-> WhetherToIntervene
-> GenTx blk
-> InternalState blk
-> TryAddTx blk
pureTryAddTx LedgerCfg (LedgerState blk)
cfg WhetherToIntervene
wti GenTx blk
tx InternalState blk
is
case TryAddTx blk
outcome of
TryAddTx (Just InternalState blk
is') MempoolAddTxResult blk
_ TraceEventMempool blk
_ -> StrictTVar m (InternalState blk) -> InternalState blk -> STM m ()
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
StrictTVar m a -> a -> STM m ()
writeTVar StrictTVar m (InternalState blk)
istate InternalState blk
is'
TryAddTx Maybe (InternalState blk)
Nothing MempoolAddTxResult blk
_ TraceEventMempool blk
_ -> () -> STM m ()
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
TryAddTx blk
NotEnoughSpaceLeft -> () -> STM m ()
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
TryAddTx blk -> STM m (TryAddTx blk)
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return TryAddTx blk
outcome
pureTryAddTx ::
( LedgerSupportsMempool blk
, HasTxId (GenTx blk)
)
=> LedgerCfg (LedgerState blk)
-> WhetherToIntervene
-> GenTx blk
-> InternalState blk
-> TryAddTx blk
pureTryAddTx :: forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk)) =>
LedgerCfg (LedgerState blk)
-> WhetherToIntervene
-> GenTx blk
-> InternalState blk
-> TryAddTx blk
pureTryAddTx LedgerCfg (LedgerState blk)
cfg WhetherToIntervene
wti GenTx blk
tx InternalState blk
is =
case Except (ApplyTxErr blk) (TxMeasure blk)
-> Either (ApplyTxErr blk) (TxMeasure blk)
forall e a. Except e a -> Either e a
runExcept (Except (ApplyTxErr blk) (TxMeasure blk)
-> Either (ApplyTxErr blk) (TxMeasure blk))
-> Except (ApplyTxErr blk) (TxMeasure blk)
-> Either (ApplyTxErr blk) (TxMeasure blk)
forall a b. (a -> b) -> a -> b
$ LedgerCfg (LedgerState blk)
-> TickedLedgerState blk
-> GenTx blk
-> Except (ApplyTxErr blk) (TxMeasure blk)
forall blk.
TxLimits blk =>
LedgerConfig blk
-> TickedLedgerState blk
-> GenTx blk
-> Except (ApplyTxErr blk) (TxMeasure blk)
txMeasure LedgerCfg (LedgerState blk)
cfg (InternalState blk -> TickedLedgerState blk
forall blk. InternalState blk -> TickedLedgerState blk
isLedgerState InternalState blk
is) GenTx blk
tx of
Left ApplyTxErr blk
err ->
Maybe (InternalState blk)
-> MempoolAddTxResult blk -> TraceEventMempool blk -> TryAddTx blk
forall blk.
Maybe (InternalState blk)
-> MempoolAddTxResult blk -> TraceEventMempool blk -> TryAddTx blk
TryAddTx
Maybe (InternalState blk)
forall a. Maybe a
Nothing
(GenTx blk -> ApplyTxErr blk -> MempoolAddTxResult blk
forall blk. GenTx blk -> ApplyTxErr blk -> MempoolAddTxResult blk
MempoolTxRejected GenTx blk
tx ApplyTxErr blk
err)
(GenTx blk -> ApplyTxErr blk -> MempoolSize -> TraceEventMempool blk
forall blk.
GenTx blk -> ApplyTxErr blk -> MempoolSize -> TraceEventMempool blk
TraceMempoolRejectedTx
GenTx blk
tx
ApplyTxErr blk
err
(InternalState blk -> MempoolSize
forall blk. TxLimits blk => InternalState blk -> MempoolSize
isMempoolSize InternalState blk
is)
)
Right TxMeasure blk
txsz
| Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ TxMeasure blk
currentSize TxMeasure blk -> TxMeasure blk -> Bool
forall a. Measure a => a -> a -> Bool
Measure.<= TxMeasure blk
currentSize TxMeasure blk -> TxMeasure blk -> TxMeasure blk
forall a. Measure a => a -> a -> a
`Measure.plus` TxMeasure blk
txsz
->
TryAddTx blk
forall blk. TryAddTx blk
NotEnoughSpaceLeft
| Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ TxMeasure blk
currentSize TxMeasure blk -> TxMeasure blk -> TxMeasure blk
forall a. Measure a => a -> a -> a
`Measure.plus` TxMeasure blk
txsz TxMeasure blk -> TxMeasure blk -> Bool
forall a. Measure a => a -> a -> Bool
Measure.<= InternalState blk -> TxMeasure blk
forall blk. InternalState blk -> TxMeasure blk
isCapacity InternalState blk
is
->
TryAddTx blk
forall blk. TryAddTx blk
NotEnoughSpaceLeft
| Bool
otherwise
->
case LedgerCfg (LedgerState blk)
-> WhetherToIntervene
-> GenTx blk
-> ValidationResult (GenTx blk) blk
-> Either
(ApplyTxErr blk)
(Validated (GenTx blk), ValidationResult (GenTx blk) blk)
forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk)) =>
LedgerConfig blk
-> WhetherToIntervene
-> GenTx blk
-> ValidationResult (GenTx blk) blk
-> Either
(ApplyTxErr blk)
(Validated (GenTx blk), ValidationResult (GenTx blk) blk)
extendVRNew LedgerCfg (LedgerState blk)
cfg WhetherToIntervene
wti GenTx blk
tx (ValidationResult (GenTx blk) blk
-> Either
(ApplyTxErr blk)
(Validated (GenTx blk), ValidationResult (GenTx blk) blk))
-> ValidationResult (GenTx blk) blk
-> Either
(ApplyTxErr blk)
(Validated (GenTx blk), ValidationResult (GenTx blk) blk)
forall a b. (a -> b) -> a -> b
$ InternalState blk -> ValidationResult (GenTx blk) blk
forall blk invalidTx.
InternalState blk -> ValidationResult invalidTx blk
validationResultFromIS InternalState blk
is of
Left ApplyTxErr blk
err ->
Maybe (InternalState blk)
-> MempoolAddTxResult blk -> TraceEventMempool blk -> TryAddTx blk
forall blk.
Maybe (InternalState blk)
-> MempoolAddTxResult blk -> TraceEventMempool blk -> TryAddTx blk
TryAddTx
Maybe (InternalState blk)
forall a. Maybe a
Nothing
(GenTx blk -> ApplyTxErr blk -> MempoolAddTxResult blk
forall blk. GenTx blk -> ApplyTxErr blk -> MempoolAddTxResult blk
MempoolTxRejected GenTx blk
tx ApplyTxErr blk
err)
(GenTx blk -> ApplyTxErr blk -> MempoolSize -> TraceEventMempool blk
forall blk.
GenTx blk -> ApplyTxErr blk -> MempoolSize -> TraceEventMempool blk
TraceMempoolRejectedTx
GenTx blk
tx
ApplyTxErr blk
err
(InternalState blk -> MempoolSize
forall blk. TxLimits blk => InternalState blk -> MempoolSize
isMempoolSize InternalState blk
is)
)
Right (Validated (GenTx blk)
vtx, ValidationResult (GenTx blk) blk
vr) ->
let is' :: InternalState blk
is' = ValidationResult (GenTx blk) blk -> InternalState blk
forall invalidTx blk.
ValidationResult invalidTx blk -> InternalState blk
internalStateFromVR ValidationResult (GenTx blk) blk
vr
in
Bool -> TryAddTx blk -> TryAddTx blk
forall a. HasCallStack => Bool -> a -> a
assert (Maybe (Validated (GenTx blk)) -> Bool
forall a. Maybe a -> Bool
isJust (ValidationResult (GenTx blk) blk -> Maybe (Validated (GenTx blk))
forall invalidTx blk.
ValidationResult invalidTx blk -> Maybe (Validated (GenTx blk))
vrNewValid ValidationResult (GenTx blk) blk
vr)) (TryAddTx blk -> TryAddTx blk) -> TryAddTx blk -> TryAddTx blk
forall a b. (a -> b) -> a -> b
$
Maybe (InternalState blk)
-> MempoolAddTxResult blk -> TraceEventMempool blk -> TryAddTx blk
forall blk.
Maybe (InternalState blk)
-> MempoolAddTxResult blk -> TraceEventMempool blk -> TryAddTx blk
TryAddTx
(InternalState blk -> Maybe (InternalState blk)
forall a. a -> Maybe a
Just InternalState blk
is')
(Validated (GenTx blk) -> MempoolAddTxResult blk
forall blk. Validated (GenTx blk) -> MempoolAddTxResult blk
MempoolTxAdded Validated (GenTx blk)
vtx)
(Validated (GenTx blk)
-> MempoolSize -> MempoolSize -> TraceEventMempool blk
forall blk.
Validated (GenTx blk)
-> MempoolSize -> MempoolSize -> TraceEventMempool blk
TraceMempoolAddedTx
Validated (GenTx blk)
vtx
(InternalState blk -> MempoolSize
forall blk. TxLimits blk => InternalState blk -> MempoolSize
isMempoolSize InternalState blk
is)
(InternalState blk -> MempoolSize
forall blk. TxLimits blk => InternalState blk -> MempoolSize
isMempoolSize InternalState blk
is')
)
where
currentSize :: TxMeasure blk
currentSize = TxSeq (TxMeasure blk) (Validated (GenTx blk)) -> TxMeasure blk
forall sz tx. Measure sz => TxSeq sz tx -> sz
TxSeq.toSize (InternalState blk -> TxSeq (TxMeasure blk) (Validated (GenTx blk))
forall blk.
InternalState blk -> TxSeq (TxMeasure blk) (Validated (GenTx blk))
isTxs InternalState blk
is)
data RemoveTxs blk =
WriteRemoveTxs (InternalState blk) (Maybe (TraceEventMempool blk))
implRemoveTxs ::
( IOLike m
, LedgerSupportsMempool blk
, HasTxId (GenTx blk)
, ValidateEnvelope blk
)
=> MempoolEnv m blk
-> [GenTxId blk]
-> m ()
implRemoveTxs :: forall (m :: * -> *) blk.
(IOLike m, LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
MempoolEnv m blk -> [GenTxId blk] -> m ()
implRemoveTxs MempoolEnv m blk
menv [TxId (GenTx blk)]
txs
| [TxId (GenTx blk)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TxId (GenTx blk)]
txs = () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
| Bool
otherwise = do
Maybe (TraceEventMempool blk)
tr <- STM m (Maybe (TraceEventMempool blk))
-> m (Maybe (TraceEventMempool blk))
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically (STM m (Maybe (TraceEventMempool blk))
-> m (Maybe (TraceEventMempool blk)))
-> STM m (Maybe (TraceEventMempool blk))
-> m (Maybe (TraceEventMempool blk))
forall a b. (a -> b) -> a -> b
$ do
InternalState blk
is <- StrictTVar m (InternalState blk) -> STM m (InternalState blk)
forall (m :: * -> *) a. MonadSTM m => StrictTVar m a -> STM m a
readTVar StrictTVar m (InternalState blk)
istate
LedgerState blk
ls <- LedgerInterface m blk -> STM m (LedgerState blk)
forall (m :: * -> *) blk.
LedgerInterface m blk -> STM m (LedgerState blk)
getCurrentLedgerState LedgerInterface m blk
ldgrInterface
let WriteRemoveTxs InternalState blk
is' Maybe (TraceEventMempool blk)
t = LedgerCfg (LedgerState blk)
-> MempoolCapacityBytesOverride
-> [TxId (GenTx blk)]
-> InternalState blk
-> LedgerState blk
-> RemoveTxs blk
forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
LedgerConfig blk
-> MempoolCapacityBytesOverride
-> [GenTxId blk]
-> InternalState blk
-> LedgerState blk
-> RemoveTxs blk
pureRemoveTxs LedgerCfg (LedgerState blk)
cfg MempoolCapacityBytesOverride
co [TxId (GenTx blk)]
txs InternalState blk
is LedgerState blk
ls
StrictTVar m (InternalState blk) -> InternalState blk -> STM m ()
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
StrictTVar m a -> a -> STM m ()
writeTVar StrictTVar m (InternalState blk)
istate InternalState blk
is'
Maybe (TraceEventMempool blk)
-> STM m (Maybe (TraceEventMempool blk))
forall a. a -> STM m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (TraceEventMempool blk)
t
Maybe (TraceEventMempool blk)
-> (TraceEventMempool blk -> m ()) -> m ()
forall (f :: * -> *) a.
Applicative f =>
Maybe a -> (a -> f ()) -> f ()
whenJust Maybe (TraceEventMempool blk)
tr (Tracer m (TraceEventMempool blk) -> TraceEventMempool blk -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Tracer m (TraceEventMempool blk)
trcr)
where
MempoolEnv { mpEnvStateVar :: forall (m :: * -> *) blk.
MempoolEnv m blk -> StrictTVar m (InternalState blk)
mpEnvStateVar = StrictTVar m (InternalState blk)
istate
, mpEnvLedger :: forall (m :: * -> *) blk. MempoolEnv m blk -> LedgerInterface m blk
mpEnvLedger = LedgerInterface m blk
ldgrInterface
, mpEnvTracer :: forall (m :: * -> *) blk.
MempoolEnv m blk -> Tracer m (TraceEventMempool blk)
mpEnvTracer = Tracer m (TraceEventMempool blk)
trcr
, mpEnvLedgerCfg :: forall (m :: * -> *) blk. MempoolEnv m blk -> LedgerConfig blk
mpEnvLedgerCfg = LedgerCfg (LedgerState blk)
cfg
, mpEnvCapacityOverride :: forall (m :: * -> *) blk.
MempoolEnv m blk -> MempoolCapacityBytesOverride
mpEnvCapacityOverride = MempoolCapacityBytesOverride
co
} = MempoolEnv m blk
menv
pureRemoveTxs ::
( LedgerSupportsMempool blk
, HasTxId (GenTx blk)
, ValidateEnvelope blk
)
=> LedgerConfig blk
-> MempoolCapacityBytesOverride
-> [GenTxId blk]
-> InternalState blk
-> LedgerState blk
-> RemoveTxs blk
pureRemoveTxs :: forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
LedgerConfig blk
-> MempoolCapacityBytesOverride
-> [GenTxId blk]
-> InternalState blk
-> LedgerState blk
-> RemoveTxs blk
pureRemoveTxs LedgerCfg (LedgerState blk)
cfg MempoolCapacityBytesOverride
capacityOverride [TxId (GenTx blk)]
txIds InternalState blk
is LedgerState blk
lstate =
let toRemove :: Set (TxId (GenTx blk))
toRemove = [TxId (GenTx blk)] -> Set (TxId (GenTx blk))
forall a. Ord a => [a] -> Set a
Set.fromList [TxId (GenTx blk)]
txIds
txTickets' :: [TxTicket (TxMeasure blk) (Validated (GenTx blk))]
txTickets' = (TxTicket (TxMeasure blk) (Validated (GenTx blk)) -> Bool)
-> [TxTicket (TxMeasure blk) (Validated (GenTx blk))]
-> [TxTicket (TxMeasure blk) (Validated (GenTx blk))]
forall a. (a -> Bool) -> [a] -> [a]
filter
( (TxId (GenTx blk) -> Set (TxId (GenTx blk)) -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` Set (TxId (GenTx blk))
toRemove)
(TxId (GenTx blk) -> Bool)
-> (TxTicket (TxMeasure blk) (Validated (GenTx blk))
-> TxId (GenTx blk))
-> TxTicket (TxMeasure blk) (Validated (GenTx blk))
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenTx blk -> TxId (GenTx blk)
forall tx. HasTxId tx => tx -> TxId tx
txId
(GenTx blk -> TxId (GenTx blk))
-> (TxTicket (TxMeasure blk) (Validated (GenTx blk)) -> GenTx blk)
-> TxTicket (TxMeasure blk) (Validated (GenTx blk))
-> TxId (GenTx blk)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Validated (GenTx blk) -> GenTx blk
forall blk.
LedgerSupportsMempool blk =>
Validated (GenTx blk) -> GenTx blk
txForgetValidated
(Validated (GenTx blk) -> GenTx blk)
-> (TxTicket (TxMeasure blk) (Validated (GenTx blk))
-> Validated (GenTx blk))
-> TxTicket (TxMeasure blk) (Validated (GenTx blk))
-> GenTx blk
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxTicket (TxMeasure blk) (Validated (GenTx blk))
-> Validated (GenTx blk)
forall sz tx. TxTicket sz tx -> tx
txTicketTx
)
(TxSeq (TxMeasure blk) (Validated (GenTx blk))
-> [TxTicket (TxMeasure blk) (Validated (GenTx blk))]
forall sz tx. TxSeq sz tx -> [TxTicket sz tx]
TxSeq.toList (InternalState blk -> TxSeq (TxMeasure blk) (Validated (GenTx blk))
forall blk.
InternalState blk -> TxSeq (TxMeasure blk) (Validated (GenTx blk))
isTxs InternalState blk
is))
(SlotNo
slot, Ticked (LedgerState blk)
ticked) = LedgerCfg (LedgerState blk)
-> ForgeLedgerState blk -> (SlotNo, Ticked (LedgerState blk))
forall blk.
(UpdateLedger blk, ValidateEnvelope blk) =>
LedgerConfig blk
-> ForgeLedgerState blk -> (SlotNo, TickedLedgerState blk)
tickLedgerState LedgerCfg (LedgerState blk)
cfg (LedgerState blk -> ForgeLedgerState blk
forall blk. LedgerState blk -> ForgeLedgerState blk
ForgeInUnknownSlot LedgerState blk
lstate)
vr :: ValidationResult (Validated (GenTx blk)) blk
vr = MempoolCapacityBytesOverride
-> LedgerCfg (LedgerState blk)
-> SlotNo
-> Ticked (LedgerState blk)
-> TicketNo
-> [TxTicket (TxMeasure blk) (Validated (GenTx blk))]
-> ValidationResult (Validated (GenTx blk)) blk
forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk)) =>
MempoolCapacityBytesOverride
-> LedgerConfig blk
-> SlotNo
-> TickedLedgerState blk
-> TicketNo
-> [TxTicket (TxMeasure blk) (Validated (GenTx blk))]
-> ValidationResult (Validated (GenTx blk)) blk
revalidateTxsFor
MempoolCapacityBytesOverride
capacityOverride
LedgerCfg (LedgerState blk)
cfg
SlotNo
slot
Ticked (LedgerState blk)
ticked
(InternalState blk -> TicketNo
forall blk. InternalState blk -> TicketNo
isLastTicketNo InternalState blk
is)
[TxTicket (TxMeasure blk) (Validated (GenTx blk))]
txTickets'
is' :: InternalState blk
is' = ValidationResult (Validated (GenTx blk)) blk -> InternalState blk
forall invalidTx blk.
ValidationResult invalidTx blk -> InternalState blk
internalStateFromVR ValidationResult (Validated (GenTx blk)) blk
vr
needsTrace :: Maybe (TraceEventMempool blk)
needsTrace = if [TxId (GenTx blk)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TxId (GenTx blk)]
txIds
then
Maybe (TraceEventMempool blk)
forall a. Maybe a
Nothing
else
TraceEventMempool blk -> Maybe (TraceEventMempool blk)
forall a. a -> Maybe a
Just (TraceEventMempool blk -> Maybe (TraceEventMempool blk))
-> TraceEventMempool blk -> Maybe (TraceEventMempool blk)
forall a b. (a -> b) -> a -> b
$ [TxId (GenTx blk)]
-> [Validated (GenTx blk)] -> MempoolSize -> TraceEventMempool blk
forall blk.
[GenTxId blk]
-> [Validated (GenTx blk)] -> MempoolSize -> TraceEventMempool blk
TraceMempoolManuallyRemovedTxs
[TxId (GenTx blk)]
txIds
(((Validated (GenTx blk), ApplyTxErr blk) -> Validated (GenTx blk))
-> [(Validated (GenTx blk), ApplyTxErr blk)]
-> [Validated (GenTx blk)]
forall a b. (a -> b) -> [a] -> [b]
map (Validated (GenTx blk), ApplyTxErr blk) -> Validated (GenTx blk)
forall a b. (a, b) -> a
fst (ValidationResult (Validated (GenTx blk)) blk
-> [(Validated (GenTx blk), ApplyTxErr blk)]
forall invalidTx blk.
ValidationResult invalidTx blk -> [(invalidTx, ApplyTxErr blk)]
vrInvalid ValidationResult (Validated (GenTx blk)) blk
vr))
(InternalState blk -> MempoolSize
forall blk. TxLimits blk => InternalState blk -> MempoolSize
isMempoolSize InternalState blk
is')
in InternalState blk -> Maybe (TraceEventMempool blk) -> RemoveTxs blk
forall blk.
InternalState blk -> Maybe (TraceEventMempool blk) -> RemoveTxs blk
WriteRemoveTxs InternalState blk
is' Maybe (TraceEventMempool blk)
needsTrace
data SyncWithLedger blk =
NewSyncedState (InternalState blk)
(MempoolSnapshot blk)
(Maybe (TraceEventMempool blk))
implSyncWithLedger ::
(
IOLike m
, LedgerSupportsMempool blk
, HasTxId (GenTx blk)
, ValidateEnvelope blk
)
=> MempoolEnv m blk
-> m (MempoolSnapshot blk)
implSyncWithLedger :: forall (m :: * -> *) blk.
(IOLike m, LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
MempoolEnv m blk -> m (MempoolSnapshot blk)
implSyncWithLedger MempoolEnv m blk
menv = do
(Maybe (TraceEventMempool blk)
mTrace, MempoolSnapshot blk
mp) <- STM m (Maybe (TraceEventMempool blk), MempoolSnapshot blk)
-> m (Maybe (TraceEventMempool blk), MempoolSnapshot blk)
forall a. HasCallStack => STM m a -> m a
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
STM m a -> m a
atomically (STM m (Maybe (TraceEventMempool blk), MempoolSnapshot blk)
-> m (Maybe (TraceEventMempool blk), MempoolSnapshot blk))
-> STM m (Maybe (TraceEventMempool blk), MempoolSnapshot blk)
-> m (Maybe (TraceEventMempool blk), MempoolSnapshot blk)
forall a b. (a -> b) -> a -> b
$ do
InternalState blk
is <- StrictTVar m (InternalState blk) -> STM m (InternalState blk)
forall (m :: * -> *) a. MonadSTM m => StrictTVar m a -> STM m a
readTVar StrictTVar m (InternalState blk)
istate
LedgerState blk
ls <- LedgerInterface m blk -> STM m (LedgerState blk)
forall (m :: * -> *) blk.
LedgerInterface m blk -> STM m (LedgerState blk)
getCurrentLedgerState LedgerInterface m blk
ldgrInterface
let NewSyncedState InternalState blk
is' MempoolSnapshot blk
msp Maybe (TraceEventMempool blk)
mTrace = InternalState blk
-> LedgerState blk
-> LedgerCfg (LedgerState blk)
-> MempoolCapacityBytesOverride
-> SyncWithLedger blk
forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
InternalState blk
-> LedgerState blk
-> LedgerConfig blk
-> MempoolCapacityBytesOverride
-> SyncWithLedger blk
pureSyncWithLedger InternalState blk
is LedgerState blk
ls LedgerCfg (LedgerState blk)
cfg MempoolCapacityBytesOverride
co
StrictTVar m (InternalState blk) -> InternalState blk -> STM m ()
forall (m :: * -> *) a.
(MonadSTM m, HasCallStack) =>
StrictTVar m a -> a -> STM m ()
writeTVar StrictTVar m (InternalState blk)
istate InternalState blk
is'
(Maybe (TraceEventMempool blk), MempoolSnapshot blk)
-> STM m (Maybe (TraceEventMempool blk), MempoolSnapshot blk)
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (TraceEventMempool blk)
mTrace, MempoolSnapshot blk
msp)
Maybe (TraceEventMempool blk)
-> (TraceEventMempool blk -> m ()) -> m ()
forall (f :: * -> *) a.
Applicative f =>
Maybe a -> (a -> f ()) -> f ()
whenJust Maybe (TraceEventMempool blk)
mTrace (Tracer m (TraceEventMempool blk) -> TraceEventMempool blk -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
traceWith Tracer m (TraceEventMempool blk)
trcr)
MempoolSnapshot blk -> m (MempoolSnapshot blk)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MempoolSnapshot blk
mp
where
MempoolEnv { mpEnvStateVar :: forall (m :: * -> *) blk.
MempoolEnv m blk -> StrictTVar m (InternalState blk)
mpEnvStateVar = StrictTVar m (InternalState blk)
istate
, mpEnvLedger :: forall (m :: * -> *) blk. MempoolEnv m blk -> LedgerInterface m blk
mpEnvLedger = LedgerInterface m blk
ldgrInterface
, mpEnvTracer :: forall (m :: * -> *) blk.
MempoolEnv m blk -> Tracer m (TraceEventMempool blk)
mpEnvTracer = Tracer m (TraceEventMempool blk)
trcr
, mpEnvLedgerCfg :: forall (m :: * -> *) blk. MempoolEnv m blk -> LedgerConfig blk
mpEnvLedgerCfg = LedgerCfg (LedgerState blk)
cfg
, mpEnvCapacityOverride :: forall (m :: * -> *) blk.
MempoolEnv m blk -> MempoolCapacityBytesOverride
mpEnvCapacityOverride = MempoolCapacityBytesOverride
co
} = MempoolEnv m blk
menv
pureSyncWithLedger ::
(LedgerSupportsMempool blk, HasTxId (GenTx blk), ValidateEnvelope blk)
=> InternalState blk
-> LedgerState blk
-> LedgerConfig blk
-> MempoolCapacityBytesOverride
-> SyncWithLedger blk
pureSyncWithLedger :: forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
InternalState blk
-> LedgerState blk
-> LedgerConfig blk
-> MempoolCapacityBytesOverride
-> SyncWithLedger blk
pureSyncWithLedger InternalState blk
istate LedgerState blk
lstate LedgerCfg (LedgerState blk)
lcfg MempoolCapacityBytesOverride
capacityOverride =
let vr :: ValidationResult (Validated (GenTx blk)) blk
vr = MempoolCapacityBytesOverride
-> LedgerCfg (LedgerState blk)
-> ForgeLedgerState blk
-> InternalState blk
-> ValidationResult (Validated (GenTx blk)) blk
forall blk.
(LedgerSupportsMempool blk, HasTxId (GenTx blk),
ValidateEnvelope blk) =>
MempoolCapacityBytesOverride
-> LedgerConfig blk
-> ForgeLedgerState blk
-> InternalState blk
-> ValidationResult (Validated (GenTx blk)) blk
validateStateFor
MempoolCapacityBytesOverride
capacityOverride
LedgerCfg (LedgerState blk)
lcfg
(LedgerState blk -> ForgeLedgerState blk
forall blk. LedgerState blk -> ForgeLedgerState blk
ForgeInUnknownSlot LedgerState blk
lstate)
InternalState blk
istate
removed :: [(Validated (GenTx blk), ApplyTxErr blk)]
removed = ValidationResult (Validated (GenTx blk)) blk
-> [(Validated (GenTx blk), ApplyTxErr blk)]
forall invalidTx blk.
ValidationResult invalidTx blk -> [(invalidTx, ApplyTxErr blk)]
vrInvalid ValidationResult (Validated (GenTx blk)) blk
vr
istate' :: InternalState blk
istate' = ValidationResult (Validated (GenTx blk)) blk -> InternalState blk
forall invalidTx blk.
ValidationResult invalidTx blk -> InternalState blk
internalStateFromVR ValidationResult (Validated (GenTx blk)) blk
vr
mTrace :: Maybe (TraceEventMempool blk)
mTrace = if [(Validated (GenTx blk), ApplyTxErr blk)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Validated (GenTx blk), ApplyTxErr blk)]
removed
then
Maybe (TraceEventMempool blk)
forall a. Maybe a
Nothing
else
TraceEventMempool blk -> Maybe (TraceEventMempool blk)
forall a. a -> Maybe a
Just (TraceEventMempool blk -> Maybe (TraceEventMempool blk))
-> TraceEventMempool blk -> Maybe (TraceEventMempool blk)
forall a b. (a -> b) -> a -> b
$ [(Validated (GenTx blk), ApplyTxErr blk)]
-> MempoolSize -> TraceEventMempool blk
forall blk.
[(Validated (GenTx blk), ApplyTxErr blk)]
-> MempoolSize -> TraceEventMempool blk
TraceMempoolRemoveTxs [(Validated (GenTx blk), ApplyTxErr blk)]
removed (InternalState blk -> MempoolSize
forall blk. TxLimits blk => InternalState blk -> MempoolSize
isMempoolSize InternalState blk
istate')
snapshot :: MempoolSnapshot blk
snapshot = InternalState blk -> MempoolSnapshot blk
forall blk.
(HasTxId (GenTx blk), TxLimits blk) =>
InternalState blk -> MempoolSnapshot blk
snapshotFromIS InternalState blk
istate'
in
InternalState blk
-> MempoolSnapshot blk
-> Maybe (TraceEventMempool blk)
-> SyncWithLedger blk
forall blk.
InternalState blk
-> MempoolSnapshot blk
-> Maybe (TraceEventMempool blk)
-> SyncWithLedger blk
NewSyncedState InternalState blk
istate' MempoolSnapshot blk
snapshot Maybe (TraceEventMempool blk)
mTrace