mirror of
https://github.com/haskell-nix/hnix-store.git
synced 2024-11-30 22:42:02 +03:00
remote, add Types.GC, use in deleteSpecific
This commit is contained in:
parent
598cb89fbd
commit
9cd7d3597a
@ -84,6 +84,7 @@ library
|
|||||||
, System.Nix.Store.Remote.Socket
|
, System.Nix.Store.Remote.Socket
|
||||||
, System.Nix.Store.Remote.Types
|
, System.Nix.Store.Remote.Types
|
||||||
, System.Nix.Store.Remote.Types.Activity
|
, System.Nix.Store.Remote.Types.Activity
|
||||||
|
, System.Nix.Store.Remote.Types.GC
|
||||||
, System.Nix.Store.Remote.Types.CheckMode
|
, System.Nix.Store.Remote.Types.CheckMode
|
||||||
, System.Nix.Store.Remote.Types.Logger
|
, System.Nix.Store.Remote.Types.Logger
|
||||||
, System.Nix.Store.Remote.Types.ProtoVersion
|
, System.Nix.Store.Remote.Types.ProtoVersion
|
||||||
|
@ -169,11 +169,11 @@ buildDerivation p drv buildMode = do
|
|||||||
-- | Delete store paths
|
-- | Delete store paths
|
||||||
deleteSpecific
|
deleteSpecific
|
||||||
:: HashSet StorePath -- ^ Paths to delete
|
:: HashSet StorePath -- ^ Paths to delete
|
||||||
-> MonadStore (HashSet StorePath, Word64) -- ^ (Paths deleted, Bytes freed)
|
-> MonadStore GCResult
|
||||||
deleteSpecific paths = do
|
deleteSpecific paths = do
|
||||||
storeDir <- getStoreDir
|
storeDir <- getStoreDir
|
||||||
runOpArgs CollectGarbage $ do
|
runOpArgs CollectGarbage $ do
|
||||||
putEnum GCDeleteSpecific
|
putEnum GCAction_DeleteSpecific
|
||||||
putPaths storeDir paths
|
putPaths storeDir paths
|
||||||
putBool False -- ignoreLiveness
|
putBool False -- ignoreLiveness
|
||||||
putInt (maxBound :: Word64) -- maxFreedBytes
|
putInt (maxBound :: Word64) -- maxFreedBytes
|
||||||
@ -181,10 +181,11 @@ deleteSpecific paths = do
|
|||||||
putInt (0::Int)
|
putInt (0::Int)
|
||||||
putInt (0::Int)
|
putInt (0::Int)
|
||||||
getSocketIncremental $ do
|
getSocketIncremental $ do
|
||||||
deletedPaths <- getPathsOrFail storeDir
|
gcResult_deletedPaths <- getPathsOrFail storeDir
|
||||||
bytesFreed <- getInt
|
gcResult_bytesFreed <- getInt
|
||||||
|
-- TODO: who knows
|
||||||
_ :: Int <- getInt
|
_ :: Int <- getInt
|
||||||
pure (deletedPaths, bytesFreed)
|
pure GCResult{..}
|
||||||
|
|
||||||
ensurePath :: StorePath -> MonadStore ()
|
ensurePath :: StorePath -> MonadStore ()
|
||||||
ensurePath pn = do
|
ensurePath pn = do
|
||||||
|
@ -152,11 +152,3 @@ runStoreOpts' sockFamily sockAddr storeRootDir code =
|
|||||||
$ (`runReaderT` sock)
|
$ (`runReaderT` sock)
|
||||||
$ (`runStateT` (Nothing, []))
|
$ (`runStateT` (Nothing, []))
|
||||||
$ runExceptT (greet >> code)
|
$ runExceptT (greet >> code)
|
||||||
|
|
||||||
data GCAction
|
|
||||||
= GCReturnLive
|
|
||||||
| GCReturnDead
|
|
||||||
| GCDeleteDead
|
|
||||||
| GCDeleteSpecific
|
|
||||||
deriving (Eq, Show, Enum)
|
|
||||||
|
|
||||||
|
@ -61,6 +61,12 @@ instance Serialize BuildResult where
|
|||||||
putTime startTime
|
putTime startTime
|
||||||
putTime stopTime
|
putTime stopTime
|
||||||
|
|
||||||
|
-- * GCAction
|
||||||
|
--
|
||||||
|
instance Serialize GCAction where
|
||||||
|
get = getEnum
|
||||||
|
put = putEnum
|
||||||
|
|
||||||
-- * ProtoVersion
|
-- * ProtoVersion
|
||||||
|
|
||||||
-- protoVersion_major & 0xFF00
|
-- protoVersion_major & 0xFF00
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
module System.Nix.Store.Remote.Types
|
module System.Nix.Store.Remote.Types
|
||||||
( module System.Nix.Store.Remote.Types.Activity
|
( module System.Nix.Store.Remote.Types.Activity
|
||||||
|
, module System.Nix.Store.Remote.Types.GC
|
||||||
, module System.Nix.Store.Remote.Types.CheckMode
|
, module System.Nix.Store.Remote.Types.CheckMode
|
||||||
, module System.Nix.Store.Remote.Types.Logger
|
, module System.Nix.Store.Remote.Types.Logger
|
||||||
, module System.Nix.Store.Remote.Types.ProtoVersion
|
, module System.Nix.Store.Remote.Types.ProtoVersion
|
||||||
@ -10,6 +11,7 @@ module System.Nix.Store.Remote.Types
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import System.Nix.Store.Remote.Types.Activity
|
import System.Nix.Store.Remote.Types.Activity
|
||||||
|
import System.Nix.Store.Remote.Types.GC
|
||||||
import System.Nix.Store.Remote.Types.CheckMode
|
import System.Nix.Store.Remote.Types.CheckMode
|
||||||
import System.Nix.Store.Remote.Types.Logger
|
import System.Nix.Store.Remote.Types.Logger
|
||||||
import System.Nix.Store.Remote.Types.ProtoVersion
|
import System.Nix.Store.Remote.Types.ProtoVersion
|
||||||
|
45
hnix-store-remote/src/System/Nix/Store/Remote/Types/GC.hs
Normal file
45
hnix-store-remote/src/System/Nix/Store/Remote/Types/GC.hs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
{-|
|
||||||
|
Description : Garbage collection actions / options
|
||||||
|
Maintainer : srk <srk@48.io>
|
||||||
|
|-}
|
||||||
|
module System.Nix.Store.Remote.Types.GC (
|
||||||
|
GCAction(..)
|
||||||
|
, GCOptions(..)
|
||||||
|
, GCResult(..)
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.HashSet (HashSet)
|
||||||
|
import Data.Word (Word64)
|
||||||
|
import GHC.Generics (Generic)
|
||||||
|
import System.Nix.StorePath (StorePath)
|
||||||
|
|
||||||
|
data GCAction
|
||||||
|
= GCAction_ReturnLive -- ^ Return the set of paths reachable from roots (closure)
|
||||||
|
| GCAction_ReturnDead -- ^ Return unreachable paths
|
||||||
|
| GCAction_DeleteDead -- ^ Delete unreachable paths
|
||||||
|
| GCAction_DeleteSpecific -- ^ Delete specified paths
|
||||||
|
deriving (Bounded, Eq, Enum, Generic, Ord, Show)
|
||||||
|
|
||||||
|
-- | Garbage collector operation options
|
||||||
|
data GCOptions = GCOptions
|
||||||
|
{ -- | Operation
|
||||||
|
gcOptions_operation :: GCAction
|
||||||
|
-- | If set, then reachability from the roots is ignored (unused)
|
||||||
|
, gcOptions_ignoreLiveness :: Bool
|
||||||
|
-- | Paths to delete for @GCAction_DeleteSpecific@
|
||||||
|
, gcOptions_pathsToDelete :: HashSet StorePath
|
||||||
|
-- | Stop after `gcOptions_maxFreed` bytes have been freed
|
||||||
|
, gcOptions_maxFreed :: Integer
|
||||||
|
} deriving (Eq, Generic, Ord, Show)
|
||||||
|
|
||||||
|
data GCResult = GCResult
|
||||||
|
{ -- | Depending on the action, the GC roots,
|
||||||
|
-- or the paths that would be or have been deleted
|
||||||
|
gcResult_deletedPaths :: HashSet StorePath
|
||||||
|
-- | The number of bytes that would be or was freed for
|
||||||
|
--
|
||||||
|
-- - @GCAction_ReturnDead@
|
||||||
|
-- - @GCAction_DeleteDead@
|
||||||
|
-- - @GCAction_DeleteSpecific@
|
||||||
|
, gcResult_bytesFreed :: Word64
|
||||||
|
} deriving (Eq, Generic, Ord, Show)
|
@ -285,7 +285,7 @@ spec_protocol = Hspec.around withNixDaemon $
|
|||||||
liftIO $ forM_ tempRootList $ \entry -> do
|
liftIO $ forM_ tempRootList $ \entry -> do
|
||||||
removeFile $ mconcat [ tempRootsDir, "/", entry ]
|
removeFile $ mconcat [ tempRootsDir, "/", entry ]
|
||||||
|
|
||||||
(deletedPaths, deletedBytes) <- deleteSpecific (HS.fromList [path])
|
GCResult{..} <- deleteSpecific (HS.fromList [path])
|
||||||
deletedPaths `shouldBe` HS.fromList [path]
|
gcResult_deletedPaths `shouldBe` HS.fromList [path]
|
||||||
deletedBytes `shouldBe` 4
|
gcResult_bytesFreed `shouldBe` 4
|
||||||
|
|
||||||
|
@ -156,6 +156,12 @@ spec = parallel $ do
|
|||||||
it' "ResolvesToAlreadyValid" BuildStatus_ResolvesToAlreadyValid 13
|
it' "ResolvesToAlreadyValid" BuildStatus_ResolvesToAlreadyValid 13
|
||||||
it' "NoSubstituters" BuildStatus_NoSubstituters 14
|
it' "NoSubstituters" BuildStatus_NoSubstituters 14
|
||||||
|
|
||||||
|
describe "GCAction enum order matches Nix" $ do
|
||||||
|
it' "ReturnLive" GCAction_ReturnLive 0
|
||||||
|
it' "ReturnDead" GCAction_ReturnDead 1
|
||||||
|
it' "DeleteDead" GCAction_DeleteDead 2
|
||||||
|
it' "DeleteSpecific" GCAction_DeleteSpecific 3
|
||||||
|
|
||||||
describe "Logger" $ do
|
describe "Logger" $ do
|
||||||
describe "Activity enum order matches Nix" $ do
|
describe "Activity enum order matches Nix" $ do
|
||||||
it' "CopyPath" Activity_CopyPath 100
|
it' "CopyPath" Activity_CopyPath 100
|
||||||
|
Loading…
Reference in New Issue
Block a user