wip, compactStorageGet suck less now

This commit is contained in:
Dmitry Zuikov 2024-06-02 09:04:17 +03:00
parent 375a992f96
commit c679462284
2 changed files with 13 additions and 28 deletions

View File

@ -72,6 +72,7 @@ library
, containers , containers
, directory , directory
, filepath , filepath
, memory
, microlens-platform , microlens-platform
, mtl , mtl
, mmap , mmap

View File

@ -7,8 +7,9 @@ import HBS2.Clock
import HBS2.Hash import HBS2.Hash
import HBS2.Storage import HBS2.Storage
import Data.Word import Data.Word
import Data.ByteArray qualified as BA
import Data.ByteArray (MemView(..))
import Data.ByteString (ByteString) import Data.ByteString (ByteString)
import Data.ByteString qualified as BS import Data.ByteString qualified as BS
import Data.ByteString.Lazy qualified as LBS import Data.ByteString.Lazy qualified as LBS
@ -40,10 +41,6 @@ import UnliftIO
import Foreign.Ptr import Foreign.Ptr
import System.IO.MMap import System.IO.MMap
-- import System.Posix.IO
-- import System.Posix.Fcntl
import System.Posix.Types
import Debug.Trace import Debug.Trace
-- compact storage -- compact storage
@ -119,7 +116,7 @@ isFresh e = case e of
type Bucket = TVar (HashMap ByteString Entry) type Bucket = TVar (HashMap ByteString Entry)
type MMaped = (Ptr (), Int, Int, Int) type MMaped = (Ptr Word8, Int, Int, Int)
data CompactStorage k = data CompactStorage k =
CompactStorage CompactStorage
@ -173,7 +170,7 @@ compactStorageOpen _ fp = do
ss <- newTVarIO 0 ss <- newTVarIO 0
mmapped <- liftIO (mmapFilePtr fp ReadOnly (Just (0, fromIntegral sz))) mmapped <- liftIO (mmapFilePtr fp ReadOnly Nothing)
>>= newTVarIO >>= newTVarIO
if sz == 0 then if sz == 0 then
@ -301,7 +298,7 @@ compactStorageCommit sto = liftIO do
sz <- hFileSize ha sz <- hFileSize ha
remapFile sz remapFile
atomically do atomically do
writeTVar (csHeaderOff sto) (offLast - headerSize 1) writeTVar (csHeaderOff sto) (offLast - headerSize 1)
@ -325,11 +322,11 @@ compactStorageCommit sto = liftIO do
getSeq = \case getSeq = \case
Entry i _ -> i Entry i _ -> i
remapFile :: ForCompactStorage m => Integer -> m () remapFile :: ForCompactStorage m => m ()
remapFile sz = do remapFile = do
let fp = csFile sto let fp = csFile sto
unmapFile sto unmapFile sto
mmapped <- liftIO (mmapFilePtr fp ReadOnly (Just (0, fromIntegral sz))) mmapped <- liftIO (mmapFilePtr fp ReadOnly Nothing)
atomically (writeTVar (csMMapped sto) mmapped) atomically (writeTVar (csMMapped sto) mmapped)
compactStorageDel :: ForCompactStorage m => CompactStorage k -> ByteString -> m () compactStorageDel :: ForCompactStorage m => CompactStorage k -> ByteString -> m ()
@ -373,17 +370,6 @@ compactStoragePut sto k v = do
c <- newSequenceSTM sto c <- newSequenceSTM sto
modifyTVar tvar (HM.insert k (Entry c (New v))) modifyTVar tvar (HM.insert k (Entry c (New v)))
-- TODO: slow-parallel-read-access
-- будет тормозить на конкурентном считывании уже
-- существующих (не новых), значений
-- так как будет в эксклюзивном режиме елозить
-- указателем по файлу.
-- Возможные варианты: маппить файл при доступе
-- на чтение (а что делать, если он растёт?)
-- Собирать операции чтения в батчи и читать батч
-- последовательно (будут некие задержки, и
-- чтение становится хитрожопой операцией, а не
-- просто из файла считать)
compactStorageGet :: ForCompactStorage m => CompactStorage k -> ByteString -> m (Maybe ByteString) compactStorageGet :: ForCompactStorage m => CompactStorage k -> ByteString -> m (Maybe ByteString)
compactStorageGet sto key = do compactStorageGet sto key = do
let tvar = getBucket sto key let tvar = getBucket sto key
@ -395,12 +381,10 @@ compactStorageGet sto key = do
Just (Entry _ (Del _)) -> pure Nothing Just (Entry _ (Del _)) -> pure Nothing
Just (Entry _ (New s)) -> pure (Just s) Just (Entry _ (New s)) -> pure (Just s)
Just (Entry _ (Off e)) -> liftIO do Just (Entry _ (Off e)) -> liftIO do
r <- withMVar (csHandle sto) $ \ha -> do ma <- readTVarIO (csMMapped sto)
try @_ @IOException do let ptr = plusPtr (view _1 ma) (fromIntegral $ idxEntryOffset e)
hSeek ha AbsoluteSeek (fromIntegral $ idxEntryOffset e) let mview = MemView ptr (fromIntegral $ idxEntrySize e)
BS.hGet ha (fromIntegral $ idxEntrySize e) pure $ Just $ BA.convert @_ @ByteString mview
either throwIO (pure . Just) r
compactStorageExists :: ForCompactStorage m => CompactStorage k -> ByteString -> m (Maybe Integer) compactStorageExists :: ForCompactStorage m => CompactStorage k -> ByteString -> m (Maybe Integer)
compactStorageExists sto key = do compactStorageExists sto key = do