Skip to content
Snippets Groups Projects
Commit f6fd48be authored by Luca Milanesio's avatar Luca Milanesio Committed by Gerrit Code Review
Browse files

Merge "Don't fail when trying to prune pack which is already gone" into stable-6.10

parents 298c7cb1 592a7580
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