73e0cbbb19
This is a result of an audit of every use of getInodeCaches, to find places that misbehave when the annex object is not in the inode cache, despite pointer files for the same key being in the inode cache. Unfortunately, that is the case for objects that were in v7 repos that upgraded to v8. Added a note about this gotcha to getInodeCaches. Database.Keys.reconcileStaged, then annex.thin is set, would fail to populate pointer files in this situation. Changed it to check if the annex object is unmodified the same way inAnnex does, falling back to a checksum if the inode cache is not recorded. Sponsored-by: Dartmouth College's Datalad project
36 lines
1.2 KiB
Haskell
36 lines
1.2 KiB
Haskell
{- git-annex object content presence, low-level functions
|
|
-
|
|
- Copyright 2010-2021 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Annex.Content.Presence.LowLevel where
|
|
|
|
import Annex.Common
|
|
import Annex.Verify
|
|
import Types.Remote
|
|
import Annex.InodeSentinal
|
|
import Utility.InodeCache
|
|
|
|
isUnmodifiedLowLevel :: (Key -> [InodeCache] -> Annex ()) -> Key -> RawFilePath -> InodeCache -> [InodeCache] -> Annex Bool
|
|
isUnmodifiedLowLevel addinodecaches key f fc ic = isUnmodifiedCheapLowLevel fc ic <||> expensivecheck
|
|
where
|
|
expensivecheck = ifM (verifyKeyContent RetrievalAllKeysSecure AlwaysVerify UnVerified key f)
|
|
( do
|
|
-- The file could have been modified while it was
|
|
-- being verified. Detect that.
|
|
ifM (geti >>= maybe (return False) (compareInodeCaches fc))
|
|
( do
|
|
-- Update the InodeCache to avoid
|
|
-- performing this expensive check again.
|
|
addinodecaches key [fc]
|
|
return True
|
|
, return False
|
|
)
|
|
, return False
|
|
)
|
|
geti = withTSDelta (liftIO . genInodeCache f)
|
|
|
|
isUnmodifiedCheapLowLevel :: InodeCache -> [InodeCache] -> Annex Bool
|
|
isUnmodifiedCheapLowLevel fc ic = anyM (compareInodeCaches fc) ic
|