@@ -24,14 +24,12 @@ import Control.Monad (when)
2424import Control.Monad.Class.MonadThrow (Exception , MonadMask ,
2525 MonadThrow (.. ), bracket , throwIO )
2626import Control.Monad.Primitive
27- import Control.RefCount (RefCounter )
2827import qualified Control.RefCount as RC
2928import Data.Coerce (coerce )
30- import qualified Data.Primitive.ByteArray as P (MutableByteArray ,
31- newPinnedByteArray , unsafeFreezeByteArray )
29+ import qualified Data.Primitive.ByteArray as P (MutableByteArray )
3230import qualified Data.Vector as V
33- import Database.LSMTree.Internal.BlobFile (BlobSpan (.. ))
34- import qualified Database.LSMTree.Internal.RawBytes as RB
31+ import Database.LSMTree.Internal.BlobFile (BlobFile ( .. ), BlobSpan (.. ))
32+ import qualified Database.LSMTree.Internal.BlobFile as BlobFile
3533import Database.LSMTree.Internal.Serialise (SerialisedBlob (.. ))
3634import qualified System.FS.API as FS
3735import System.FS.API (HasFS )
@@ -48,17 +46,16 @@ import qualified System.FS.BlockIO.API as FS
4846-- Thus these cannot be handed out via the API. Use 'WeakBlobRef' for that.
4947--
5048data RawBlobRef m h = RawBlobRef {
51- blobRefFile :: ! (FS. Handle h )
52- , blobRefCount :: {-# UNPACK #-} ! (RefCounter m )
53- , blobRefSpan :: {-# UNPACK #-} ! BlobSpan
49+ rawBlobRefFile :: {-# NOUNPACK #-} ! (BlobFile m h )
50+ , rawBlobRefSpan :: {-# UNPACK #-} ! BlobSpan
5451 }
5552 deriving stock (Show )
5653
5754instance NFData h => NFData (RawBlobRef m h ) where
58- rnf (RawBlobRef a b c ) = rnf a `seq` rnf b `seq` rnf c
55+ rnf (RawBlobRef a b) = rnf a `seq` rnf b
5956
6057blobRefSpanSize :: RawBlobRef m h -> Int
61- blobRefSpanSize = fromIntegral . blobSpanSize . blobRefSpan
58+ blobRefSpanSize = fromIntegral . blobSpanSize . rawBlobRefSpan
6259
6360-- | A \"weak\" reference to a blob within a blob file. These are the ones we
6461-- can return in the public API and can outlive their parent table.
@@ -117,7 +114,7 @@ deRefWeakBlobRef ::
117114 => WeakBlobRef m h
118115 -> m (RawBlobRef m h )
119116deRefWeakBlobRef (WeakBlobRef ref) = do
120- ok <- RC. upgradeWeakReference (blobRefCount ref)
117+ ok <- RC. upgradeWeakReference (blobFileRefCounter (rawBlobRefFile ref) )
121118 when (not ok) $ throwIO (WeakBlobRefInvalid 0 )
122119 pure ref
123120
@@ -133,7 +130,7 @@ deRefWeakBlobRefs wrefs = do
133130 let refs :: V. Vector (RawBlobRef m h )
134131 refs = coerce wrefs -- safely coerce away the newtype wrappers
135132 V. iforM_ wrefs $ \ i (WeakBlobRef ref) -> do
136- ok <- RC. upgradeWeakReference (blobRefCount ref)
133+ ok <- RC. upgradeWeakReference (blobFileRefCounter (rawBlobRefFile ref) )
137134 when (not ok) $ do
138135 -- drop refs on the previous ones taken successfully so far
139136 V. mapM_ removeReference (V. take i refs)
@@ -142,7 +139,7 @@ deRefWeakBlobRefs wrefs = do
142139
143140{-# SPECIALISE removeReference :: RawBlobRef IO h -> IO () #-}
144141removeReference :: (MonadMask m , PrimMonad m ) => RawBlobRef m h -> m ()
145- removeReference = RC . removeReference . blobRefCount
142+ removeReference = BlobFile . removeReference . rawBlobRefFile
146143
147144{-# SPECIALISE removeReferences :: V.Vector (RawBlobRef IO h) -> IO () #-}
148145removeReferences :: (MonadMask m , PrimMonad m ) => V. Vector (RawBlobRef m h ) -> m ()
@@ -157,31 +154,20 @@ readBlob ::
157154 => HasFS m h
158155 -> RawBlobRef m h
159156 -> m SerialisedBlob
160- readBlob fs RawBlobRef {
161- blobRefFile,
162- blobRefSpan = BlobSpan {blobSpanOffset, blobSpanSize}
163- } = do
164- let off = FS. AbsOffset blobSpanOffset
165- len :: Int
166- len = fromIntegral blobSpanSize
167- mba <- P. newPinnedByteArray len
168- _ <- FS. hGetBufExactlyAt fs blobRefFile mba 0
169- (fromIntegral len :: FS. ByteCount ) off
170- ba <- P. unsafeFreezeByteArray mba
171- let ! rb = RB. fromByteArray 0 len ba
172- return (SerialisedBlob rb)
157+ readBlob fs RawBlobRef {rawBlobRefFile, rawBlobRefSpan} =
158+ BlobFile. readBlobFile fs rawBlobRefFile rawBlobRefSpan
173159
174160readBlobIOOp ::
175161 P. MutableByteArray s -> Int
176162 -> RawBlobRef m h
177163 -> FS. IOOp s h
178164readBlobIOOp buf bufoff
179165 RawBlobRef {
180- blobRefFile ,
181- blobRefSpan = BlobSpan {blobSpanOffset, blobSpanSize}
166+ rawBlobRefFile = BlobFile {blobFileHandle} ,
167+ rawBlobRefSpan = BlobSpan {blobSpanOffset, blobSpanSize}
182168 } =
183169 FS. IOOpRead
184- blobRefFile
170+ blobFileHandle
185171 (fromIntegral blobSpanOffset :: FS. FileOffset )
186172 buf (FS. BufferOffset bufoff)
187173 (fromIntegral blobSpanSize :: FS. ByteCount )
0 commit comments