Merge branch 'stable-6.6' into stable-6.7

* stable-6.6:
  Update to Tycho 4.0.1
  Add verification in GcKeepFilesTest that bitmaps are generated
  Express the explicit intention of creating bitmaps in GC
  GC: prune all packfiles after the loosen phase
  Prepare 5.13.3-SNAPSHOT builds
  JGit v5.13.2.202306221912-r

Change-Id: I7294c21748897eb3f94eeffbda944b62e3206c0d
This commit is contained in:
Matthias Sohn 2023-08-03 10:17:22 +02:00
commit abe155ea94
4 changed files with 35 additions and 6 deletions

View File

@ -23,7 +23,7 @@
<properties> <properties>
<java.version>11</java.version> <java.version>11</java.version>
<tycho-version>4.0.0</tycho-version> <tycho-version>4.0.1</tycho-version>
<target-platform>jgit-4.17</target-platform> <target-platform>jgit-4.17</target-platform>
</properties> </properties>

View File

@ -48,11 +48,15 @@ public void testKeepFiles() throws Exception {
assertEquals(4, stats.numberOfLooseObjects); assertEquals(4, stats.numberOfLooseObjects);
assertEquals(4, stats.numberOfPackedObjects); assertEquals(4, stats.numberOfPackedObjects);
assertEquals(1, stats.numberOfPackFiles); assertEquals(1, stats.numberOfPackFiles);
PackFile bitmapFile = singlePack.getPackFile().create(PackExt.BITMAP_INDEX);
assertTrue(keepFile.exists());
assertTrue(bitmapFile.delete());
gc.gc().get(); gc.gc().get();
stats = gc.getStatistics(); stats = gc.getStatistics();
assertEquals(0, stats.numberOfLooseObjects); assertEquals(0, stats.numberOfLooseObjects);
assertEquals(8, stats.numberOfPackedObjects); assertEquals(8, stats.numberOfPackedObjects);
assertEquals(2, stats.numberOfPackFiles); assertEquals(2, stats.numberOfPackFiles);
assertEquals(1, stats.numberOfBitmaps);
// check that no object is packed twice // check that no object is packed twice
Iterator<Pack> packs = repo.getObjectDatabase().getPacks() Iterator<Pack> packs = repo.getObjectDatabase().getPacks()

View File

@ -363,6 +363,7 @@ private void deleteOldPacks(Collection<Pack> oldPacks,
prunePreserved(); prunePreserved();
long packExpireDate = getPackExpireDate(); long packExpireDate = getPackExpireDate();
List<PackFile> packFilesToPrune = new ArrayList<>();
oldPackLoop: for (Pack oldPack : oldPacks) { oldPackLoop: for (Pack oldPack : oldPacks) {
checkCancelled(); checkCancelled();
String oldName = oldPack.getPackName(); String oldName = oldPack.getPackName();
@ -380,9 +381,10 @@ private void deleteOldPacks(Collection<Pack> oldPacks,
loosen(inserter, reader, oldPack, ids); loosen(inserter, reader, oldPack, ids);
} }
oldPack.close(); oldPack.close();
prunePack(oldPack.getPackFile()); packFilesToPrune.add(oldPack.getPackFile());
} }
} }
packFilesToPrune.forEach(this::prunePack);
// close the complete object database. That's my only chance to force // close the complete object database. That's my only chance to force
// rescanning and to detect that certain pack files are now deleted. // rescanning and to detect that certain pack files are now deleted.
@ -887,7 +889,7 @@ public Collection<Pack> repack() throws IOException {
Pack heads = null; Pack heads = null;
if (!allHeadsAndTags.isEmpty()) { if (!allHeadsAndTags.isEmpty()) {
heads = writePack(allHeadsAndTags, PackWriter.NONE, allTags, heads = writePack(allHeadsAndTags, PackWriter.NONE, allTags,
refsToExcludeFromBitmap, tagTargets, excluded); refsToExcludeFromBitmap, tagTargets, excluded, true);
if (heads != null) { if (heads != null) {
ret.add(heads); ret.add(heads);
excluded.add(0, heads.getIndex()); excluded.add(0, heads.getIndex());
@ -895,7 +897,7 @@ public Collection<Pack> repack() throws IOException {
} }
if (!nonHeads.isEmpty()) { if (!nonHeads.isEmpty()) {
Pack rest = writePack(nonHeads, allHeadsAndTags, PackWriter.NONE, Pack rest = writePack(nonHeads, allHeadsAndTags, PackWriter.NONE,
PackWriter.NONE, tagTargets, excluded); PackWriter.NONE, tagTargets, excluded, false);
if (rest != null) if (rest != null)
ret.add(rest); ret.add(rest);
} }
@ -1289,7 +1291,7 @@ private Set<ObjectId> listNonHEADIndexObjects()
private Pack writePack(@NonNull Set<? extends ObjectId> want, private Pack writePack(@NonNull Set<? extends ObjectId> want,
@NonNull Set<? extends ObjectId> have, @NonNull Set<ObjectId> tags, @NonNull Set<? extends ObjectId> have, @NonNull Set<ObjectId> tags,
@NonNull Set<ObjectId> excludedRefsTips, @NonNull Set<ObjectId> excludedRefsTips,
Set<ObjectId> tagTargets, List<ObjectIdSet> excludeObjects) Set<ObjectId> tagTargets, List<ObjectIdSet> excludeObjects, boolean createBitmap)
throws IOException { throws IOException {
checkCancelled(); checkCancelled();
File tmpPack = null; File tmpPack = null;
@ -1320,6 +1322,7 @@ private Pack writePack(@NonNull Set<? extends ObjectId> want,
if (excludeObjects != null) if (excludeObjects != null)
for (ObjectIdSet idx : excludeObjects) for (ObjectIdSet idx : excludeObjects)
pw.excludeObjects(idx); pw.excludeObjects(idx);
pw.setCreateBitmaps(createBitmap);
pw.preparePack(pm, want, have, PackWriter.NONE, pw.preparePack(pm, want, have, PackWriter.NONE,
union(tags, excludedRefsTips)); union(tags, excludedRefsTips));
if (pw.getObjectCount() == 0) if (pw.getObjectCount() == 0)

View File

@ -256,6 +256,8 @@ public static Iterable<PackWriter> getInstances() {
private boolean useBitmaps; private boolean useBitmaps;
private boolean createBitmaps = true;
private boolean ignoreMissingUninteresting = true; private boolean ignoreMissingUninteresting = true;
private boolean pruneCurrentObjectList; private boolean pruneCurrentObjectList;
@ -576,6 +578,26 @@ public void setUseBitmaps(boolean useBitmaps) {
this.useBitmaps = useBitmaps; this.useBitmaps = useBitmaps;
} }
/**
* Whether to generate bitmaps.
*
* @param createBitmaps
* if set to true, bitmaps will be generated when creating a pack.
*/
public void setCreateBitmaps(boolean createBitmaps) {
this.createBitmaps = createBitmaps;
}
/**
* Whether the bitmap file is to be created by this PackWriter.
*
* @return {@code true} if the bitmap file is to be created by this
* PackWriter.
*/
public boolean isCreateBitmaps() {
return createBitmaps;
}
/** /**
* Whether the index file cannot be created by this PackWriter. * Whether the index file cannot be created by this PackWriter.
* *
@ -1995,7 +2017,7 @@ private void findObjectsToPack(@NonNull ProgressMonitor countingMonitor,
canBuildBitmaps = config.isBuildBitmaps() canBuildBitmaps = config.isBuildBitmaps()
&& !shallowPack && !shallowPack
&& have.isEmpty() && have.isEmpty()
&& (excludeInPacks == null || excludeInPacks.length == 0); && createBitmaps;
if (!shallowPack && useBitmaps) { if (!shallowPack && useBitmaps) {
BitmapIndex bitmapIndex = reader.getBitmapIndex(); BitmapIndex bitmapIndex = reader.getBitmapIndex();
if (bitmapIndex != null) { if (bitmapIndex != null) {