summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-05-13 14:27:39 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-05-13 14:27:39 -0400
commitbcea6a777569d7a4188a4f4d94a84f7477cbc366 (patch)
treeab3ab8c560903294ab9acb871bf091564e7aa662
parent01fd60a145872cd40f66bf8d3c8eaeeea25d3837 (diff)
migrate: Detect if a file gets corrupted while it's being migrated.
-rw-r--r--Command/Migrate.hs19
-rw-r--r--debian/changelog1
2 files changed, 13 insertions, 7 deletions
diff --git a/Command/Migrate.hs b/Command/Migrate.hs
index d8bfd74f1..0fdf0e817 100644
--- a/Command/Migrate.hs
+++ b/Command/Migrate.hs
@@ -52,15 +52,20 @@ upgradableKey backend key = isNothing (Types.Key.keySize key) || backendupgradab
{- Store the old backend's key in the new backend
- The old backend's key is not dropped from it, because there may
- - be other files still pointing at that key. -}
+ - be other files still pointing at that key.
+ -
+ - To ensure that the data we have for the old key is valid, it's
+ - fscked here. First we generate the new key. This ensures that the
+ - data cannot get corrupted after the fsck but before the new key is
+ - generated.
+ -}
perform :: FilePath -> Key -> Backend -> Backend -> CommandPerform
-perform file oldkey oldbackend newbackend = do
- ifM (Command.Fsck.checkBackend oldbackend oldkey (Just file))
- ( maybe stop go =<< genkey
- , stop
- )
+perform file oldkey oldbackend newbackend = go =<< genkey
where
- go newkey = stopUnless (Command.ReKey.linkKey oldkey newkey) $
+ go Nothing = stop
+ go (Just newkey) = stopUnless checkcontent $ finish newkey
+ checkcontent = Command.Fsck.checkBackend oldbackend oldkey $ Just file
+ finish newkey = stopUnless (Command.ReKey.linkKey oldkey newkey) $
next $ Command.ReKey.cleanup file oldkey newkey
genkey = do
content <- calcRepo $ gitAnnexLocation oldkey
diff --git a/debian/changelog b/debian/changelog
index 4eb01a0ab..6b94c4559 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -23,6 +23,7 @@ git-annex (4.20130502) UNRELEASED; urgency=low
* rsync special remotes: When sending from a crippled filesystem, use
the destination's default file permissions, as the local ones can
be arbitrarily broken. (Ie, ----rwxr-x for files on Android)
+ * migrate: Detect if a file gets corrupted while it's being migrated.
-- Joey Hess <joeyh@debian.org> Thu, 02 May 2013 20:39:19 -0400