add cache for getNumMinCopiesAttr

Optimises balanced=groupname:lackingcopies at the expense of a tiny
slowdown to lackingcopies=number and git-annex fsck and import.

Sponsored-by: k0ld
This commit is contained in:
Joey Hess 2025-05-12 14:37:23 -04:00
parent 1435f6ff82
commit 88a09a7c05
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 15 additions and 7 deletions

View file

@ -197,6 +197,7 @@ data AnnexState = AnnexState
, checkignorehandle :: Maybe (ResourcePool CheckIgnoreHandle)
, globalnumcopies :: Maybe (Maybe NumCopies)
, globalmincopies :: Maybe (Maybe MinCopies)
, nummincopiesattrcache :: Maybe (OsPath, (Maybe NumCopies, Maybe MinCopies))
, limit :: ExpandableMatcher Annex
, timelimit :: Maybe (Duration, POSIXTime)
, sizelimit :: Maybe (TVar Integer)
@ -253,6 +254,7 @@ newAnnexState c r = do
, checkignorehandle = Nothing
, globalnumcopies = Nothing
, globalmincopies = Nothing
, nummincopiesattrcache = Nothing
, limit = BuildingMatcher []
, timelimit = Nothing
, sizelimit = Nothing

View file

@ -1,6 +1,6 @@
{- git-annex numcopies configuration and checking
-
- Copyright 2014-2024 Joey Hess <id@joeyh.name>
- Copyright 2014-2025 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
@ -181,12 +181,18 @@ getGlobalFileNumCopies f = fromSourcesOr defaultNumCopies
]
getNumMinCopiesAttr :: OsPath -> Annex (Maybe NumCopies, Maybe MinCopies)
getNumMinCopiesAttr file =
checkAttrs ["annex.numcopies", "annex.mincopies"] file >>= \case
(n:m:[]) -> return
( configuredNumCopies <$> readish n
, configuredMinCopies <$> readish m
)
getNumMinCopiesAttr file = Annex.getState Annex.nummincopiesattrcache >>= \case
Just (cfile, v) | cfile == file -> return v
_ -> checkAttrs ["annex.numcopies", "annex.mincopies"] file >>= \case
(n:m:[]) -> do
let v =
( configuredNumCopies <$> readish n
, configuredMinCopies <$> readish m
)
Annex.changeState $ \s -> s
{ Annex.nummincopiesattrcache = Just (file, v)
}
return v
_ -> error "internal"
{- Checks if numcopies are satisfied for a file by running a comparison