This commit is contained in:
voidlizard 2025-07-29 14:21:24 +03:00
parent d3004ad354
commit 9e5247f19c
3 changed files with 47 additions and 8 deletions

View File

@ -16,6 +16,7 @@ import Data.Vector qualified as V
import Data.HashMap.Strict qualified as HM import Data.HashMap.Strict qualified as HM
import Data.List qualified as List import Data.List qualified as List
import Data.Set qualified as Set import Data.Set qualified as Set
import Data.Either
import Lens.Micro.Platform import Lens.Micro.Platform
import Data.ByteString qualified as BS import Data.ByteString qualified as BS
import Data.Sequence qualified as Seq import Data.Sequence qualified as Seq
@ -164,20 +165,24 @@ ncqTryLoadState me@NCQStorage3{..} = do
let path = ncqGetFileName me dataFile let path = ncqGetFileName me dataFile
realSize <- fileSize path realSize <- fileSize path
let corrupted = realSize /= fromIntegral s let sizewtf = realSize /= fromIntegral s
let color = if corrupted then red else id let color = if sizewtf then red else id
debug $ yellow "indexing" <+> pretty dataFile <+> pretty s <+> color (pretty realSize) good <- try @_ @NCQFsckException (ncqFileFastCheck path)
let corrupted = isLeft good
when corrupted $ liftIO do when corrupted $ liftIO do
warn $ red "trim" <+> pretty s <+> pretty (takeFileName path) warn $ red "trim" <+> pretty s <+> pretty (takeFileName path)
PFS.setFileSize path (fromIntegral s) PFS.setFileSize path (fromIntegral s)
debug $ yellow "indexing" <+> pretty dataFile <+> pretty s <+> color (pretty realSize)
ncqIndexFile me dataFile ncqIndexFile me dataFile
for_ (bad <> drop 3 (fmap snd rest)) $ \f -> do for_ (bad <> drop 3 (fmap snd rest)) $ \f -> do
let old = ncqGetFileName me (StateFile f) let old = ncqGetFileName me (StateFile f)
debug $ "rm old state" <+> pretty old -- debug $ "rm old state" <+> pretty old
rm old rm old
where where

View File

@ -15,6 +15,7 @@ import HBS2.Storage.Simple
import HBS2.Storage.Operations.ByteString import HBS2.Storage.Operations.ByteString
import HBS2.Storage.NCQ3 import HBS2.Storage.NCQ3
import HBS2.Storage.NCQ3.Internal.Files import HBS2.Storage.NCQ3.Internal.Files
import HBS2.Storage.NCQ3.Internal.Index
import HBS2.System.Logger.Simple.ANSI import HBS2.System.Logger.Simple.ANSI
@ -35,6 +36,7 @@ import Data.Ord
import Data.Set qualified as Set import Data.Set qualified as Set
import System.Random.MWC as MWC import System.Random.MWC as MWC
import Control.Concurrent.STM qualified as STM import Control.Concurrent.STM qualified as STM
import Data.List qualified as List
import UnliftIO import UnliftIO
@ -86,6 +88,11 @@ ncq3Tests = do
let (opts,args) = splitOpts [] e let (opts,args) = splitOpts [] e
let num = headDef 1000 [ fromIntegral n | LitIntVal n <- args ] let num = headDef 1000 [ fromIntegral n | LitIntVal n <- args ]
g <- liftIO MWC.createSystemRandom g <- liftIO MWC.createSystemRandom
w1 <- newTVarIO 0
f1 <- newTVarIO 0
m1 <- newTVarIO 0
runTest $ \TestEnv{..} -> do runTest $ \TestEnv{..} -> do
hq <- newTQueueIO hq <- newTQueueIO
ncqWithStorage3 testEnvDir $ \sto -> do ncqWithStorage3 testEnvDir $ \sto -> do
@ -96,14 +103,41 @@ ncq3Tests = do
h <- ncqPutBS sto (Just B) Nothing bs h <- ncqPutBS sto (Just B) Nothing bs
found <- ncqLocate sto h <&> isJust found <- ncqLocate sto h <&> isJust
liftIO $ assertBool (show $ "found" <+> pretty h) found liftIO $ assertBool (show $ "found" <+> pretty h) found
atomically $ writeTQueue hq h atomically do
writeTQueue hq h
modifyTVar w1 succ
ncqWithStorage3 testEnvDir $ \sto -> do ncqWithStorage3 testEnvDir $ \sto -> do
notice $ "reopen/lookup" <+> pretty num notice $ "reopen/lookup" <+> pretty num
hh <- atomically $ STM.flushTQueue hq hh <- atomically $ STM.flushTQueue hq
for_ hh $ \h -> do for_ hh $ \h -> do
found <- ncqLocate sto h <&> isJust found <- ncqLocate sto h <&> isJust
liftIO $ assertBool (show $ "found2" <+> pretty h) found atomically do
if found then do
modifyTVar f1 succ
else do
modifyTVar m1 succ
notice $ "done" w <- readTVarIO w1
f <- readTVarIO f1
m <- readTVarIO m1
notice $ "done" <+> pretty w <+> pretty f <+> pretty m
liftIO $ assertBool (show $ "all-found" <+> pretty w) (f == w && m == 0)
entry $ bindMatch "test:ncq3:seek" $ nil_ $ \case
[ StringLike p, HashLike h ] -> do
files <- dirFiles p <&> filter (List.isPrefixOf "i-" .takeBaseName)
for_ files $ \f -> do
(bs,nw) <- nwayHashMMapReadOnly f >>= orThrowUser ("Can't mmap" <+> pretty f)
nwayHashScanAll nw bs $ \_ k v -> do
unless (coerce k == emptyKey) do
let e = unpackIndexEntry v
notice $ "found:" <+> pretty (coerce @_ @HashRef k) <+> viaShow e
e -> throwIO $ BadFormException @C (mkList e)

View File

@ -37,7 +37,7 @@ runTest action = do
flip runContT pure do flip runContT pure do
ContT $ bracket none $ const do ContT $ bracket none $ const do
unless keep (rm tmp) unless keep (rm tmp)
flushLoggers -- flushLoggers
lift $ lift $ action (TestEnv tmp) lift $ lift $ action (TestEnv tmp)