mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
7660fff728
commit
375a992f96
|
@ -74,6 +74,7 @@ library
|
||||||
, filepath
|
, filepath
|
||||||
, microlens-platform
|
, microlens-platform
|
||||||
, mtl
|
, mtl
|
||||||
|
, mmap
|
||||||
, prettyprinter
|
, prettyprinter
|
||||||
, random
|
, random
|
||||||
, safe
|
, safe
|
||||||
|
|
|
@ -37,6 +37,9 @@ import Control.Concurrent.STM.TSem
|
||||||
import Safe
|
import Safe
|
||||||
import UnliftIO
|
import UnliftIO
|
||||||
|
|
||||||
|
import Foreign.Ptr
|
||||||
|
import System.IO.MMap
|
||||||
|
|
||||||
-- import System.Posix.IO
|
-- import System.Posix.IO
|
||||||
-- import System.Posix.Fcntl
|
-- import System.Posix.Fcntl
|
||||||
import System.Posix.Types
|
import System.Posix.Types
|
||||||
|
@ -116,14 +119,18 @@ isFresh e = case e of
|
||||||
|
|
||||||
type Bucket = TVar (HashMap ByteString Entry)
|
type Bucket = TVar (HashMap ByteString Entry)
|
||||||
|
|
||||||
|
type MMaped = (Ptr (), Int, Int, Int)
|
||||||
|
|
||||||
data CompactStorage k =
|
data CompactStorage k =
|
||||||
CompactStorage
|
CompactStorage
|
||||||
{ csBuckets :: Int
|
{ csBuckets :: Int
|
||||||
|
, csFile :: FilePath
|
||||||
, csHandle :: MVar Handle
|
, csHandle :: MVar Handle
|
||||||
, csHeaderOff :: TVar EntryOffset
|
, csHeaderOff :: TVar EntryOffset
|
||||||
, csSeq :: TVar Integer
|
, csSeq :: TVar Integer
|
||||||
, csKeys :: Vector Bucket
|
, csKeys :: Vector Bucket
|
||||||
, csUncommitted :: TVar Integer
|
, csUncommitted :: TVar Integer
|
||||||
|
, csMMapped :: TVar MMaped
|
||||||
}
|
}
|
||||||
|
|
||||||
type ForCompactStorage m = MonadIO m
|
type ForCompactStorage m = MonadIO m
|
||||||
|
@ -145,19 +152,6 @@ getBucket sto bs = do
|
||||||
{-# INLINE getBucket #-}
|
{-# INLINE getBucket #-}
|
||||||
|
|
||||||
|
|
||||||
-- openFileForReadWrite :: FilePath -> IO (Fd, Fd)
|
|
||||||
-- openFileForReadWrite fp = do
|
|
||||||
-- fdW <- openFd fp ReadWrite (Just ownerModes) defaultFileFlags { nonBlock = True }
|
|
||||||
-- fdR <- openFd fp ReadOnly Nothing defaultFileFlags { nonBlock = True }
|
|
||||||
-- return (fdW, fdR)
|
|
||||||
|
|
||||||
-- -- Преобразование Fd в Handle
|
|
||||||
-- fdToHandleReadWrite :: (Fd, Fd) -> IO (Handle, Handle)
|
|
||||||
-- fdToHandleReadWrite (fdW, fdR) = do
|
|
||||||
-- haW <- fdToHandle fdW
|
|
||||||
-- haR <- fdToHandle fdR
|
|
||||||
-- return (haW, haR)
|
|
||||||
|
|
||||||
compactStorageOpen :: ForCompactStorage m
|
compactStorageOpen :: ForCompactStorage m
|
||||||
=> [CompactStorageOpenOpt]
|
=> [CompactStorageOpenOpt]
|
||||||
-> FilePath
|
-> FilePath
|
||||||
|
@ -179,12 +173,15 @@ compactStorageOpen _ fp = do
|
||||||
|
|
||||||
ss <- newTVarIO 0
|
ss <- newTVarIO 0
|
||||||
|
|
||||||
|
mmapped <- liftIO (mmapFilePtr fp ReadOnly (Just (0, fromIntegral sz)))
|
||||||
|
>>= newTVarIO
|
||||||
|
|
||||||
if sz == 0 then
|
if sz == 0 then
|
||||||
pure $ CompactStorage buck mha hoff0 ss keys0 uncommitted
|
pure $ CompactStorage buck fp mha hoff0 ss keys0 uncommitted mmapped
|
||||||
else do
|
else do
|
||||||
(p,header) <- readHeader mha Nothing >>= maybe (throwIO InvalidHeader) pure
|
(p,header) <- readHeader mha Nothing >>= maybe (throwIO InvalidHeader) pure
|
||||||
hoff <- newTVarIO p
|
hoff <- newTVarIO p
|
||||||
let sto = CompactStorage buck mha hoff ss keys0 uncommitted
|
let sto = CompactStorage buck fp mha hoff ss keys0 uncommitted mmapped
|
||||||
readIndex sto (hdrIndexOffset header) (hdrIndexEntries header)
|
readIndex sto (hdrIndexOffset header) (hdrIndexEntries header)
|
||||||
|
|
||||||
flip fix (hdrPrev header) $ \next -> \case
|
flip fix (hdrPrev header) $ \next -> \case
|
||||||
|
@ -302,6 +299,10 @@ compactStorageCommit sto = liftIO do
|
||||||
|
|
||||||
offLast <- hTell ha <&> fromIntegral
|
offLast <- hTell ha <&> fromIntegral
|
||||||
|
|
||||||
|
sz <- hFileSize ha
|
||||||
|
|
||||||
|
remapFile sz
|
||||||
|
|
||||||
atomically do
|
atomically do
|
||||||
writeTVar (csHeaderOff sto) (offLast - headerSize 1)
|
writeTVar (csHeaderOff sto) (offLast - headerSize 1)
|
||||||
for_ idxEntries $ \(e,i) -> do
|
for_ idxEntries $ \(e,i) -> do
|
||||||
|
@ -324,6 +325,13 @@ compactStorageCommit sto = liftIO do
|
||||||
getSeq = \case
|
getSeq = \case
|
||||||
Entry i _ -> i
|
Entry i _ -> i
|
||||||
|
|
||||||
|
remapFile :: ForCompactStorage m => Integer -> m ()
|
||||||
|
remapFile sz = do
|
||||||
|
let fp = csFile sto
|
||||||
|
unmapFile sto
|
||||||
|
mmapped <- liftIO (mmapFilePtr fp ReadOnly (Just (0, fromIntegral sz)))
|
||||||
|
atomically (writeTVar (csMMapped sto) mmapped)
|
||||||
|
|
||||||
compactStorageDel :: ForCompactStorage m => CompactStorage k -> ByteString -> m ()
|
compactStorageDel :: ForCompactStorage m => CompactStorage k -> ByteString -> m ()
|
||||||
compactStorageDel sto key = do
|
compactStorageDel sto key = do
|
||||||
|
|
||||||
|
@ -404,11 +412,22 @@ compactStorageExists sto key = do
|
||||||
Just (Entry _ (Off e)) -> pure (Just (fromIntegral $ idxEntrySize e))
|
Just (Entry _ (Off e)) -> pure (Just (fromIntegral $ idxEntrySize e))
|
||||||
_ -> pure Nothing
|
_ -> pure Nothing
|
||||||
|
|
||||||
|
unmapFile :: ForCompactStorage m => CompactStorage sto -> m ()
|
||||||
|
unmapFile sto = do
|
||||||
|
mmapped <- readTVarIO (csMMapped sto)
|
||||||
|
liftIO $ munmapFilePtr (view _1 mmapped) (view _2 mmapped)
|
||||||
|
-- NOTE: mmapped-is-invalid-now
|
||||||
|
-- если теперь позвать что-то, что
|
||||||
|
-- читает из этого мапинга -- то всё грохнется
|
||||||
|
|
||||||
|
|
||||||
compactStorageClose :: ForCompactStorage m => CompactStorage k -> m ()
|
compactStorageClose :: ForCompactStorage m => CompactStorage k -> m ()
|
||||||
compactStorageClose sto = do
|
compactStorageClose sto = do
|
||||||
compactStorageCommit sto
|
compactStorageCommit sto
|
||||||
-- FIXME: hangs-forever-on-io-exception
|
-- FIXME: hangs-forever-on-io-exception
|
||||||
liftIO $ withMVar (csHandle sto) hClose
|
liftIO $ do
|
||||||
|
unmapFile sto
|
||||||
|
withMVar (csHandle sto) hClose
|
||||||
|
|
||||||
compactStorageFindLiveHeads :: ForCompactStorage m
|
compactStorageFindLiveHeads :: ForCompactStorage m
|
||||||
=> FilePath
|
=> FilePath
|
||||||
|
|
Loading…
Reference in New Issue