{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE RankNTypes #-}
module Ouroboros.Consensus.Storage.LeiosDB.API
(
LeiosDbHandle (..)
, LeiosDbStats (..)
, LeiosEbNotification (..)
, LeiosDbReader (..)
, withReader
, allocateReader
, LeiosDbWriter (..)
, Promise (..)
, awaitAll
, withWriter
, allocateWriter
, CompletedEbs
) where
import Cardano.Slotting.Slot (SlotNo)
import Control.Concurrent.Class.MonadSTM.Strict (StrictTChan)
import Control.ResourceRegistry (ResourceRegistry, allocate)
import Data.ByteString (ByteString)
import Data.Foldable (traverse_)
import GHC.Stack (HasCallStack)
import NoThunks.Class (OnlyCheckWhnfNamed (..))
import Ouroboros.Consensus.Leios.Types
( BytesSize
, EbHash
, LeiosEb
, LeiosPoint
, TxHash
)
import Ouroboros.Consensus.Storage.LeiosDB.Trace (LeiosDbStats (..))
import Ouroboros.Consensus.Util.IOLike (IOLike, MonadThrow, NoThunks (..), bracket)
data LeiosDbHandle m = LeiosDbHandle
{ forall (m :: * -> *). LeiosDbHandle m -> m ()
closeLeiosDbHandle :: m ()
, forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m (LeiosDbReader m)
openReader :: HasCallStack => m (LeiosDbReader m)
, forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m (LeiosDbWriter m)
openWriter :: HasCallStack => m (LeiosDbWriter m)
, forall (m :: * -> *).
LeiosDbHandle m
-> HasCallStack => m (StrictTChan m LeiosEbNotification)
subscribeEbNotifications :: HasCallStack => m (StrictTChan m LeiosEbNotification)
, forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => SlotNo -> m ()
leiosDbGarbageCollect :: HasCallStack => SlotNo -> m ()
, forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => [LeiosPoint] -> m ()
leiosDbPromoteToImmutable :: HasCallStack => [LeiosPoint] -> m ()
, forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m LeiosDbStats
leiosDbSampleStats :: HasCallStack => m LeiosDbStats
}
deriving Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo)
Proxy (LeiosDbHandle m) -> String
(Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo))
-> (Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo))
-> (Proxy (LeiosDbHandle m) -> String)
-> NoThunks (LeiosDbHandle m)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
forall (m :: * -> *).
Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo)
forall (m :: * -> *). Proxy (LeiosDbHandle m) -> String
$cnoThunks :: forall (m :: * -> *).
Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo)
noThunks :: Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall (m :: * -> *).
Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> LeiosDbHandle m -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall (m :: * -> *). Proxy (LeiosDbHandle m) -> String
showTypeOf :: Proxy (LeiosDbHandle m) -> String
NoThunks via OnlyCheckWhnfNamed "LeiosDbHandle" (LeiosDbHandle m)
data LeiosDbReader m = LeiosDbReader
{ forall (m :: * -> *). LeiosDbReader m -> m ()
closeReader :: m ()
, forall (m :: * -> *).
LeiosDbReader m
-> HasCallStack => EbHash -> m [(TxHash, BytesSize)]
lookupEbBody :: HasCallStack => EbHash -> m [(TxHash, BytesSize)]
, forall (m :: * -> *).
LeiosDbReader m
-> HasCallStack => EbHash -> m (Maybe [(TxHash, ByteString)])
lookupEbClosure :: HasCallStack => EbHash -> m (Maybe [(TxHash, ByteString)])
, forall (m :: * -> *).
LeiosDbReader m
-> HasCallStack =>
EbHash -> [Int] -> m [(Int, TxHash, Maybe ByteString)]
batchRetrieveTxs ::
HasCallStack =>
EbHash -> [Int] -> m [(Int, TxHash, Maybe ByteString)]
, forall (m :: * -> *).
LeiosDbReader m -> HasCallStack => m [(SlotNo, EbHash)]
testScanEbPoints :: HasCallStack => m [(SlotNo, EbHash)]
, forall (m :: * -> *).
LeiosDbReader m -> HasCallStack => SlotNo -> m [LeiosPoint]
scanCompleteEbClosuresNotOlderThanSlot ::
HasCallStack =>
SlotNo -> m [LeiosPoint]
}
deriving Context -> LeiosDbReader m -> IO (Maybe ThunkInfo)
Proxy (LeiosDbReader m) -> String
(Context -> LeiosDbReader m -> IO (Maybe ThunkInfo))
-> (Context -> LeiosDbReader m -> IO (Maybe ThunkInfo))
-> (Proxy (LeiosDbReader m) -> String)
-> NoThunks (LeiosDbReader m)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
forall (m :: * -> *).
Context -> LeiosDbReader m -> IO (Maybe ThunkInfo)
forall (m :: * -> *). Proxy (LeiosDbReader m) -> String
$cnoThunks :: forall (m :: * -> *).
Context -> LeiosDbReader m -> IO (Maybe ThunkInfo)
noThunks :: Context -> LeiosDbReader m -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall (m :: * -> *).
Context -> LeiosDbReader m -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> LeiosDbReader m -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall (m :: * -> *). Proxy (LeiosDbReader m) -> String
showTypeOf :: Proxy (LeiosDbReader m) -> String
NoThunks via OnlyCheckWhnfNamed "LeiosDbReader" (LeiosDbReader m)
data LeiosDbWriter m = LeiosDbWriter
{ forall (m :: * -> *). LeiosDbWriter m -> m ()
closeWriter :: m ()
, forall (m :: * -> *).
LeiosDbWriter m
-> HasCallStack => LeiosPoint -> BytesSize -> m (Promise m ())
writeEbPoint :: HasCallStack => LeiosPoint -> BytesSize -> m (Promise m ())
, forall (m :: * -> *).
LeiosDbWriter m
-> HasCallStack =>
LeiosPoint -> LeiosEb -> m (Promise m [LeiosPoint])
writeEbBody :: HasCallStack => LeiosPoint -> LeiosEb -> m (Promise m CompletedEbs)
, forall (m :: * -> *).
LeiosDbWriter m
-> HasCallStack =>
[(TxHash, ByteString)] -> m (Promise m [LeiosPoint])
writeTxs ::
HasCallStack =>
[(TxHash, ByteString)] -> m (Promise m CompletedEbs)
}
deriving Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo)
Proxy (LeiosDbWriter m) -> String
(Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo))
-> (Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo))
-> (Proxy (LeiosDbWriter m) -> String)
-> NoThunks (LeiosDbWriter m)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
forall (m :: * -> *).
Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo)
forall (m :: * -> *). Proxy (LeiosDbWriter m) -> String
$cnoThunks :: forall (m :: * -> *).
Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo)
noThunks :: Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall (m :: * -> *).
Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> LeiosDbWriter m -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall (m :: * -> *). Proxy (LeiosDbWriter m) -> String
showTypeOf :: Proxy (LeiosDbWriter m) -> String
NoThunks via OnlyCheckWhnfNamed "LeiosDbWriter" (LeiosDbWriter m)
newtype Promise m a = Promise {forall (m :: * -> *) a. Promise m a -> m a
await :: m a}
deriving stock (forall a b. (a -> b) -> Promise m a -> Promise m b)
-> (forall a b. a -> Promise m b -> Promise m a)
-> Functor (Promise m)
forall a b. a -> Promise m b -> Promise m a
forall a b. (a -> b) -> Promise m a -> Promise m b
forall (m :: * -> *) a b.
Functor m =>
a -> Promise m b -> Promise m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> Promise m a -> Promise m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> Promise m a -> Promise m b
fmap :: forall a b. (a -> b) -> Promise m a -> Promise m b
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> Promise m b -> Promise m a
<$ :: forall a b. a -> Promise m b -> Promise m a
Functor
awaitAll :: (Foldable t, Applicative m) => t (Promise m ()) -> m ()
awaitAll :: forall (t :: * -> *) (m :: * -> *).
(Foldable t, Applicative m) =>
t (Promise m ()) -> m ()
awaitAll = (Promise m () -> m ()) -> t (Promise m ()) -> m ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ Promise m () -> m ()
forall (m :: * -> *) a. Promise m a -> m a
await
type CompletedEbs = [LeiosPoint]
data LeiosEbNotification
=
AcquiredEb
LeiosPoint
BytesSize
|
AcquiredEbTxs
LeiosPoint
withReader :: MonadThrow m => LeiosDbHandle m -> (LeiosDbReader m -> m a) -> m a
withReader :: forall (m :: * -> *) a.
MonadThrow m =>
LeiosDbHandle m -> (LeiosDbReader m -> m a) -> m a
withReader LeiosDbHandle m
db = m (LeiosDbReader m)
-> (LeiosDbReader m -> m ()) -> (LeiosDbReader m -> m a) -> m a
forall a b c. m a -> (a -> m b) -> (a -> m c) -> m c
forall (m :: * -> *) a b c.
MonadThrow m =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket (LeiosDbHandle m -> HasCallStack => m (LeiosDbReader m)
forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m (LeiosDbReader m)
openReader LeiosDbHandle m
db) LeiosDbReader m -> m ()
forall (m :: * -> *). LeiosDbReader m -> m ()
closeReader
withWriter :: MonadThrow m => LeiosDbHandle m -> (LeiosDbWriter m -> m a) -> m a
withWriter :: forall (m :: * -> *) a.
MonadThrow m =>
LeiosDbHandle m -> (LeiosDbWriter m -> m a) -> m a
withWriter LeiosDbHandle m
db = m (LeiosDbWriter m)
-> (LeiosDbWriter m -> m ()) -> (LeiosDbWriter m -> m a) -> m a
forall a b c. m a -> (a -> m b) -> (a -> m c) -> m c
forall (m :: * -> *) a b c.
MonadThrow m =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket (LeiosDbHandle m -> HasCallStack => m (LeiosDbWriter m)
forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m (LeiosDbWriter m)
openWriter LeiosDbHandle m
db) LeiosDbWriter m -> m ()
forall (m :: * -> *). LeiosDbWriter m -> m ()
closeWriter
allocateReader :: IOLike m => ResourceRegistry m -> LeiosDbHandle m -> m (LeiosDbReader m)
allocateReader :: forall (m :: * -> *).
IOLike m =>
ResourceRegistry m -> LeiosDbHandle m -> m (LeiosDbReader m)
allocateReader ResourceRegistry m
registry LeiosDbHandle m
db = (ResourceKey m, LeiosDbReader m) -> LeiosDbReader m
forall a b. (a, b) -> b
snd ((ResourceKey m, LeiosDbReader m) -> LeiosDbReader m)
-> m (ResourceKey m, LeiosDbReader m) -> m (LeiosDbReader m)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ResourceRegistry m
-> (ResourceId -> m (LeiosDbReader m))
-> (LeiosDbReader m -> m ())
-> m (ResourceKey m, LeiosDbReader m)
forall (m :: * -> *) a.
(MonadSTM m, MonadMask m, MonadThread m, MonadEvaluate m,
HasCallStack) =>
ResourceRegistry m
-> (ResourceId -> m a) -> (a -> m ()) -> m (ResourceKey m, a)
allocate ResourceRegistry m
registry (\ResourceId
_ -> LeiosDbHandle m -> HasCallStack => m (LeiosDbReader m)
forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m (LeiosDbReader m)
openReader LeiosDbHandle m
db) LeiosDbReader m -> m ()
forall (m :: * -> *). LeiosDbReader m -> m ()
closeReader
allocateWriter :: IOLike m => ResourceRegistry m -> LeiosDbHandle m -> m (LeiosDbWriter m)
allocateWriter :: forall (m :: * -> *).
IOLike m =>
ResourceRegistry m -> LeiosDbHandle m -> m (LeiosDbWriter m)
allocateWriter ResourceRegistry m
registry LeiosDbHandle m
db = (ResourceKey m, LeiosDbWriter m) -> LeiosDbWriter m
forall a b. (a, b) -> b
snd ((ResourceKey m, LeiosDbWriter m) -> LeiosDbWriter m)
-> m (ResourceKey m, LeiosDbWriter m) -> m (LeiosDbWriter m)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ResourceRegistry m
-> (ResourceId -> m (LeiosDbWriter m))
-> (LeiosDbWriter m -> m ())
-> m (ResourceKey m, LeiosDbWriter m)
forall (m :: * -> *) a.
(MonadSTM m, MonadMask m, MonadThread m, MonadEvaluate m,
HasCallStack) =>
ResourceRegistry m
-> (ResourceId -> m a) -> (a -> m ()) -> m (ResourceKey m, a)
allocate ResourceRegistry m
registry (\ResourceId
_ -> LeiosDbHandle m -> HasCallStack => m (LeiosDbWriter m)
forall (m :: * -> *).
LeiosDbHandle m -> HasCallStack => m (LeiosDbWriter m)
openWriter LeiosDbHandle m
db) LeiosDbWriter m -> m ()
forall (m :: * -> *). LeiosDbWriter m -> m ()
closeWriter