Don't insert the same pack twice into a pack list
commit374c28057a33c580f40a7c78ad906ee9f4d0587e
authorShawn O. Pearce <spearce@spearce.org>
Mon, 26 Apr 2010 22:11:41 +0000 (26 15:11 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 27 Apr 2010 00:33:53 +0000 (26 17:33 -0700)
tree24e2b596b803ed5375aa303594c31db8f23a532a
parenta0a52897ed3fb66ff8a7e1737bf854042f77f0ce
Don't insert the same pack twice into a pack list

If a concurrent thread picks up a newly created PackFile and adds
it to the pack list before the IndexPack thread itself can insert
the item onto the front of the list, do nothing and use the item
that was picked up by that other concurrent scanning thread.

This avoids a potential condition where the same pack exists in
memory twice, which causes confusion later during a rescan of the
directory because we don't know exactly which PackFile instance
should be retained into the new list, and which should be discarded.

We can stop searching through the old pack list as soon as the
sort function declares that the item to insert should be before
the item already in the list.  Because the list is always sorted
by modification time (in seconds), we should never encounter a
case where the pack is positioned at the wrong spot in the list.
This early break out still permits an efficient implementation of
the common case, inserting a new pack at the head of the list.

Change-Id: Ice4459bbd4ee9487078aff5257893883d04f05fb
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDirectory.java