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

Re: [JGIT PATCH 08/10] Scan for new packs if GIT_DIR/objects/pack has been modified

From
Shawn O. Pearce <spearce@spearce.org>
Date
Apr 21, 2009, 01:39 UTC
Message-ID
<20090421013911.GZ23604@spearce.org>
In-Reply-To
<1240276872-17893-9-git-send-email-spearce@spearce.org>
"Shawn O. Pearce" <spearce@spearce.org> wrote:
> If GIT_DIR/objects/pack directory has changed then one or more packs
...
> +	@Override
> +	protected boolean tryAgain1() {
> +		final PackFile[] old = packList.get();
> +		if (packDirectoryLastModified <= packDirectory.lastModified()) {

Sadly we needed to use <= here to avoid racy-git cases. Worse, unlike with the DirCache we don't have another file system inode we can use to compare timestamps against.

Consequently, I just realized my commit message isn't entirely accurate. In reality we rescan the #F*@!*! directory every time we have a miss, because the time stamp hasn't changed.

I can't think of another method to use here. I'd love to avoid the rescan on a miss if the aren't any new packs in the directory, but I just don't see how we can do that and avoid the racy-git case at the same time.

We could try to fudge it by saying < here, but the test cases in 9/10 would then require a Thread.sleep(2) or something to force enough time to pass for the directory modification time to advance.

I think in real applications, its "good enough" to allow this amount of fudging. We shouldn't see more than one repack per repository per FS clock tick. And if we do, the admin should be shot on sight.

git-repack is careful to ensure the new pack is linked into the directory before the old packs are unlinked, so we really shouldn't ever scan and miss a pack.

-- 
Shawn.
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 16 of 17 in “Object access improvements”
  1. 00/10 Object access improvementsShawn O. Pearce, Apr 21, 2009
  2. 01/10 Safely handle closing an already closed WindowedFileShawn O. Pearce, Apr 21, 2009
  3. 02/10 Change empty tree test case to use a temporary repositoryShawn O. Pearce, Apr 21, 2009
  4. 03/10 Replace hand-coded read fully loop with NB.readFullyShawn O. Pearce, Apr 21, 2009
  5. 04/10 Clear the reverse index when closing a PackFileShawn O. Pearce, Apr 21, 2009
  6. 05/10 Introduce a new exception type for an in-place pack modificationShawn O. Pearce, Apr 21, 2009
  7. 06/10 Refactor object database access with new abstractionShawn O. Pearce, Apr 21, 2009
  8. 07/10 Rescan packs if a pack is modified in-place (part 1)Shawn O. Pearce, Apr 21, 2009
  9. 08/10 Scan for new packs if GIT_DIR/objects/pack has been modifiedShawn O. Pearce, Apr 21, 2009
  10. 09/10 Add test cases for loading new (or replaced) pack filesShawn O. Pearce, Apr 21, 2009
  11. 10/10 BROKEN TEST: ObjectLoader stays valid across repacksShawn O. Pearce, Apr 21, 2009
  12. Robin RosenbergApr 21, 2009
  13. Shawn O. PearceApr 22, 2009
  14. Shawn O. PearceApr 22, 2009
  15. 09/10 Add test cases for loading new (or replaced) pack filesShawn O. Pearce, Apr 21, 2009
  16. Shawn O. PearceApr 21, 2009
  17. 08/10 Scan for new packs if GIT_DIR/objects/pack has been modifiedShawn O. Pearce, Apr 21, 2009

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.