diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-12-10 14:29:34 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-12-10 14:50:52 -0400 |
commit | dd4d3a4c327948a24bf0e2c7cf82ed66999437aa (patch) | |
tree | ff6740b01aecc0c66f8f79a156c06ae3ed5a6e4c /Annex | |
parent | 1dd612b2b106911433b0d3f6593ba7c2ce48483a (diff) |
check inode cache in prepSendAnnex
This does mean one query of the database every time an object is sent.
May impact performance.
Diffstat (limited to 'Annex')
-rw-r--r-- | Annex/Content.hs | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/Annex/Content.hs b/Annex/Content.hs index 12859c856..bfc70ac9a 100644 --- a/Annex/Content.hs +++ b/Annex/Content.hs @@ -518,7 +518,7 @@ data LinkAnnexResult = LinkAnnexOk | LinkAnnexFailed | LinkAnnexNoop {- Runs an action to transfer an object's content. - - - In direct mode, it's possible for the file to change as it's being sent. + - In some cases, it's possible for the file to change as it's being sent. - If this happens, runs the rollback action and returns False. The - rollback action should remove the data that was transferred. -} @@ -538,8 +538,9 @@ sendAnnex key rollback sendobject = go =<< prepSendAnnex key {- Returns a file that contains an object's content, - and a check to run after the transfer is complete. - - - In direct mode, it's possible for the file to change as it's being sent, - - and the check detects this case and returns False. + - When a file is unlocked (or in direct mode), it's possble for its + - content to change as it's being sent. The check detects this case + - and returns False. - - Note that the returned check action is, in some cases, run in the - Annex monad of the remote that is receiving the object, rather than @@ -548,13 +549,26 @@ sendAnnex key rollback sendobject = go =<< prepSendAnnex key prepSendAnnex :: Key -> Annex (Maybe (FilePath, Annex Bool)) prepSendAnnex key = withObjectLoc key indirect direct where - indirect f = return $ Just (f, return True) + indirect f = do + cache <- Database.Keys.getInodeCaches key + cache' <- if null cache + -- Since no inode cache is in the database, this + -- object is not currently unlocked. But that could + -- change while the transfer is in progress, so + -- generate an inode cache for the starting + -- content. + then maybeToList <$> + withTSDelta (liftIO . genInodeCache f) + else pure cache + return $ if null cache' + then Nothing + else Just (f, sameInodeCache f cache') direct [] = return Nothing direct (f:fs) = do cache <- Direct.recordedInodeCache key -- check that we have a good file - ifM (Direct.sameInodeCache f cache) - ( return $ Just (f, Direct.sameInodeCache f cache) + ifM (sameInodeCache f cache) + ( return $ Just (f, sameInodeCache f cache) , direct fs ) |