fsck: Check for and repair location log damage.

This commit is contained in:
Joey Hess 2011-03-02 14:30:36 -04:00
parent a3daac8a8b
commit 6206b46e60
2 changed files with 42 additions and 3 deletions

View file

@ -7,11 +7,17 @@
module Command.Fsck where module Command.Fsck where
import Control.Monad.State (liftIO)
import Command import Command
import qualified Backend import qualified Backend
import qualified Annex
import UUID
import Types import Types
import Messages import Messages
import Utility import Utility
import Content
import LocationLog
command :: [Command] command :: [Command]
command = [Command "fsck" (paramOptional $ paramRepeating paramPath) seek command = [Command "fsck" (paramOptional $ paramRepeating paramPath) seek
@ -20,7 +26,6 @@ command = [Command "fsck" (paramOptional $ paramRepeating paramPath) seek
seek :: [CommandSeek] seek :: [CommandSeek]
seek = [withAttrFilesInGit "annex.numcopies" start] seek = [withAttrFilesInGit "annex.numcopies" start]
{- Checks a file's backend data for problems. -}
start :: CommandStartAttrFile start :: CommandStartAttrFile
start (file, attr) = isAnnexed file $ \(key, backend) -> do start (file, attr) = isAnnexed file $ \(key, backend) -> do
showStart "fsck" file showStart "fsck" file
@ -30,7 +35,40 @@ start (file, attr) = isAnnexed file $ \(key, backend) -> do
perform :: Key -> FilePath -> Backend Annex -> Maybe Int -> CommandPerform perform :: Key -> FilePath -> Backend Annex -> Maybe Int -> CommandPerform
perform key file backend numcopies = do perform key file backend numcopies = do
success <- Backend.fsckKey backend key (Just file) numcopies -- the location log is checked first, so that if it has bad data
if success -- that gets corrected
locationlogok <- verifyLocationLog key file
backendok <- Backend.fsckKey backend key (Just file) numcopies
if locationlogok && backendok
then return $ Just $ return True then return $ Just $ return True
else return Nothing else return Nothing
{- Checks that the location log reflects the current status of the key,
in this repository only. -}
verifyLocationLog :: Key -> FilePath -> Annex Bool
verifyLocationLog key file = do
present <- inAnnex key
g <- Annex.gitRepo
u <- getUUID g
uuids <- liftIO $ keyLocations g key
case (present, u `elem` uuids) of
(True, False) -> do
fix g u ValuePresent
-- There is no data loss, so do not fail.
return True
(False, True) -> do
fix g u ValueMissing
warning $
"** Based on the location log, " ++ file
++ "\n** was expected to be present, " ++
"but its content is missing."
return False
_ -> return True
where
fix g u s = do
showNote "fixing location log"
_ <- liftIO $ logChange g key u s
return ()

1
debian/changelog vendored
View file

@ -9,6 +9,7 @@ git-annex (0.22) UNRELEASED; urgency=low
to a utility it will be escaped to avoid it being interpreted as an to a utility it will be escaped to avoid it being interpreted as an
option. option.
* New backends: SHA512 SHA384 SHA256 SHA224 * New backends: SHA512 SHA384 SHA256 SHA224
* fsck: Check for and repair location log damage.
-- Joey Hess <joeyh@debian.org> Sun, 13 Feb 2011 00:48:02 -0400 -- Joey Hess <joeyh@debian.org> Sun, 13 Feb 2011 00:48:02 -0400