decorate openTempFile errors with the template name
authorJoey Hess <joeyh@joeyh.name>
Mon, 30 Aug 2021 17:05:02 +0000 (13:05 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 30 Aug 2021 17:05:02 +0000 (13:05 -0400)
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
Annex/Ingest.hs
Utility/LockFile/PidLock.hs
Utility/Tmp.hs
doc/bugs/unable_to_get_content_via_ssh_without_write_perms/comment_3_a4f9bb23f0682a66e951b96aed6ae214._comment

index 28208d266e47630fad8dae2bfc7dcbcc8cd341fe..d7ce140d137bbec2bca52e6e1899d3e409b6287f 100644 (file)
@@ -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.
index bed8d38e5b835fbfc6949d40ed9b15f921379d3f..8c09243abcd830fc44341753a03a52413d9f32e6 100644 (file)
@@ -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)
index 521422d16b5de6383b21cf2bccd05fd643052e0c..c4e80f7749e48e0f194d543bd52fb60720f686d9 100644 (file)
@@ -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
index 5877f68634d92f683cb7d583bf04de1d3ab8c20c..92bd921bc80e5120150dff8674f2f9f312effe26 100644 (file)
@@ -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)
index dc74a9b09683d06fca6010d9dfd87bd354cfa1a5..ebee761167dced59d26ad902c4dc4868d09b9a70 100644 (file)
@@ -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..
 """]]