summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test/tst/org/eclipse/jgit
diff options
context:
space:
mode:
authorJames Melvin <jmelvin@codeaurora.org>2017-01-03 11:41:56 -0700
committerChristian Halstrick <christian.halstrick@sap.com>2017-01-19 11:00:18 +0100
commit91132bb05e767694d35230d515443d54ddc4eff6 (patch)
treedfeffd43c1a25f91a05b376a8ca7b1ebf2acb528 /org.eclipse.jgit.test/tst/org/eclipse/jgit
parentd3148f300a06dec78875283bb8fdf1d350c4243d (diff)
downloadjgit-91132bb05e767694d35230d515443d54ddc4eff6.tar.gz
jgit-91132bb05e767694d35230d515443d54ddc4eff6.zip
gc: Add options to preserve and prune old pack files
The new --preserve-oldpacks option moves old pack files into the preserved subdirectory instead of deleting them after repacking. The new --prune-preserved option prunes old pack files from the preserved subdirectory after repacking, but before potentially moving the latest old packfiles to this subdirectory. These options are designed to prevent stale file handle exceptions during git operations which can happen on users of NFS repos when repacking is done on them. The strategy is to preserve old pack files around until the next repack with the hopes that they will become unreferenced by then and not cause any exceptions to running processes when they are finally deleted (pruned). Change-Id: If3f729f0d9ce920ee2c3e6acdde46f2068be61d2 Signed-off-by: James Melvin <jmelvin@codeaurora.org>
Diffstat (limited to 'org.eclipse.jgit.test/tst/org/eclipse/jgit')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcBasicPackingTest.java43
1 files changed, 42 insertions, 1 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 762feed3c2..8a9ad89600 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
@@ -44,6 +44,8 @@
package org.eclipse.jgit.internal.storage.file;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
@@ -233,7 +235,45 @@ public class GcBasicPackingTest extends GcTestCase {
}
- private void configureGc(GC myGc, boolean aggressive) {
+ @Test
+ public void testPreserveAndPruneOldPacks() throws Exception {
+ testPreserveOldPacks();
+ configureGc(gc, false).setPrunePreserved(true);
+ gc.gc();
+
+ assertFalse(repo.getObjectDatabase().getPreservedDirectory().exists());
+ }
+
+ private void testPreserveOldPacks() throws Exception {
+ BranchBuilder bb = tr.branch("refs/heads/master");
+ bb.commit().message("P").add("P", "P").create();
+
+ // pack loose object into packfile
+ gc.setExpireAgeMillis(0);
+ gc.gc();
+ File oldPackfile = tr.getRepository().getObjectDatabase().getPacks()
+ .iterator().next().getPackFile();
+ assertTrue(oldPackfile.exists());
+
+ fsTick();
+ bb.commit().message("B").add("B", "Q").create();
+
+ // repack again but now without a grace period for packfiles. We should
+ // end up with a new packfile and the old one should be placed in the
+ // preserved directory
+ gc.setPackExpireAgeMillis(0);
+ configureGc(gc, false).setPreserveOldPacks(true);
+ gc.gc();
+
+ File oldPackDir = repo.getObjectDatabase().getPreservedDirectory();
+ String oldPackFileName = oldPackfile.getName();
+ String oldPackName = oldPackFileName.substring(0,
+ oldPackFileName.lastIndexOf('.')) + ".old-pack"; //$NON-NLS-1$
+ File preservePackFile = new File(oldPackDir, oldPackName);
+ assertTrue(preservePackFile.exists());
+ }
+
+ private PackConfig configureGc(GC myGc, boolean aggressive) {
PackConfig pconfig = new PackConfig(repo);
if (aggressive) {
pconfig.setDeltaSearchWindowSize(250);
@@ -242,5 +282,6 @@ public class GcBasicPackingTest extends GcTestCase {
} else
pconfig = new PackConfig(repo);
myGc.setPackConfig(pconfig);
+ return pconfig;
}
}