Skip to content

Commit 0cf251d

Browse files
committed
Add BlobFile.writeBlob and use it in WriteBufferBlobs
It's a bit harder to provide something for RunBuilder since it has its own infrastructure for updating CRCs along with writing.
1 parent 68caad0 commit 0cf251d

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

src/Database/LSMTree/Internal/BlobFile.hs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Database.LSMTree.Internal.BlobFile (
55
, RemoveFileOnClose (..)
66
, openBlobFile
77
, readBlob
8+
, writeBlob
89
) where
910

1011
import Control.DeepSeq (NFData (..))
@@ -13,8 +14,8 @@ import Control.Monad.Class.MonadThrow (MonadMask, MonadThrow)
1314
import Control.Monad.Primitive (PrimMonad)
1415
import Control.RefCount (RefCounter)
1516
import qualified Control.RefCount as RC
16-
import qualified Data.Primitive.ByteArray as P (newPinnedByteArray,
17-
unsafeFreezeByteArray)
17+
import qualified Data.Primitive.ByteArray as P
18+
import qualified Data.Vector.Primitive as VP
1819
import Data.Word (Word32, Word64)
1920
import qualified Database.LSMTree.Internal.RawBytes as RB
2021
import Database.LSMTree.Internal.Serialise (SerialisedBlob (..))
@@ -103,3 +104,21 @@ readBlob fs BlobFile {blobFileHandle}
103104
ba <- P.unsafeFreezeByteArray mba
104105
let !rb = RB.fromByteArray 0 len ba
105106
return (SerialisedBlob rb)
107+
108+
{-# SPECIALISE writeBlob :: HasFS IO h -> BlobFile IO h -> SerialisedBlob -> Word64 -> IO () #-}
109+
writeBlob ::
110+
(MonadThrow m, PrimMonad m)
111+
=> HasFS m h
112+
-> BlobFile m h
113+
-> SerialisedBlob
114+
-> Word64
115+
-> m ()
116+
writeBlob fs BlobFile {blobFileHandle}
117+
(SerialisedBlob' (VP.Vector boff blen ba)) off = do
118+
mba <- P.unsafeThawByteArray ba
119+
_ <- FS.hPutBufExactlyAt
120+
fs blobFileHandle mba
121+
(FS.BufferOffset boff)
122+
(fromIntegral blen :: FS.ByteCount)
123+
(FS.AbsOffset off)
124+
return ()

src/Database/LSMTree/Internal/RunBuilder.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ copyBlob ::
285285
copyBlob builder@RunBuilder {..} blobref = do
286286
blob <- BlobRef.readRawBlobRef runBuilderHasFS blobref
287287
writeBlob builder blob
288-
--TODO: consier adding write blob functions to BlobFile
289-
-- variants: at offset, at file pointer with CRC update.
288+
--TODO: can't easily switch this to use BlobFile.writeBlob because
289+
-- RunBuilder currently does everything uniformly with ChecksumHandle.
290290

291291
{-# SPECIALISE writeFilter ::
292292
RunBuilder IO h

src/Database/LSMTree/Internal/WriteBufferBlobs.hs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ import Control.DeepSeq (NFData (..))
3737
import Control.Monad.Class.MonadThrow
3838
import Control.Monad.Primitive (PrimMonad, PrimState)
3939
import qualified Control.RefCount as RC
40-
import Data.Primitive.ByteArray as P
4140
import Data.Primitive.PrimVar as P
42-
import qualified Data.Vector.Primitive as VP
4341
import Data.Word (Word64)
4442
import Database.LSMTree.Internal.BlobFile hiding (removeReference)
4543
import qualified Database.LSMTree.Internal.BlobFile as BlobFile
@@ -48,7 +46,6 @@ import Database.LSMTree.Internal.BlobRef (RawBlobRef (..),
4846
import Database.LSMTree.Internal.Serialise
4947
import qualified System.FS.API as FS
5048
import System.FS.API (HasFS)
51-
import qualified System.Posix.Types as FS (ByteCount)
5249

5350
-- | A single 'WriteBufferBlobs' may be shared between multiple tables.
5451
-- As a consequence of being shared, the management of the shared state has to
@@ -148,28 +145,12 @@ addBlob :: (PrimMonad m, MonadThrow m)
148145
addBlob fs WriteBufferBlobs {blobFile, blobFilePointer} blob = do
149146
let blobsize = sizeofBlob blob
150147
bloboffset <- updateFilePointer blobFilePointer blobsize
151-
writeBlobAtOffset fs (blobFileHandle blobFile) blob bloboffset
148+
BlobFile.writeBlob fs blobFile blob bloboffset
152149
return BlobSpan {
153150
blobSpanOffset = bloboffset,
154151
blobSpanSize = fromIntegral blobsize
155152
}
156153

157-
{-# SPECIALISE writeBlobAtOffset :: HasFS IO h -> FS.Handle h -> SerialisedBlob -> Word64 -> IO () #-}
158-
writeBlobAtOffset :: (PrimMonad m, MonadThrow m)
159-
=> HasFS m h
160-
-> FS.Handle h
161-
-> SerialisedBlob
162-
-> Word64
163-
-> m ()
164-
writeBlobAtOffset fs h (SerialisedBlob' (VP.Vector boff blen ba)) off = do
165-
mba <- P.unsafeThawByteArray ba
166-
_ <- FS.hPutBufExactlyAt
167-
fs h mba
168-
(FS.BufferOffset boff)
169-
(fromIntegral blen :: FS.ByteCount)
170-
(FS.AbsOffset off)
171-
return ()
172-
173154
-- | Helper function to make a 'RawBlobRef' that points into a
174155
-- 'WriteBufferBlobs'.
175156
mkRawBlobRef :: WriteBufferBlobs m h

0 commit comments

Comments
 (0)