Rescan packs if a pack is modified in-place (part 1)
commit1bf1c97220ef033e83869c4bdb63bea457e18d44
authorShawn O. Pearce <spearce@spearce.org>
Tue, 21 Apr 2009 01:21:09 +0000 (20 18:21 -0700)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Thu, 23 Apr 2009 22:25:57 +0000 (24 00:25 +0200)
treea8d7de36109f0f7fd2567a7762cd7d7639dfc605
parent86c09db9ecc5876524e0ae7a0aee15bb7df4a48c
Rescan packs if a pack is modified in-place (part 1)

If a pack file is modified in place it usually means that some other
process has repacked this repository, but the contents of this one
pack remained the same, but the object offsets may be different due
to different pack creation settings.  In such cases we can no longer
use the existing PacKFile or PackIndex instances and instead we need
to create new ones.

This isn't a full solution to the problem.  It is possible for an
application to obtain a PackedObjectLoader, see the PackFile get
closed due to pressure on the WindowCache, then fail when the pack
is reopened due to the pack being recreated on disk.  PackWriter
is very susceptible to this, as it caches PackedObjectLoaders for
a long time before it uses them to copy data out of an existing
pack file.

This particular solution only catches the failure where we had
opened the index a long time ago, closed the pack, and are now
opening it again in order to construct a PackedObjectLoader for
the caller.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
org.spearce.jgit/src/org/spearce/jgit/lib/ObjectDirectory.java
org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java