From e853ef30958c41e35bbc3df607cc02318a4ded8a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 30 Aug 2021 13:05:02 -0400 Subject: [PATCH] decorate openTempFile errors with the template name This is to track down what file in .git/annex/ is being written to via a temp file when the repository is read-only. Sponsored-by: Dartmouth College's Datalad project --- Annex/Branch.hs | 3 ++- Annex/Ingest.hs | 2 +- Utility/LockFile/PidLock.hs | 3 ++- Utility/Tmp.hs | 18 ++++++++++++++++-- ...3_a4f9bb23f0682a66e951b96aed6ae214._comment | 15 +++++++++++---- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Annex/Branch.hs b/Annex/Branch.hs index 28208d266e..d7ce140d13 100644 --- a/Annex/Branch.hs +++ b/Annex/Branch.hs @@ -84,6 +84,7 @@ import Annex.Branch.Transitions import qualified Annex import Annex.Hook import Utility.Directory.Stream +import Utility.Tmp import qualified Utility.RawFilePath as R {- Name of the branch that is used to store git-annex's information. -} @@ -596,7 +597,7 @@ stageJournal jl commitindex = withIndex $ withOtherTmp $ \tmpdir -> do mapM_ (removeFile . (dir )) stagedfs hClose jlogh removeWhenExistsWith (R.removeLink) (toRawFilePath jlogf) - openjlog tmpdir = liftIO $ openTempFile tmpdir "jlog" + openjlog tmpdir = liftIO $ openTmpFileIn tmpdir "jlog" {- This is run after the refs have been merged into the index, - but before the result is committed to the branch. diff --git a/Annex/Ingest.hs b/Annex/Ingest.hs index bed8d38e5b..8c09243abc 100644 --- a/Annex/Ingest.hs +++ b/Annex/Ingest.hs @@ -110,7 +110,7 @@ lockDown' cfg file = tryNonAsync $ ifM crippledFileSystem withhardlink tmpdir = do setperms withTSDelta $ \delta -> liftIO $ do - (tmpfile, h) <- openTempFile (fromRawFilePath tmpdir) $ + (tmpfile, h) <- openTmpFileIn (fromRawFilePath tmpdir) $ relatedTemplate $ "ingest-" ++ takeFileName file hClose h removeWhenExistsWith R.removeLink (toRawFilePath tmpfile) diff --git a/Utility/LockFile/PidLock.hs b/Utility/LockFile/PidLock.hs index 521422d16b..c4e80f7749 100644 --- a/Utility/LockFile/PidLock.hs +++ b/Utility/LockFile/PidLock.hs @@ -33,6 +33,7 @@ import Utility.Hash import Utility.FileSystemEncoding import Utility.Env import Utility.Env.Set +import Utility.Tmp import qualified Utility.LockFile.Posix as Posix import System.IO @@ -143,7 +144,7 @@ tryLock lockfile = do where go abslockfile sidelock = do let abslockfile' = fromRawFilePath abslockfile - (tmp, h) <- openTempFile (takeDirectory abslockfile') "locktmp" + (tmp, h) <- openTmpFileIn (takeDirectory abslockfile') "locktmp" let tmp' = toRawFilePath tmp setFileMode tmp' (combineModes readModes) hPutStr h . show =<< mkPidLock diff --git a/Utility/Tmp.hs b/Utility/Tmp.hs index 5877f68634..92bd921bc8 100644 --- a/Utility/Tmp.hs +++ b/Utility/Tmp.hs @@ -14,6 +14,7 @@ module Utility.Tmp ( withTmpFile, withTmpFileIn, relatedTemplate, + openTmpFileIn, ) where import System.IO @@ -21,6 +22,7 @@ import System.FilePath import System.Directory import Control.Monad.IO.Class import System.PosixCompat.Files hiding (removeLink) +import System.IO.Error import Utility.Exception import Utility.FileSystemEncoding @@ -28,6 +30,18 @@ import Utility.FileMode type Template = String +{- This is the same as openTempFile, except when there is an + - error, it displays the template as well as the directory, + - to help identify what call was responsible. + -} +openTmpFileIn :: FilePath -> String -> IO (FilePath, Handle) +openTmpFileIn dir template = openTempFile dir template + `catchIO` decoraterrror + where + decoraterrror e = throwM $ + let loc = ioeGetLocation e ++ " template " ++ template + in annotateIOError e loc Nothing Nothing + {- Runs an action like writeFile, writing to a temp file first and - then moving it into place. The temp file is stored in the same - directory as the final file to avoid cross-device renames. @@ -43,7 +57,7 @@ viaTmp a file content = bracketIO setup cleanup use template = relatedTemplate (base ++ ".tmp") setup = do createDirectoryIfMissing True dir - openTempFile dir template + openTmpFileIn dir template cleanup (tmpfile, h) = do _ <- tryIO $ hClose h tryIO $ removeFile tmpfile @@ -73,7 +87,7 @@ withTmpFile template a = do withTmpFileIn :: (MonadIO m, MonadMask m) => FilePath -> Template -> (FilePath -> Handle -> m a) -> m a withTmpFileIn tmpdir template a = bracket create remove use where - create = liftIO $ openTempFile tmpdir template + create = liftIO $ openTmpFileIn tmpdir template remove (name, h) = liftIO $ do hClose h catchBoolIO (removeFile name >> return True) diff --git a/doc/bugs/unable_to_get_content_via_ssh_without_write_perms/comment_3_a4f9bb23f0682a66e951b96aed6ae214._comment b/doc/bugs/unable_to_get_content_via_ssh_without_write_perms/comment_3_a4f9bb23f0682a66e951b96aed6ae214._comment index dc74a9b096..ebee761167 100644 --- a/doc/bugs/unable_to_get_content_via_ssh_without_write_perms/comment_3_a4f9bb23f0682a66e951b96aed6ae214._comment +++ b/doc/bugs/unable_to_get_content_via_ssh_without_write_perms/comment_3_a4f9bb23f0682a66e951b96aed6ae214._comment @@ -3,11 +3,18 @@ subject="""comment 3""" date="2021-08-30T16:24:52Z" content=""" -reversion in [[!commit f46e4c9b7c]], which reversed some logic and made -database reads be treated as database writes, so they failed on permission -denied, rather than the right behavior of returning DbUnavailable. Fixed that. +keysdb error was a reversion in [[!commit f46e4c9b7c]], which reversed some +logic and made database reads be treated as database writes, so it failed +on permission denied, rather than the right behavior of returning +DbUnavailable when it cannot read or the database does not exist yet. + +Fixed that. It seems to work for me now, both get and drop, and over ssh or +direct access to the readonly repository. I have not been able to reproduce the other error involving opening a temp file. All I can tell from the message is that it's writing -to some file in .git/annex via a temp file in the same directory. +to some file in .git/annex via a temp file in the same directory, but +I don't know what file it is trying to write. I've made a change that +will include more information in that error message. So either update +your build of git-annex, or find a better reproduction recipe for that.. """]] -- 2.30.2