Skip to content
Snippets Groups Projects
Commit 592a7580 authored by Jacek Centkowski's avatar Jacek Centkowski Committed by Luca Milanesio
Browse files

Don't fail when trying to prune pack which is already gone

Update the TestRepository.prunePacked so that it doesn't fail if a pack
to be pruned is already gone.
It is especially handy when the prunePacked function is called in
`TestRepository.packAndPrune` function after the repo moves on after
GC was performed.

Change-Id: I01b4ddbaddec1fdc24cfbb967e0edfe0de6c4b7c
parent f7a4dd03
No related branches found
No related tags found
No related merge requests found
...@@ -1020,7 +1020,8 @@ public void close() { ...@@ -1020,7 +1020,8 @@ public void close() {
private static void prunePacked(ObjectDirectory odb) throws IOException { private static void prunePacked(ObjectDirectory odb) throws IOException {
for (Pack p : odb.getPacks()) { for (Pack p : odb.getPacks()) {
for (MutableEntry e : p) for (MutableEntry e : p)
FileUtils.delete(odb.fileFor(e.toObjectId())); FileUtils.delete(odb.fileFor(e.toObjectId()),
FileUtils.SKIP_MISSING);
} }
} }
......
...@@ -12,25 +12,12 @@ ...@@ -12,25 +12,12 @@
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
import org.eclipse.jgit.internal.storage.pack.PackExt;
import org.eclipse.jgit.internal.storage.pack.PackWriter;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.util.FileUtils;
import org.junit.Test; import org.junit.Test;
public class GcNumberOfPackFilesSinceBitmapStatisticsTest extends GcTestCase { public class GcNumberOfPackFilesSinceBitmapStatisticsTest extends GcTestCase {
...@@ -43,7 +30,7 @@ public void testShouldReportZeroObjectsForInitializedRepo() ...@@ -43,7 +30,7 @@ public void testShouldReportZeroObjectsForInitializedRepo()
@Test @Test
public void testShouldReportAllPackFilesWhenNoGcWasPerformed() public void testShouldReportAllPackFilesWhenNoGcWasPerformed()
throws Exception { throws Exception {
packAndPrune(); tr.packAndPrune();
long result = gc.getStatistics().numberOfPackFilesSinceBitmap; long result = gc.getStatistics().numberOfPackFilesSinceBitmap;
assertEquals(repo.getObjectDatabase().getPacks().size(), result); assertEquals(repo.getObjectDatabase().getPacks().size(), result);
...@@ -68,7 +55,7 @@ public void testShouldReportNewObjectsSinceGcWhenRepositoryProgresses() ...@@ -68,7 +55,7 @@ public void testShouldReportNewObjectsSinceGcWhenRepositoryProgresses()
// progress & pack // progress & pack
addCommit(parent); addCommit(parent);
packAndPrune(); tr.packAndPrune();
assertEquals(1L, gc.getStatistics().numberOfPackFilesSinceBitmap); assertEquals(1L, gc.getStatistics().numberOfPackFilesSinceBitmap);
} }
...@@ -88,18 +75,11 @@ public void testShouldReportNewObjectsFromTheLatestBitmapWhenRepositoryProgresse ...@@ -88,18 +75,11 @@ public void testShouldReportNewObjectsFromTheLatestBitmapWhenRepositoryProgresse
// progress & pack // progress & pack
addCommit(parent); addCommit(parent);
packAndPrune(); tr.packAndPrune();
assertEquals(1L, gc.getStatistics().numberOfPackFilesSinceBitmap); assertEquals(1L, gc.getStatistics().numberOfPackFilesSinceBitmap);
} }
private void packAndPrune() throws Exception {
try (SkipNonExistingFilesTestRepository testRepo = new SkipNonExistingFilesTestRepository(
repo)) {
testRepo.packAndPrune();
}
}
private RevCommit addCommit(RevCommit parent) throws Exception { private RevCommit addCommit(RevCommit parent) throws Exception {
return tr.branch("master").commit() return tr.branch("master").commit()
.author(new PersonIdent("repo-metrics", "repo@metrics.com")) .author(new PersonIdent("repo-metrics", "repo@metrics.com"))
...@@ -114,60 +94,4 @@ private long repositoryBitmapFiles() throws IOException { ...@@ -114,60 +94,4 @@ private long repositoryBitmapFiles() throws IOException {
.spliterator(), false) .spliterator(), false)
.count(); .count();
} }
/**
* The TestRepository has a {@link TestRepository#packAndPrune()} function
* but it fails in the last step after GC was performed as it doesn't
* SKIP_MISSING files. In order to circumvent it was copied and improved
* here.
*/
private static class SkipNonExistingFilesTestRepository
extends TestRepository<FileRepository> {
private final FileRepository repo;
private SkipNonExistingFilesTestRepository(FileRepository db) throws IOException {
super(db);
repo = db;
}
@Override
public void packAndPrune() throws Exception {
ObjectDirectory odb = repo.getObjectDatabase();
NullProgressMonitor m = NullProgressMonitor.INSTANCE;
final PackFile pack, idx;
try (PackWriter pw = new PackWriter(repo)) {
Set<ObjectId> all = new HashSet<>();
for (Ref r : repo.getRefDatabase().getRefs())
all.add(r.getObjectId());
pw.preparePack(m, all, PackWriter.NONE);
pack = new PackFile(odb.getPackDirectory(), pw.computeName(),
PackExt.PACK);
try (OutputStream out = new BufferedOutputStream(
new FileOutputStream(pack))) {
pw.writePack(m, m, out);
}
pack.setReadOnly();
idx = pack.create(PackExt.INDEX);
try (OutputStream out = new BufferedOutputStream(
new FileOutputStream(idx))) {
pw.writeIndex(out);
}
idx.setReadOnly();
}
odb.openPack(pack);
updateServerInfo();
// alternative packAndPrune implementation that skips missing files
// after GC.
for (Pack p : odb.getPacks()) {
for (MutableEntry e : p)
FileUtils.delete(odb.fileFor(e.toObjectId()),
FileUtils.SKIP_MISSING);
}
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment