From 2e6e9876e3fc420a22eee82eedec54ac3f678878 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 18 Jul 2022 13:38:12 -0400 Subject: [PATCH] Revert "lock journal before reading journal files" This reverts commit 47358a6f956681346a198cdf27c60bcf9498cc45. This added overhead, and will not be needed, because appends are going to have to be made atomic for other reasons than avoiding incomplete reads of data being appended. In particular, when git-annex is interrupted in the middle of an append, it must not leave the file with a partially written line. So appending has to somehow be made fully atomic. --- Annex/Branch.hs | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/Annex/Branch.hs b/Annex/Branch.hs index 3e489e457d..4c84430b3c 100644 --- a/Annex/Branch.hs +++ b/Annex/Branch.hs @@ -236,7 +236,7 @@ updateTo' pairs = do else return $ "merging " ++ unwords (map Git.Ref.describe branches) ++ " into " ++ fromRef name - localtransitions <- getLocalTransitions jl + localtransitions <- getLocalTransitions unless (null tomerge) $ do showSideAction merge_desc mapM_ checkBranchDifferences refs @@ -265,7 +265,7 @@ updateTo' pairs = do -- Gather any transitions that are new to either the -- local branch or a remote ref, which will need to be -- applied on the fly. - localts <- lockJournal getLocalTransitions + localts <- getLocalTransitions remotets <- mapM getRefTransitions refs ts <- if all (localts ==) remotets then return [] @@ -307,14 +307,13 @@ get file = do content <- if journalIgnorable st then getRef fullname file else if null (unmergedRefs st) - then lockJournal $ - \jl -> getLocal jl file + then getLocal file else unmergedbranchfallback st setCache file content return content where unmergedbranchfallback st = do - l <- lockJournal $ \jl -> getLocal jl file + l <- getLocal file bs <- forM (unmergedRefs st) $ \ref -> getRef ref file let content = l <> mconcat bs return $ applytransitions (unhandledTransitions st) content @@ -344,7 +343,7 @@ precache file branchcontent = do st <- getState content <- if journalIgnorable st then pure branchcontent - else lockJournal $ \jl -> getJournalFile jl (GetPrivate True) file >>= return . \case + else getJournalFileStale (GetPrivate True) file >>= return . \case NoJournalledContent -> branchcontent JournalledContent journalcontent -> journalcontent PossiblyStaleJournalledContent journalcontent -> @@ -355,13 +354,13 @@ precache file branchcontent = do - reflect changes in remotes. - (Changing the value this returns, and then merging is always the - same as using get, and then changing its value.) -} -getLocal :: JournalLocked -> RawFilePath -> Annex L.ByteString -getLocal jl = getLocal' jl (GetPrivate True) +getLocal :: RawFilePath -> Annex L.ByteString +getLocal = getLocal' (GetPrivate True) -getLocal' :: JournalLocked -> GetPrivate -> RawFilePath -> Annex L.ByteString -getLocal' jl getprivate file = do +getLocal' :: GetPrivate -> RawFilePath -> Annex L.ByteString +getLocal' getprivate file = do fastDebug "Annex.Branch" ("read " ++ fromRawFilePath file) - go =<< getJournalFile jl getprivate file + go =<< getJournalFileStale getprivate file where go NoJournalledContent = getRef fullname file go (JournalledContent journalcontent) = return journalcontent @@ -395,12 +394,12 @@ getRef ref file = withIndex $ catFile ref file - modifes the current content of the file on the branch. -} change :: Journalable content => RegardingUUID -> RawFilePath -> (L.ByteString -> content) -> Annex () -change ru file f = lockJournal $ \jl -> f <$> getToChange jl ru file >>= set jl ru file +change ru file f = lockJournal $ \jl -> f <$> getToChange ru file >>= set jl ru file {- Applies a function which can modify the content of a file, or not. -} maybeChange :: Journalable content => RegardingUUID -> RawFilePath -> (L.ByteString -> Maybe content) -> Annex () maybeChange ru file f = lockJournal $ \jl -> do - v <- getToChange jl ru file + v <- getToChange ru file case f v of Just jv -> let b = journalableByteString jv @@ -421,8 +420,8 @@ changeOrAppend ru file f = lockJournal $ \jl -> do Append toappend -> append jl ru file oldc toappend {- Only get private information when the RegardingUUID is itself private. -} -getToChange :: JournalLocked -> RegardingUUID -> RawFilePath -> Annex L.ByteString -getToChange jl ru f = flip (getLocal' jl) f . GetPrivate =<< regardingPrivateUUID ru +getToChange :: RegardingUUID -> RawFilePath -> Annex L.ByteString +getToChange ru f = flip getLocal' f . GetPrivate =<< regardingPrivateUUID ru {- Records new content of a file into the journal. - @@ -708,10 +707,10 @@ stageJournal jl commitindex = withIndex $ withOtherTmp $ \tmpdir -> do removeWhenExistsWith (R.removeLink) (toRawFilePath jlogf) openjlog tmpdir = liftIO $ openTmpFileIn tmpdir "jlog" -getLocalTransitions :: JournalLocked -> Annex Transitions -getLocalTransitions jl = +getLocalTransitions :: Annex Transitions +getLocalTransitions = parseTransitionsStrictly "local" - <$> getLocal jl transitionsLog + <$> getLocal transitionsLog {- This is run after the refs have been merged into the index, - but before the result is committed to the branch. @@ -960,7 +959,7 @@ overBranchFileContents' select go st = do -- Check the journal, in case it did not get committed to the branch checkjournal f branchcontent | journalIgnorable st = return branchcontent - | otherwise = lockJournal $ \jl -> getJournalFile jl (GetPrivate True) f >>= return . \case + | otherwise = getJournalFileStale (GetPrivate True) f >>= return . \case NoJournalledContent -> branchcontent JournalledContent journalledcontent -> Just journalledcontent @@ -970,7 +969,7 @@ overBranchFileContents' select go st = do drain buf fs = case getnext fs of Just (v, f, fs') -> do liftIO $ putMVar buf fs' - content <- lockJournal $ \jl -> getJournalFile jl (GetPrivate True) f >>= \case + content <- getJournalFileStale (GetPrivate True) f >>= \case NoJournalledContent -> return Nothing JournalledContent journalledcontent -> return (Just journalledcontent)