mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
3b1dc869ba
commit
2effcc242c
|
@ -298,6 +298,7 @@ instance Exception Git3Exception
|
||||||
data Git3Env =
|
data Git3Env =
|
||||||
Git3Disconnected
|
Git3Disconnected
|
||||||
{ gitRefLog :: TVar (Maybe GitRemoteKey)
|
{ gitRefLog :: TVar (Maybe GitRemoteKey)
|
||||||
|
, gitPackedSegmentSize :: TVar Int
|
||||||
}
|
}
|
||||||
| Git3Connected
|
| Git3Connected
|
||||||
{ stateDb :: DBPipeEnv
|
{ stateDb :: DBPipeEnv
|
||||||
|
@ -305,6 +306,7 @@ data Git3Env =
|
||||||
, peerStorage :: AnyStorage
|
, peerStorage :: AnyStorage
|
||||||
, peerAPI :: ServiceCaller PeerAPI UNIX
|
, peerAPI :: ServiceCaller PeerAPI UNIX
|
||||||
, gitRefLog :: TVar (Maybe GitRemoteKey)
|
, gitRefLog :: TVar (Maybe GitRemoteKey)
|
||||||
|
, gitPackedSegmentSize :: TVar Int
|
||||||
}
|
}
|
||||||
|
|
||||||
class HasGitRemoteKey m where
|
class HasGitRemoteKey m where
|
||||||
|
@ -320,6 +322,12 @@ instance (MonadIO m, MonadReader Git3Env m) => HasGitRemoteKey m where
|
||||||
e <- ask
|
e <- ask
|
||||||
liftIO $ atomically $ writeTVar (gitRefLog e) (Just k)
|
liftIO $ atomically $ writeTVar (gitRefLog e) (Just k)
|
||||||
|
|
||||||
|
instance (MonadIO m, MonadReader Git3Env m) => HasExportOpts m where
|
||||||
|
getPackedSegmetSize = asks gitPackedSegmentSize >>= readTVarIO
|
||||||
|
setPackedSegmedSize x = do
|
||||||
|
e <- asks gitPackedSegmentSize
|
||||||
|
atomically $ writeTVar e x
|
||||||
|
|
||||||
instance (MonadIO m) => HasStateDB (Git3 m) where
|
instance (MonadIO m) => HasStateDB (Git3 m) where
|
||||||
getStateDB = asks stateDb
|
getStateDB = asks stateDb
|
||||||
|
|
||||||
|
@ -351,7 +359,9 @@ instance MonadUnliftIO m => HasClientAPI PeerAPI UNIX (Git3 m) where
|
||||||
Git3Connected{..} -> pure peerAPI
|
Git3Connected{..} -> pure peerAPI
|
||||||
|
|
||||||
nullGit3Env :: MonadIO m => m Git3Env
|
nullGit3Env :: MonadIO m => m Git3Env
|
||||||
nullGit3Env = Git3Disconnected <$> newTVarIO Nothing
|
nullGit3Env = Git3Disconnected
|
||||||
|
<$> newTVarIO Nothing
|
||||||
|
<*> newTVarIO ( 100 * 1024 * 1024 )
|
||||||
|
|
||||||
connectedDo :: (MonadIO m, MonadReader Git3Env m) => m a -> m a
|
connectedDo :: (MonadIO m, MonadReader Git3Env m) => m a -> m a
|
||||||
connectedDo what = do
|
connectedDo what = do
|
||||||
|
@ -408,7 +418,9 @@ recover m = fix \again -> do
|
||||||
|
|
||||||
let sto = AnyStorage (StorageClient storageAPI)
|
let sto = AnyStorage (StorageClient storageAPI)
|
||||||
|
|
||||||
connected <- Git3Connected db soname sto peerAPI <$> newTVarIO (Just ref)
|
connected <- Git3Connected db soname sto peerAPI
|
||||||
|
<$> newTVarIO (Just ref)
|
||||||
|
<*> newTVarIO (100 * 1024 * 1024 )
|
||||||
|
|
||||||
liftIO $ withGit3Env connected (evolveState >> again)
|
liftIO $ withGit3Env connected (evolveState >> again)
|
||||||
|
|
||||||
|
@ -1239,7 +1251,7 @@ readLogFileLBS _ action = flip fix 0 \go n -> do
|
||||||
|
|
||||||
hash <- readBytesMaybe 20
|
hash <- readBytesMaybe 20
|
||||||
>>= orThrow SomeReadLogError
|
>>= orThrow SomeReadLogError
|
||||||
<&> GitHash . LBS.toStrict
|
<&> GitHash . BS.copy . LBS.toStrict
|
||||||
|
|
||||||
sdata <- readBytesMaybe ( ssize - 20 )
|
sdata <- readBytesMaybe ( ssize - 20 )
|
||||||
>>= orThrow SomeReadLogError
|
>>= orThrow SomeReadLogError
|
||||||
|
@ -1293,6 +1305,15 @@ splitOpts def opts' = flip fix (mempty, opts) $ \go -> \case
|
||||||
omap = HM.fromList [ (p, x) | (p,x) <- def ]
|
omap = HM.fromList [ (p, x) | (p,x) <- def ]
|
||||||
opts = opts'
|
opts = opts'
|
||||||
|
|
||||||
|
data ECC =
|
||||||
|
ECCInit
|
||||||
|
| ECCWrite Int Handle Result
|
||||||
|
| ECCFinalize Bool Handle Result
|
||||||
|
|
||||||
|
class HasExportOpts m where
|
||||||
|
setPackedSegmedSize :: Int -> m ()
|
||||||
|
getPackedSegmetSize :: m Int
|
||||||
|
|
||||||
theDict :: forall m . ( HBS2GitPerks m
|
theDict :: forall m . ( HBS2GitPerks m
|
||||||
, HasClientAPI PeerAPI UNIX m
|
, HasClientAPI PeerAPI UNIX m
|
||||||
, HasStorage m
|
, HasStorage m
|
||||||
|
@ -1314,6 +1335,12 @@ theDict = do
|
||||||
|
|
||||||
_ -> helpList False Nothing >> quit
|
_ -> helpList False Nothing >> quit
|
||||||
|
|
||||||
|
entry $ bindMatch "segment" $ nil_ $ \case
|
||||||
|
[ LitIntVal n ] -> lift do
|
||||||
|
setPackedSegmedSize (fromIntegral n)
|
||||||
|
|
||||||
|
_ -> throwIO (BadFormException @C nil)
|
||||||
|
|
||||||
entry $ bindMatch "git:tree:ls" $ nil_ $ const do
|
entry $ bindMatch "git:tree:ls" $ nil_ $ const do
|
||||||
r <- gitReadTree "HEAD"
|
r <- gitReadTree "HEAD"
|
||||||
for_ r $ \GitTreeEntry{..} -> do
|
for_ r $ \GitTreeEntry{..} -> do
|
||||||
|
@ -1978,6 +2005,8 @@ theDict = do
|
||||||
entry $ bindMatch "test:git:export-commit-dfs" $ nil_ $ \syn -> lift do
|
entry $ bindMatch "test:git:export-commit-dfs" $ nil_ $ \syn -> lift do
|
||||||
let (opts, argz) = splitOpts [("--index",1)] syn
|
let (opts, argz) = splitOpts [("--index",1)] syn
|
||||||
|
|
||||||
|
maxW <- getPackedSegmetSize
|
||||||
|
|
||||||
let useIndex = headMay [ f | ListVal [StringLike "--index", StringLike f] <- opts ]
|
let useIndex = headMay [ f | ListVal [StringLike "--index", StringLike f] <- opts ]
|
||||||
|
|
||||||
let hd = headDef "HEAD" [ x | StringLike x <- argz]
|
let hd = headDef "HEAD" [ x | StringLike x <- argz]
|
||||||
|
@ -2018,17 +2047,41 @@ theDict = do
|
||||||
|
|
||||||
sourceQ <- newTBQueueIO (fromIntegral tn * 100)
|
sourceQ <- newTBQueueIO (fromIntegral tn * 100)
|
||||||
|
|
||||||
seed <- randomIO @Word16
|
|
||||||
logFile <- ContT $ withBinaryFile (show $ "export-" <> pretty seed <> ".log") AppendMode
|
|
||||||
|
|
||||||
l <- lift $ async $ do
|
l <- lift $ async $ do
|
||||||
|
|
||||||
|
flip fix ECCInit $ \loop -> \case
|
||||||
|
ECCInit -> do
|
||||||
zstd <- ZstdS.compress maxCLevel
|
zstd <- ZstdS.compress maxCLevel
|
||||||
flip fix zstd \jerk sn -> do
|
seed <- randomIO @Word16
|
||||||
|
let fn = show $ "export-" <> pretty seed <> ".log"
|
||||||
|
logFile <- IO.openBinaryFile fn WriteMode
|
||||||
|
debug $ red "NEW FILE" <+> pretty fn
|
||||||
|
loop $ ECCWrite 0 logFile zstd
|
||||||
|
|
||||||
|
ECCWrite bnum fh sn | bnum >= maxW -> do
|
||||||
|
loop (ECCFinalize True fh sn)
|
||||||
|
|
||||||
|
ECCWrite bnum fh sn -> do
|
||||||
atomically (readTBQueue sourceQ) >>= \case
|
atomically (readTBQueue sourceQ) >>= \case
|
||||||
Nothing -> writeCompressedChunkZstd (LBS.hPutStr logFile) sn Nothing
|
Nothing -> loop (ECCFinalize False fh sn)
|
||||||
Just s -> do
|
Just s -> do
|
||||||
lbs <- S.toList_ (writeSection s $ S.yield) <&> mconcat
|
lbs <- S.toList_ (writeSection s $ S.yield) <&> mconcat
|
||||||
writeCompressedChunkZstd (LBS.hPutStr logFile) sn (Just lbs) >>= jerk
|
|
||||||
|
sz_ <- newTVarIO 0
|
||||||
|
let write ss = do
|
||||||
|
LBS.hPutStr fh ss
|
||||||
|
atomically $ modifyTVar sz_ (+ LBS.length ss)
|
||||||
|
|
||||||
|
sn1 <- writeCompressedChunkZstd write sn (Just lbs)
|
||||||
|
|
||||||
|
sz <- readTVarIO sz_ <&> fromIntegral
|
||||||
|
|
||||||
|
loop (ECCWrite (bnum + sz) fh sn1)
|
||||||
|
|
||||||
|
ECCFinalize again fh sn -> do
|
||||||
|
void $ writeCompressedChunkZstd (LBS.hPutStr fh) sn Nothing
|
||||||
|
hClose fh
|
||||||
|
when again $ loop ECCInit
|
||||||
|
|
||||||
link l
|
link l
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue