efficient but unsafe journal file append

This is only for checking performance, it's not safe.

Sponsored-by: Dartmouth College's DANDI project
This commit is contained in:
Joey Hess 2022-07-18 13:47:56 -04:00
parent 2e6e9876e3
commit de18d92de6
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 14 additions and 8 deletions

View file

@ -414,7 +414,7 @@ data ChangeOrAppend t = Change t | Append t
-}
changeOrAppend :: Journalable content => RegardingUUID -> RawFilePath -> (L.ByteString -> ChangeOrAppend content) -> Annex ()
changeOrAppend ru file f = lockJournal $ \jl -> do
oldc <- getToChange jl ru file
oldc <- getToChange ru file
case f oldc of
Change newc -> set jl ru file newc
Append toappend -> append jl ru file oldc toappend

View file

@ -94,19 +94,25 @@ setJournalFile _jl ru file content = withOtherTmp $ \tmp -> do
{- Appends content to a journal file.
-
- TODO: Inefficient! -}
- The oldcontent is whatever is in the git-annex branch.
- When the journal file does not yet exist, the oldcontent
- is first written to the journal file.
-
- TODO: Unsafe! Does not append atomically. -}
appendJournalFile :: Journalable content => JournalLocked -> RegardingUUID -> RawFilePath -> L.ByteString -> content -> Annex ()
appendJournalFile _jl ru file oldcontent toappend = withOtherTmp $ \tmp -> do
appendJournalFile _jl ru file oldcontent toappend = do
jd <- fromRepo =<< ifM (regardingPrivateUUID ru)
( return gitAnnexPrivateJournalDir
, return gitAnnexJournalDir
)
let jfile = journalFile file
let tmpfile = tmp P.</> jfile
let write = liftIO $ do
withFile (fromRawFilePath tmpfile) WriteMode $ \h -> do
let jfile = fromRawFilePath $ jd P.</> journalFile file
let write = liftIO $ ifM (doesFileExist jfile)
( withFile jfile AppendMode $ \h ->
writeJournalHandle h toappend
, withFile jfile WriteMode $ \h -> do
writeJournalHandle h oldcontent
writeJournalHandle h toappend
)
write `catchIO` (const (createAnnexDirectory jd >> write))
data JournalledContent