[GHC] #8591: Concurrent executions of ghc-pkg can cause inconstant package.cache files

GHC ghc-devs at haskell.org
Tue Dec 3 01:27:35 UTC 2013


#8591: Concurrent executions of ghc-pkg can cause inconstant package.cache files
------------------------------------+----------------------------
       Reporter:  janm              |             Owner:
           Type:  bug               |            Status:  new
       Priority:  normal            |         Milestone:
      Component:  Package system    |           Version:  7.6.3
       Keywords:  ghc-pkg race      |  Operating System:  FreeBSD
   Architecture:  Unknown/Multiple  |   Type of failure:  Other
     Difficulty:  Unknown           |         Test Case:
     Blocked By:                    |          Blocking:
Related Tickets:                    |
------------------------------------+----------------------------
 I am doing 24 way parallel builds of system images, including all packages
 on a system. This includes ghc and multiple ghc packages.

 I am seeing intermittent dependency failure from the ghc packaging system.
 From examining Main.hs in ghc-pkg, I see the function withFileAtomic write
 to a temporary file in package.conf.d and then atomically rename on top of
 a target file, package.cache in the case. With parallel execution the last
 rename would win, leading to lost entries in package.cache.

 In my case, the following things happened: ("Building" indicates a start,
 "Built" indicates completion, "Installing" is setup in a separate chroot'd
 environment and is isolated)

 The FreeBSD ports system is used to drive the Haskell build system.

 The process works single threaded and fails intermittently when done in
 parallel.

 Building: devel/hs-data-default-instances-base
 Building: devel/hs-data-default-instances-containers
 Building: devel/hs-data-default-instances-old-locale
 Built: devel/hs-dlist
 Building: devel/hs-data-default-instances-dlist
 Built: devel/hs-temporary
 Built: jail-image-full
 Installing: system-image__jail-image-full
 Built: devel/hs-base64-bytestring
 Built: archivers/hs-zlib
 Building: security/hs-digest
 Built: devel/hs-syb
 Building: textproc/hs-hs-bibutils
 Building: textproc/hs-pandoc-types
 Built: devel/hs-utf8-string
 Built: devel/hs-data-default-instances-old-locale
 Built: devel/hs-data-default-instances-containers
 Built: devel/hs-data-default-instances-base
 Built: devel/hs-data-default-instances-dlist
 Building: devel/hs-data-default
 Built: devel/hs-random
 Installed: system-image__lang/ghc
 Installing: system-image__archivers/hs-zlib
 Installing: system-image__devel/hs-utf8-string
 Installing: system-image__devel/hs-syb
 Installing: system-image__devel/hs-base64-bytestring
 Installing: system-image__devel/hs-data-default-class
 Installing: system-image__devel/hs-dlist
 Installing: system-image__devel/hs-random
 Installing: system-image__devel/hs-temporary
 Installing: system-image__devel/hs-extensible-exceptions
 Built: devel/hs-data-default FAILED

 The error from the Haskell data-default build was:

 setup: At least the following dependencies are missing:
 data-default-instances-base -any

 Looking in the in the package.conf.d directory shows that the data-
 default-instances-base-0.0.1-7bdf8678f0d8637e096e397e7910f82a.conf file
 was present, but running "ghc-pkg list" did not show data-default-
 instances-base

 Running /usr/local/lib/cabal/ghc-7.6.3/data-default-instances-
 base-0.0.1/register.sh (which was also present) caused ghc-pkg to now show
 data-default-instances-base.

 To me this looks like a race condition between multiple instances of ghc-
 pkg causing the cache to become inconsistent.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8591>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list