diff options
author | David Turner <dturner@twosigma.com> | 2017-02-16 13:43:49 -0500 |
---|---|---|
committer | David Turner <dturner@twosigma.com> | 2017-02-17 11:26:09 -0500 |
commit | d3962fef6b9736c416c14dbb12b54c0a4a269763 (patch) | |
tree | b637818d799da911d3dde019c930d2e74ccde51c /org.eclipse.jgit.test | |
parent | e43db8ebf645e683a362f1253680f69e6ddf55eb (diff) | |
download | jgit-d3962fef6b9736c416c14dbb12b54c0a4a269763.tar.gz jgit-d3962fef6b9736c416c14dbb12b54c0a4a269763.zip |
GC: don't loosen doomed objects
If the pruneexpire config is set to "now", then any unreferenced loose
objects are immediately eligible for gc. So there is no need to
actually write the loose objects.
Users who run hosting services which sometimes accept large, entirely
garbage packs might set the following configurations:
gc.pruneExpire = now
gc.prunePackExpire = 2.weeks
Then garbage objects will be kept around in packs, but after two weeks
the packs themselves will get deleted.
For client-side users of jgit, the default settings will loosen
garbage objects, and, after an hour, delete the old packs in which
they resided.
Change-Id: I8f686ac60b40181b1ee92ac6c313c3f33b55c44c
Signed-off-by: David Turner <dturner@twosigma.com>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java index c7e5973f3f..a2e1305129 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java @@ -55,8 +55,10 @@ import java.util.Date; import java.util.List; import org.eclipse.jgit.junit.TestRepository.BranchBuilder; +import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.storage.pack.PackConfig; import org.junit.Test; import org.junit.experimental.theories.DataPoints; @@ -247,7 +249,44 @@ public class GcBasicPackingTest extends GcTestCase { // times assertEquals(6, stats.numberOfPackedObjects); assertEquals(1, stats.numberOfPackFiles); + } + + @Test + public void testImmediatePruning() throws Exception { + BranchBuilder bb = tr.branch("refs/heads/master"); + bb.commit().message("M").add("M", "M").create(); + + String tempRef = "refs/heads/soon-to-be-unreferenced"; + BranchBuilder bb2 = tr.branch(tempRef); + bb2.commit().message("M").add("M", "M").create(); + + gc.setExpireAgeMillis(0); + gc.gc(); + stats = gc.getStatistics(); + + fsTick(); + // delete the temp ref, orphaning its commit + RefUpdate update = tr.getRepository().getRefDatabase().newUpdate(tempRef, false); + update.setForceUpdate(true); + update.delete(); + + bb.commit().message("B").add("B", "Q").create(); + + // We want to immediately prune deleted objects + FileBasedConfig config = repo.getConfig(); + config.setString(ConfigConstants.CONFIG_GC_SECTION, null, + ConfigConstants.CONFIG_KEY_PRUNEEXPIRE, "now"); + config.save(); + + //And we don't want to keep packs full of dead objects + gc.setPackExpireAgeMillis(0); + + gc.gc(); + stats = gc.getStatistics(); + assertEquals(0, stats.numberOfLooseObjects); + assertEquals(6, stats.numberOfPackedObjects); + assertEquals(1, stats.numberOfPackFiles); } @Test |