Inspired by Viktor's latest email in the thread:

> Any pointers or more debug info to generate to debug this?

Given that this happens on Linux, it would be nice to have `strace` output on the program. If you know precisely which executable does this, `strace -o log.txt <the normal command to start that program>` suffices; additionally passing `-f` to strace instructs it to also trace child processes, at the cost of (usually) significantly blowing up the size of the trace.

Then we can see exactly which system call fails, and what happened right before.

- Tom

On 07/10/2024 04:55, Harendra Kumar wrote:
Hi everyone,

We have a long standing, elusive and intermittent test failure in
streamly's file system event test suite. The code where the error
emanates from looks like this:

createFileWithParent :: FilePath -> FilePath -> IO ()
createFileWithParent file parent = do
     let filepath = parent </> file
     let dir = takeDirectory filepath
     putStrLn $ "createFileWithParent: file ["
         ++ file ++ "] dir [" ++ dir ++ "]"
     putStrLn $ "Ensuring dir: " ++ dir
     createDirectoryIfMissing True dir
     r <- doesDirectoryExist dir
     if r
     then do
         putStrLn $ "Ensured dir: " ++ dir
         when (not (null file)) $ do
             exists <- doesFileExist filepath
             if not exists
             then do
                 putStrLn $ "Creating file: " ++ (parent </> file)
                 openFile (parent </> file) WriteMode >>= hClose
                 putStrLn $ "Created file: " ++ (parent </> file)
             else error $ "File exists: " ++ filepath
     else error $ "Could not create dir: " ++ dir


The important thing in the code above is that we check that the file
does not exist already, and we are creating it. Creating this new file
intermittently fails with the following error messages, all of these
are coming from prints in the above:

createFileWithParent: file [file1] dir
[/tmp/fsevent_dir-e1098325dc2b0880/watch-root]
Ensuring dir: /tmp/fsevent_dir-e1098325dc2b0880/watch-root
Ensured dir: /tmp/fsevent_dir-e1098325dc2b0880/watch-root
Creating file: /tmp/fsevent_dir-e1098325dc2b0880/watch-root/file1

uncaught exception: IOException of type ResourceBusy
/tmp/fsevent_dir-e1098325dc2b0880/watch-root/file1: openFile: resource
busy (file is locked)

How can a file that does not exist and being created be locked during
creation? We see this only on Linux, the same tests always succeed on
Windows and macOS. We are facing this in GHC 9.2.8, I am not sure if
it is version specific because in the past I selectively disabled the
tests for specific GHC versions and the error still surfaced in other
GHC versions.

Anything obvious that we may be missing here? Any pointers or more
debug info to generate to debug this? I have not started looking into
the openFile code yet, hoping someone else knowing it well might help
here.

Is this some other "resource busy" error which is being wrongly
bucketed into "file is locked" error?

Thanks,
Harendra
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to