summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test/tst
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2019-12-13 01:18:12 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2020-01-20 17:53:08 +0100
commit709f83d489b777c21ad5bbeeb3e8b1232b3f0ee5 (patch)
tree4de96eb44fd6928748be43f5e2fe47d51efd6692 /org.eclipse.jgit.test/tst
parent6185db3d776f1064af1972b4ba2175a917c35ab3 (diff)
downloadjgit-709f83d489b777c21ad5bbeeb3e8b1232b3f0ee5.tar.gz
jgit-709f83d489b777c21ad5bbeeb3e8b1232b3f0ee5.zip
WindowCache: add option to use strong refs to reference ByteWindows
Java GC evicts all SoftReferences when the used heap size comes close to the maximum heap size. This means peaks in heap memory consumption can flush the complete WindowCache which was observed to have negative impact on performance of upload-pack in Gerrit. Hence add a boolean option core.packedGitUseStrongRefs to allow using strong references to reference packfile pages cached in the WindowCache. If this option is set to true Java gc can no longer flush the WindowCache to free memory if the used heap comes close to the maximum heap size. On the other hand this provides more predictable performance. Bug: 553573 Change-Id: I9de406293087ab0fa61130c8e0829775762ece8d Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit.test/tst')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/WindowCacheGetTest.java68
1 files changed, 45 insertions, 23 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/WindowCacheGetTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/WindowCacheGetTest.java
index f1a18b096c..a173532db1 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/WindowCacheGetTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/WindowCacheGetTest.java
@@ -53,6 +53,8 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import org.eclipse.jgit.errors.CorruptObjectException;
@@ -66,9 +68,25 @@ import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
import org.eclipse.jgit.util.MutableInteger;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+@RunWith(Parameterized.class)
public class WindowCacheGetTest extends SampleDataRepositoryTestCase {
private List<TestObject> toLoad;
+ private WindowCacheConfig cfg;
+ private boolean useStrongRefs;
+
+ @Parameters(name = "useStrongRefs={0}")
+ public static Collection<Object[]> data() {
+ return Arrays
+ .asList(new Object[][] { { Boolean.TRUE }, { Boolean.FALSE } });
+ }
+
+ public WindowCacheGetTest(Boolean useStrongRef) {
+ this.useStrongRefs = useStrongRef.booleanValue();
+ }
@Override
@Before
@@ -93,11 +111,12 @@ public class WindowCacheGetTest extends SampleDataRepositoryTestCase {
}
}
assertEquals(96, toLoad.size());
+ cfg = new WindowCacheConfig();
+ cfg.setPackedGitUseStrongRefs(useStrongRefs);
}
@Test
public void testCache_Defaults() throws IOException {
- WindowCacheConfig cfg = new WindowCacheConfig();
cfg.install();
doCacheTests();
checkLimits(cfg);
@@ -122,7 +141,6 @@ public class WindowCacheGetTest extends SampleDataRepositoryTestCase {
@Test
public void testCache_TooFewFiles() throws IOException {
- final WindowCacheConfig cfg = new WindowCacheConfig();
cfg.setPackedGitOpenFiles(2);
cfg.install();
doCacheTests();
@@ -131,7 +149,6 @@ public class WindowCacheGetTest extends SampleDataRepositoryTestCase {
@Test
public void testCache_TooSmallLimit() throws IOException {
- final WindowCacheConfig cfg = new WindowCacheConfig();
cfg.setPackedGitWindowSize(4096);
cfg.setPackedGitLimit(4096);
cfg.install();
@@ -142,26 +159,31 @@ public class WindowCacheGetTest extends SampleDataRepositoryTestCase {
private static void checkLimits(WindowCacheConfig cfg) {
final WindowCache cache = WindowCache.getInstance();
WindowCacheStats s = cache.getStats();
- assertTrue(0 < s.getAverageLoadTime());
- assertTrue(0 < s.getOpenByteCount());
- assertTrue(0 < s.getOpenByteCount());
- assertTrue(0.0 < s.getAverageLoadTime());
- assertTrue(0 <= s.getEvictionCount());
- assertTrue(0 < s.getHitCount());
- assertTrue(0 < s.getHitRatio());
- assertTrue(1 > s.getHitRatio());
- assertTrue(0 < s.getLoadCount());
- assertTrue(0 <= s.getLoadFailureCount());
- assertTrue(0.0 <= s.getLoadFailureRatio());
- assertTrue(1 > s.getLoadFailureRatio());
- assertTrue(0 < s.getLoadSuccessCount());
- assertTrue(s.getOpenByteCount() <= cfg.getPackedGitLimit());
- assertTrue(s.getOpenFileCount() <= cfg.getPackedGitOpenFiles());
- assertTrue(0 <= s.getMissCount());
- assertTrue(0 <= s.getMissRatio());
- assertTrue(1 > s.getMissRatio());
- assertTrue(0 < s.getRequestCount());
- assertTrue(0 < s.getTotalLoadTime());
+ assertTrue("average load time should be > 0",
+ 0 < s.getAverageLoadTime());
+ assertTrue("open byte count should be > 0", 0 < s.getOpenByteCount());
+ assertTrue("eviction count should be >= 0", 0 <= s.getEvictionCount());
+ assertTrue("hit count should be > 0", 0 < s.getHitCount());
+ assertTrue("hit ratio should be > 0", 0 < s.getHitRatio());
+ assertTrue("hit ratio should be < 1", 1 > s.getHitRatio());
+ assertTrue("load count should be > 0", 0 < s.getLoadCount());
+ assertTrue("load failure count should be >= 0",
+ 0 <= s.getLoadFailureCount());
+ assertTrue("load failure ratio should be >= 0",
+ 0.0 <= s.getLoadFailureRatio());
+ assertTrue("load failure ratio should be < 1",
+ 1 > s.getLoadFailureRatio());
+ assertTrue("load success count should be > 0",
+ 0 < s.getLoadSuccessCount());
+ assertTrue("open byte count should be <= core.packedGitLimit",
+ s.getOpenByteCount() <= cfg.getPackedGitLimit());
+ assertTrue("open file count should be <= core.packedGitOpenFiles",
+ s.getOpenFileCount() <= cfg.getPackedGitOpenFiles());
+ assertTrue("miss success count should be >= 0", 0 <= s.getMissCount());
+ assertTrue("miss ratio should be > 0", 0 <= s.getMissRatio());
+ assertTrue("miss ratio should be < 1", 1 > s.getMissRatio());
+ assertTrue("request count should be > 0", 0 < s.getRequestCount());
+ assertTrue("total load time should be > 0", 0 < s.getTotalLoadTime());
}
private void doCacheTests() throws IOException {