Clean up direct mode cache and mapping info when dropping keys.

These files were left behind, and made getKeysPresent find keys that were
not present. It would be expensive to make getKeysPresent check that the
actual key files are present (it just lists the directories). But that's not
needed if we just clean up the stale cache and mapping files.

To handle systems that were in direct mode and got switched back with stale
direct mode files, made cleanObjectLoc remove all files in the key's directory.

git annex unused will still list keys that are gone but for which the stale
direct mode files exists. To deal with that, made dropunused remove the key's
directory even if the key does not seem to be present.
This commit is contained in:
Joey Hess 2013-02-07 08:28:40 -04:00
parent 21cfce02ee
commit 57780cb3a4
5 changed files with 18 additions and 10 deletions

View file

@ -28,6 +28,7 @@ module Annex.Content (
freezeContent, freezeContent,
thawContent, thawContent,
replaceFile, replaceFile,
cleanObjectLoc,
) where ) where
import System.IO.Unsafe (unsafeInterleaveIO) import System.IO.Unsafe (unsafeInterleaveIO)
@ -334,7 +335,12 @@ withObjectLoc key indirect direct = ifM isDirect
cleanObjectLoc :: Key -> Annex () cleanObjectLoc :: Key -> Annex ()
cleanObjectLoc key = do cleanObjectLoc key = do
file <- inRepo $ gitAnnexLocation key file <- inRepo $ gitAnnexLocation key
liftIO $ removeparents file (3 :: Int) liftIO $ do
let dir = parentDir file
void $ catchMaybeIO $ do
allowWrite dir
removeDirectoryRecursive dir
removeparents dir (2 :: Int)
where where
removeparents _ 0 = noop removeparents _ 0 = noop
removeparents file n = do removeparents file n = do
@ -356,8 +362,8 @@ removeAnnex key = withObjectLoc key remove removedirect
cleanObjectLoc key cleanObjectLoc key
removedirect fs = do removedirect fs = do
cache <- recordedCache key cache <- recordedCache key
removeCache key
mapM_ (resetfile cache) fs mapM_ (resetfile cache) fs
cleanObjectLoc key
resetfile cache f = whenM (compareCache f cache) $ do resetfile cache f = whenM (compareCache f cache) $ do
l <- calcGitLink f key l <- calcGitLink f key
top <- fromRepo Git.repoPath top <- fromRepo Git.repoPath

View file

@ -15,7 +15,6 @@ module Annex.Content.Direct (
recordedCache, recordedCache,
compareCache, compareCache,
writeCache, writeCache,
removeCache,
genCache, genCache,
toCache, toCache,
Cache(..), Cache(..),
@ -129,12 +128,6 @@ writeCache key cache = withCacheFile key $ \cachefile -> do
createContentDir cachefile createContentDir cachefile
liftIO $ writeFile cachefile $ showCache cache liftIO $ writeFile cachefile $ showCache cache
{- Removes a cache. -}
removeCache :: Key -> Annex ()
removeCache key = withCacheFile key $ \f -> do
createContentDir f -- also thaws directory
liftIO $ nukeFile f
{- Cache a file's inode, size, and modification time to determine if it's {- Cache a file's inode, size, and modification time to determine if it's
- been changed. -} - been changed. -}
data Cache = Cache FileID FileOffset EpochTime data Cache = Cache FileID FileOffset EpochTime

View file

@ -60,7 +60,10 @@ performLocal key numcopies knownpresentremote = lockContent key $ do
untrusteduuids <- trustGet UnTrusted untrusteduuids <- trustGet UnTrusted
let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids'++untrusteduuids) let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids'++untrusteduuids)
stopUnless (canDropKey key numcopies trusteduuids' tocheck []) $ do stopUnless (canDropKey key numcopies trusteduuids' tocheck []) $ do
whenM (inAnnex key) $ removeAnnex key whenM (inAnnex key) $
removeAnnex key
{- Clean up stale direct mode files that may exist. -}
cleanObjectLoc key
next $ cleanupLocal key next $ cleanupLocal key
performRemote :: Key -> Maybe Int -> Remote -> CommandPerform performRemote :: Key -> Maybe Int -> Remote -> CommandPerform

3
debian/changelog vendored
View file

@ -13,6 +13,9 @@ git-annex (3.20130125) UNRELEASED; urgency=low
* pre-commit: Update direct mode mappings. * pre-commit: Update direct mode mappings.
* uninit, unannex --fast: If hard link creation fails, fall back to slow * uninit, unannex --fast: If hard link creation fails, fall back to slow
mode. mode.
* Clean up direct mode cache and mapping info when dropping keys.
* dropunused: Clean up stale direct mode cache and mapping info not
removed before.
-- Joey Hess <joeyh@debian.org> Sat, 26 Jan 2013 15:48:40 +1100 -- Joey Hess <joeyh@debian.org> Sat, 26 Jan 2013 15:48:40 +1100

View file

@ -56,3 +56,6 @@ What version of git-annex are you using? On what operating system?
git-annex: 3.20130124 git-annex: 3.20130124
Debian: sid 2013-02-01 Debian: sid 2013-02-01
> unused being confused by stale data left when switching from direct mode.
> I've made this be cleaned up. [[done]] --[[Joey]]