smarter BranchState cache invalidation

Only invalidate a just-written file in the cache, not the whole cache.

This will avoid the possibly performance impact of cache invalidation
mentioned in commit 770aac97a7
This commit is contained in:
Joey Hess 2024-07-28 12:33:32 -04:00
parent 770aac97a7
commit bd3d327d8a
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 11 additions and 5 deletions

View file

@ -262,7 +262,7 @@ updateTo' pairs = do
else commitIndex jl branchref merge_desc commitrefs
)
addMergedRefs tomerge
invalidateCache
invalidateCacheAll
stagejournalwhen dirty jl a
| dirty = stageJournal jl a
@ -487,7 +487,7 @@ set jl ru f c = do
-- evaluating a Journalable Builder twice, which is not very
-- efficient. Instead, assume that it's not common to need to read
-- a log file immediately after writing it.
invalidateCache
invalidateCache f
{- Appends content to the journal file. -}
append :: Journalable content => JournalLocked -> RawFilePath -> AppendableJournalFile -> content -> Annex ()
@ -495,7 +495,7 @@ append jl f appendable toappend = do
journalChanged
appendJournalFile jl appendable toappend
fastDebug "Annex.Branch" ("append " ++ fromRawFilePath f)
invalidateCache
invalidateCache f
{- Commit message used when making a commit of whatever data has changed
- to the git-annex branch. -}

View file

@ -134,5 +134,11 @@ getCache file state = go (cachedFileContents state)
| f == file && not (needInteractiveAccess state) = Just c
| otherwise = go rest
invalidateCache :: Annex ()
invalidateCache = changeState $ \s -> s { cachedFileContents = [] }
invalidateCache :: RawFilePath -> Annex ()
invalidateCache f = changeState $ \s -> s
{ cachedFileContents = filter (\(f', _) -> f' /= f)
(cachedFileContents s)
}
invalidateCacheAll :: Annex ()
invalidateCacheAll = changeState $ \s -> s { cachedFileContents = [] }