[commit: ghc] master: Always use the safe open() call (cafe983)
git at git.haskell.org
git at git.haskell.org
Mon Dec 11 19:26:58 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/cafe98345cb5d4b11f2059d60d2f20e976ef4f2a/ghc
>---------------------------------------------------------------
commit cafe98345cb5d4b11f2059d60d2f20e976ef4f2a
Author: Simon Marlow <marlowsd at gmail.com>
Date: Mon Dec 11 12:56:09 2017 -0500
Always use the safe open() call
open() can sometimes take a long time, for example on NFS or FUSE
filesystems. We recently had a case where open() was taking multiple
seconds to return for a (presumably overloaded) FUSE filesystem, which
blocked GC and caused severe issues.
Test Plan: validate
Reviewers: niteria, bgamari, nh2, hvr, erikd
Reviewed By: bgamari
Subscribers: rwbarton, thomie, carter
GHC Trac Issues: #13296
Differential Revision: https://phabricator.haskell.org/D4239
>---------------------------------------------------------------
cafe98345cb5d4b11f2059d60d2f20e976ef4f2a
libraries/base/GHC/IO/FD.hs | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/libraries/base/GHC/IO/FD.hs b/libraries/base/GHC/IO/FD.hs
index a7a34c1..4a4f063 100644
--- a/libraries/base/GHC/IO/FD.hs
+++ b/libraries/base/GHC/IO/FD.hs
@@ -179,14 +179,10 @@ openFile filepath iomode non_blocking =
| otherwise = oflags2
in do
- -- the old implementation had a complicated series of three opens,
- -- which is perhaps because we have to be careful not to open
- -- directories. However, the man pages I've read say that open()
- -- always returns EISDIR if the file is a directory and was opened
- -- for writing, so I think we're ok with a single open() here...
- fd <- throwErrnoIfMinus1Retry "openFile"
- (if non_blocking then c_open f oflags 0o666
- else c_safe_open f oflags 0o666)
+ -- NB. always use a safe open(), because we don't know whether open()
+ -- will be fast or not. It can be slow on NFS and FUSE filesystems,
+ -- for example.
+ fd <- throwErrnoIfMinus1Retry "openFile" $ c_safe_open f oflags 0o666
(fD,fd_type) <- mkFD fd iomode Nothing{-no stat-}
False{-not a socket-}
More information about the ghc-commits
mailing list