
what might be possible is that hLock uses fcntl locking, ghc-pkg opens a database r/o if it can't open it > r/w, and it tried to acquire a write lock (which will fail with EBADF if the file descriptor is only open for > read). and there is an SElinux context prohibiting your process opening
#13945: 'ghc-pkg update' fails due to bad file descriptor error -------------------------------------+------------------------------------- Reporter: mpickering | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by mpickering): * cc: goldfire (added) @@ -35,1 +35,3 @@ - Here is the call stack from the crash if that's useful. + A workaround is to make sure that `HAVE_FLOCK` is not defined, the way I + did this was commenting out the three relevant lines in + libraries/base/configure.ac. @@ -37,50 +39,7 @@ - {{{ - CallStack (from HasCallStack): - die', called at - libraries/Cabal/Cabal/Distribution/Simple/Program/Run.hs:142:7 in - main:Distribution.Simple.Program.Run - runProgramInvocation, called at - libraries/Cabal/Cabal/Distribution/Simple/Program/HcPkg.hs:167:5 in - main:Distribution.Simple.Program.HcPkg - register, called at - libraries/Cabal/Cabal/Distribution/Simple/GHC.hs:1709:5 in - main:Distribution.Simple.GHC - registerPackage, called at - libraries/Cabal/Cabal/Distribution/Simple/Register.hs:350:14 in - main:Distribution.Simple.Register - registerPackage, called at - libraries/Cabal/Cabal/Distribution/Simple/Register.hs:172:16 in - main:Distribution.Simple.Register - registerAll, called at - libraries/Cabal/Cabal/Distribution/Simple/Register.hs:125:5 in - main:Distribution.Simple.Register - register, called at libraries/Cabal/Cabal/Distribution/Simple.hs:770:10 - in main:Distribution.Simple - defaultRegHook, called at - libraries/Cabal/Cabal/Distribution/Simple.hs:584:20 in - main:Distribution.Simple - regHook, called at - libraries/Cabal/Cabal/Distribution/Simple/UserHooks.hs:120:5 in - main:Distribution.Simple.UserHooks - regHook, called at - libraries/Cabal/Cabal/Distribution/Simple/UserHooks.hs:120:5 in - main:Distribution.Simple.UserHooks - cmd_hook, called at libraries/Cabal/Cabal/Distribution/Simple.hs:452:38 - in main:Distribution.Simple - cmd_hook, called at libraries/Cabal/Cabal/Distribution/Simple.hs:469:4 - in main:Distribution.Simple - hookedActionWithArgs, called at - libraries/Cabal/Cabal/Distribution/Simple.hs:451:5 in - main:Distribution.Simple - hookedAction, called at - libraries/Cabal/Cabal/Distribution/Simple.hs:430:5 in - main:Distribution.Simple - registerAction, called at - libraries/Cabal/Cabal/Distribution/Simple.hs:184:50 in - main:Distribution.Simple - defaultMainHelper, called at - libraries/Cabal/Cabal/Distribution/Simple.hs:133:28 in - main:Distribution.Simple - defaultMainWithHooksArgs, called at utils/ghc-cabal/Main.hs:214:6 in - main:Main - }}} + geekosaur suggests on IRC that the problem might be + + > what might be possible is that hLock uses fcntl locking, ghc-pkg opens a + database r/o if it can't open it > r/w, and it tried to acquire a write + lock (which will fail with EBADF if the file descriptor is only open for > + > read). and there is an SElinux context prohibiting your process opening + the db for write New description: In the final part of installation when packages are registered, the following command fails {{{ "inplace/bin/ghc-cabal" register libraries/ghc-prim dist-install "/home/pgrads/mp16005/linux/installed-ghc/lib/ghc-8.2.0.20170708/bin/ghc" "/home/pgrads/mp16005/linux/installed-ghc/lib/ghc-8.2.0.20170708/bin/ghc- pkg" "/home/pgrads/mp16005/linux/installed-ghc/lib/ghc-8.2.0.20170708" '' '/home/pgrads/mp16005/linux/installed-ghc' '/home/pgrads/mp16005/linux /installed-ghc/lib/ghc-8.2.0.20170708' '/home/pgrads/mp16005/linux /installed-ghc/share/doc/ghc-8.2.0.20170708/html/libraries' NO }}} with the following output {{{ Registering library for ghc-prim-0.5.0.0.. ghc-cabal: '/home/pgrads/mp16005/linux/installed-ghc/lib/ghc-8.2.0.20170708/bin/ghc- pkg' exited with an error: ghc-pkg: Couldn't open database /home/pgrads/mp16005/linux/installed- ghc/lib/ghc-8.2.0.20170708/package.conf.d for modification: {handle: /home/pgrads/mp16005/linux/installed- ghc/lib/ghc-8.2.0.20170708/package.conf.d/package.cache.lock}: hLock: invalid argument (Bad file descriptor) }}} It might be something to do with the permissions I have on my machine but I used to be able to install ghc if I gave it a suitable prefix other than `/usr/local`. A workaround is to make sure that `HAVE_FLOCK` is not defined, the way I did this was commenting out the three relevant lines in libraries/base/configure.ac. geekosaur suggests on IRC that the problem might be the db for write -- Comment: I updated the ticket as I think this will be a more general problem using 8.2.1 on any system where these restrictions exist. I can't properly diagnose the problem but geekosaur speculates an explanation which seemed plausible. This also seems the same issue that Richard was having back in March. https://mail.haskell.org/pipermail/ghc-devs/2017-March/013915.html -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13945#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler