avoid sometimes expensive operations when annex.supportunlocked = false

This will mostly just avoid a DB lookup, so things get marginally
faster. But in cases where there are many files using the same key, it
can be a more significant speedup.

Added overhead is one MVar lookup per call, which should be small
enough, since this happens after transferring or ingesting a file,
which is always a lot more work than that. It would be nice, though,
to move getGitConfig to AnnexRead, which there is an open todo about.
This commit is contained in:
Joey Hess 2021-06-14 12:36:55 -04:00
parent a02b5c2904
commit 014dc63a55
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 35 additions and 23 deletions

View file

@ -340,12 +340,13 @@ moveAnnex key af src = ifM (checkSecureHashes' key)
liftIO $ moveFile
(fromRawFilePath src)
(fromRawFilePath dest)
g <- Annex.gitRepo
fs <- map (`fromTopFilePath` g)
<$> Database.Keys.getAssociatedFiles key
unless (null fs) $ do
ics <- mapM (populatePointerFile (Restage True) key dest) fs
Database.Keys.storeInodeCaches' key [dest] (catMaybes ics)
whenM (annexSupportUnlocked <$> Annex.getGitConfig) $ do
g <- Annex.gitRepo
fs <- map (`fromTopFilePath` g)
<$> Database.Keys.getAssociatedFiles key
unless (null fs) $ do
ics <- mapM (populatePointerFile (Restage True) key dest) fs
Database.Keys.storeInodeCaches' key [dest] (catMaybes ics)
)
alreadyhave = liftIO $ R.removeLink src
@ -502,10 +503,11 @@ removeAnnex (ContentRemovalLock key) = withObjectLoc key $ \file ->
cleanObjectLoc key $ do
secureErase file
liftIO $ removeWhenExistsWith R.removeLink file
g <- Annex.gitRepo
mapM_ (\f -> void $ tryIO $ resetpointer $ fromTopFilePath f g)
=<< Database.Keys.getAssociatedFiles key
Database.Keys.removeInodeCaches key
whenM (annexSupportUnlocked <$> Annex.getGitConfig) $ do
g <- Annex.gitRepo
mapM_ (\f -> void $ tryIO $ resetpointer $ fromTopFilePath f g)
=<< Database.Keys.getAssociatedFiles key
Database.Keys.removeInodeCaches key
where
-- Check associated pointer file for modifications, and reset if
-- it's unmodified.

View file

@ -225,14 +225,15 @@ finishIngestUnlocked' key source restage = do
{- Copy to any unlocked files using the same key. -}
populateUnlockedFiles :: Key -> KeySource -> Restage -> Annex ()
populateUnlockedFiles key source restage = do
obj <- calcRepo (gitAnnexLocation key)
g <- Annex.gitRepo
ingestedf <- flip fromTopFilePath g
<$> inRepo (toTopFilePath (keyFilename source))
afs <- map (`fromTopFilePath` g) <$> Database.Keys.getAssociatedFiles key
forM_ (filter (/= ingestedf) afs) $
populatePointerFile restage key obj
populateUnlockedFiles key source restage =
whenM (annexSupportUnlocked <$> Annex.getGitConfig) $ do
obj <- calcRepo (gitAnnexLocation key)
g <- Annex.gitRepo
ingestedf <- flip fromTopFilePath g
<$> inRepo (toTopFilePath (keyFilename source))
afs <- map (`fromTopFilePath` g) <$> Database.Keys.getAssociatedFiles key
forM_ (filter (/= ingestedf) afs) $
populatePointerFile restage key obj
cleanCruft :: KeySource -> Annex ()
cleanCruft source = when (contentLocation source /= keyFilename source) $

View file

@ -0,0 +1,9 @@
[[!comment format=mdwn
username="joey"
subject="""comment 28"""
date="2021-06-14T16:31:26Z"
content="""
@Ilya sure can be skipped when annex.supportunlocked=false.
I've implemented that. (And also for several other cases that have similar
behavior, like dropping a key.)
"""]]

View file

@ -5,8 +5,8 @@ moved to AnnexRead for a performance win and also to make clean how it's
used. --[[Joey]]
The easy things have been moved now, but some things like Annex.force and
Annex.fast would be good to move. Moving those would involve running
argument processing outside the Annex monad. The main reason argument
processing runs in the Annex monad is to set those values, but there may be
other reasons too, so this will be a large set of changes that need to all
happen together. --[[Joey]]
Annex.fast and Annex.getGitConfig would be good to move. Moving those would
involve running argument processing outside the Annex monad. The main
reason argument processing runs in the Annex monad is to set those values,
but there may be other reasons too, so this will be a large set of changes
that need to all happen together. --[[Joey]]