[GHC] #12554: Testsuite exhibits large amount of framework failures

GHC ghc-devs at haskell.org
Sat Oct 15 15:26:51 UTC 2016


#12554: Testsuite exhibits large amount of framework failures
-------------------------------------+-------------------------------------
        Reporter:  Phyx-             |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Test Suite        |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Windows           |         Architecture:
 Type of failure:  Incorrect result  |  Unknown/Multiple
  at runtime                         |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 Alright, I think I see what is going on here.

 But first some background. The testsuite driver runs each testcase in its
 own fresh directory to ensure a clean test environment. The code
 responsible for this can be found in `testlib.do_test()`. This looks
 something like the following,
 {{{#!python
 def do_test(name, way, func, args, files):
     opts = getTestOpts()
     shutil.rmtree(opts.testdir, ignore_errors=True)
     os.makedirs(opts.testdir)

     # Copy test files into testdir and run test
     ...
 }}}

 Note how we invoke `rmtree` with `ignore_errors=True`, presumably to
 account for the fact that `testdir` may not exist (e.g. if we are running
 in a fresh working directory). However, this unfortunately hides any
 **real** errors that we may encounter while trying to delete `testdir`, in
 which case we'll attempt to create `testdir` when it already exists.

 This appears to be precisely what happens some fraction of the time on
 Windows. Namely, if we rework `do_test` as follows,
 {{{#!python
 def do_test(name, way, func, args, files):
     opts = getTestOpts()
     if os.path.exists(opts.testdir):
         print('cleaning %s' % opts.testdir)
         shutil.rmtree(opts.testdir, ignore_errors=False)
     os.makedirs(opts.testdir)

     # Copy test files into testdir and run test
     ...
 }}}
 We find the following,
 {{{
 =====> TH_nameSpace(ext-interp) 39 of 42 [0, 3, 12]
 cleaning ./th/TH_nameSpace.run
 *** framework failure for TH_nameSpace(ext-interp) [Error 5] Access is
 denied: './th/TH_nameSpace.run/TH_nameSpace.exe'
 }}}

 I suspect this is due to the fact that executable images of running
 programs are locked and therefore cannot be deleted. The strange thing
 here is that the process has presumably already terminated. It seems like
 the test process must still be in some sort of zombie state where it has
 terminated and we have its exit code, but its resources (e.g. executable
 image) have still not been released.

 As one would expect, adding a `time.sleep(0.1)` before the `rmtree` hides
 the issue. It's not clear to me what the proper solution is here.

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


More information about the ghc-tickets mailing list