git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [JGIT PATCH 0/4] RepositoryTestCase cleanups

From
Shawn O. Pearce <spearce@spearce.org>
Date
Nov 27, 2008, 21:49 UTC
Message-ID
<20081127214916.GD23984@spearce.org>
In-Reply-To
<1227820410-9621-1-git-send-email-robin.rosenberg@dewire.com>
Robin Rosenberg <robin.rosenberg@dewire.com> wrote:
> Ok, so here is an attempt to improve the ability of the JGit's unit
> tests to delete temporary repositories. This has probably been seen
> by many, but Jonas Fonseca raised the issue.
Hmpph.  This takes 19 seconds to run the suite, where it used to be
only 2 seconds on the same system.  The slower run isn't something
I'm too happy about, actually I'd like to make the run even faster
than 2 seconds.
 
Show 6 quoted lines
> The background is that on Windows you cannot delete files that are
> open and mmapped files are open until they get unmapped, which in
> Java is beyond explicit programmer control. You can only free the
> resources and pray that the GC does the work. Fortunately it usually
> does. It turned out our testcases weren't even trying to clean up
> properly. 

If the issue is mmap'd files, why don't we instead disable mmap on Windows during JUnit tests, and use the non-mmap variant of pack access? At least do that for the bulk of the tests, and then have a single test case which tests the mmap code path but has careful System.gc calls in place to try and ensure we can actually clean up the temporary files.

Another option is to refactor the Repository class a little so we can replace local filesystem IO with something else, like say an in-core repository. E.g. a pack file and/or pack index stored in a byte[], and refs stored in a HashMap. We'd still need a couple of tests to verify local disk IO, but many of the tests can be validated against such a pure in-memory Repository concept.

I'd actually like to get that Repository refactoring done soon, someone else was asking about it for the RefDatabase (to store the refs in a SQL database so JGit ties into JTA) but I may also want it for Gerrit 2 - I'm looking at doing something that would put 200,000 refs per year into a repository. That's so large that most operations can't afford to scan the entire ref database, and it really cannot be loose. ;-)

Refactoring repository is a fair chunk of work, disabling the mmap feature under Windows in JUnit may be easier. Hmm, according to WindowCache's <clinit> its default by false. Why is it enabling on Windows? The only code that calls WindowCache.reconfigure() is in the Eclipse plugin, so pure JGit unit tests shouldn't be turning on mmap code *at all*.

Which also points out a gap in our tests. Nothing new, we have lots of gaps. *sigh*

-- 
Shawn.
Previous: Robin RosenbergNext: Robin Rosenberg
Message 2 of 15 in “RepositoryTestCase cleanups”
  1. 0/4 RepositoryTestCase cleanupsRobin Rosenberg, Nov 27, 2008
  2. Shawn O. PearceNov 27, 2008
  3. Robin RosenbergNov 29, 2008
  4. Johannes SchindelinDec 1, 2008
  5. Robin RosenbergNov 30, 2008
  6. 0/8 Unit test cleanupsRobin Rosenberg, Nov 30, 2008
  7. 1/8 Drop unneeded code in unit testsRobin Rosenberg, Nov 30, 2008
  8. 2/8 Cleanup malformed test casesRobin Rosenberg, Nov 30, 2008
  9. 3/8 Turn off memory mapping in JGit unit tests by defaultRobin Rosenberg, Nov 30, 2008
  10. 4/8 Add a counter to make sure the test repo name is uniqueRobin Rosenberg, Nov 30, 2008
  11. 5/8 Make the cleanup less verbose when it fails to delete temporary stuff.Robin Rosenberg, Nov 30, 2008
  12. 6/8 Cleanup after each test.Robin Rosenberg, Nov 30, 2008
  13. 7/8 Close files opened by unit testing frameworkRobin Rosenberg, Nov 30, 2008
  14. 8/8 Hard failure on unit test cleanups if they fail.Robin Rosenberg, Nov 30, 2008
  15. Shawn O. PearceDec 2, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.