openFile gives "file is locked" error on Linux when creating a non-existing file

Kim-Ee Yeoh ky3 at atamo.com
Mon Oct 7 03:11:33 UTC 2024


What do you see when you run an strace?

On Mon, Oct 7, 2024 at 10:55 AM Harendra Kumar <harendra.kumar at gmail.com>
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 at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20241007/a5d75d8f/attachment.html>


More information about the ghc-devs mailing list