aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/storage
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2020-02-01 01:57:03 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2020-02-01 02:06:47 +0100
commit3d59d1b80cd90bf22a43e522d372d72f0c2ee8a6 (patch)
tree4b43af597cf67cf0f785403075f6600782c88f5d /org.eclipse.jgit/src/org/eclipse/jgit/storage
parentd7304eddaf393375cea93433db182841fd5e08ef (diff)
parent68b0645a2ed7d6002abe523dd5af51063e0a5c47 (diff)
downloadjgit-3d59d1b80cd90bf22a43e522d372d72f0c2ee8a6.tar.gz
jgit-3d59d1b80cd90bf22a43e522d372d72f0c2ee8a6.zip
Merge branch 'stable-5.5' into stable-5.6
* stable-5.5: Fix string format parameter for invalidRefAdvertisementLine WindowCache: add metric for cached bytes per repository pgm daemon: fallback to user and system config if no config specified WindowCache: add option to use strong refs to reference ByteWindows Replace usage of ArrayIndexOutOfBoundsException in treewalk Add config constants for WindowCache configuration options Change-Id: I73d16b53df02bf735c2431588143efe225a4b5b4
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/storage')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java64
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheStats.java9
2 files changed, 61 insertions, 12 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
index ff499764c9..be19df82b2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
@@ -43,6 +43,15 @@
package org.eclipse.jgit.storage.file;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_CORE_SECTION;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_DELTA_BASE_CACHE_LIMIT;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACKED_GIT_LIMIT;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACKED_GIT_MMAP;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACKED_GIT_OPENFILES;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACKED_GIT_WINDOWSIZE;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_STREAM_FILE_TRESHOLD;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACKED_GIT_USE_STRONGREFS;
+
import org.eclipse.jgit.internal.storage.file.WindowCache;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.pack.PackConfig;
@@ -61,6 +70,8 @@ public class WindowCacheConfig {
private long packedGitLimit;
+ private boolean useStrongRefs;
+
private int packedGitWindowSize;
private boolean packedGitMMAP;
@@ -75,6 +86,7 @@ public class WindowCacheConfig {
public WindowCacheConfig() {
packedGitOpenFiles = 128;
packedGitLimit = 10 * MB;
+ useStrongRefs = false;
packedGitWindowSize = 8 * KB;
packedGitMMAP = false;
deltaBaseCacheLimit = 10 * MB;
@@ -126,6 +138,31 @@ public class WindowCacheConfig {
}
/**
+ * Get whether the window cache should use strong references or
+ * SoftReferences
+ *
+ * @return {@code true} if the window cache should use strong references,
+ * otherwise it will use {@link java.lang.ref.SoftReference}s
+ * @since 5.1.13
+ */
+ public boolean isPackedGitUseStrongRefs() {
+ return useStrongRefs;
+ }
+
+ /**
+ * Set if the cache should use strong refs or soft refs
+ *
+ * @param useStrongRefs
+ * if @{code true} the cache strongly references cache pages
+ * otherwise it uses {@link java.lang.ref.SoftReference}s which
+ * can be evicted by the Java gc if heap is almost full
+ * @since 5.1.13
+ */
+ public void setPackedGitUseStrongRefs(boolean useStrongRefs) {
+ this.useStrongRefs = useStrongRefs;
+ }
+
+ /**
* Get size in bytes of a single window mapped or read in from the pack
* file.
*
@@ -227,20 +264,23 @@ public class WindowCacheConfig {
* @since 3.0
*/
public WindowCacheConfig fromConfig(Config rc) {
- setPackedGitOpenFiles(rc.getInt(
- "core", null, "packedgitopenfiles", getPackedGitOpenFiles())); //$NON-NLS-1$ //$NON-NLS-2$
- setPackedGitLimit(rc.getLong(
- "core", null, "packedgitlimit", getPackedGitLimit())); //$NON-NLS-1$ //$NON-NLS-2$
- setPackedGitWindowSize(rc.getInt(
- "core", null, "packedgitwindowsize", getPackedGitWindowSize())); //$NON-NLS-1$ //$NON-NLS-2$
- setPackedGitMMAP(rc.getBoolean(
- "core", null, "packedgitmmap", isPackedGitMMAP())); //$NON-NLS-1$ //$NON-NLS-2$
- setDeltaBaseCacheLimit(rc.getInt(
- "core", null, "deltabasecachelimit", getDeltaBaseCacheLimit())); //$NON-NLS-1$ //$NON-NLS-2$
+ setPackedGitUseStrongRefs(rc.getBoolean(CONFIG_CORE_SECTION,
+ CONFIG_KEY_PACKED_GIT_USE_STRONGREFS,
+ isPackedGitUseStrongRefs()));
+ setPackedGitOpenFiles(rc.getInt(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_PACKED_GIT_OPENFILES, getPackedGitOpenFiles()));
+ setPackedGitLimit(rc.getLong(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_PACKED_GIT_LIMIT, getPackedGitLimit()));
+ setPackedGitWindowSize(rc.getInt(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_PACKED_GIT_WINDOWSIZE, getPackedGitWindowSize()));
+ setPackedGitMMAP(rc.getBoolean(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_PACKED_GIT_MMAP, isPackedGitMMAP()));
+ setDeltaBaseCacheLimit(rc.getInt(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_DELTA_BASE_CACHE_LIMIT, getDeltaBaseCacheLimit()));
long maxMem = Runtime.getRuntime().maxMemory();
- long sft = rc.getLong(
- "core", null, "streamfilethreshold", getStreamFileThreshold()); //$NON-NLS-1$ //$NON-NLS-2$
+ long sft = rc.getLong(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_STREAM_FILE_TRESHOLD, getStreamFileThreshold());
sft = Math.min(sft, maxMem / 4); // don't use more than 1/4 of the heap
sft = Math.min(sft, Integer.MAX_VALUE); // cannot exceed array length
setStreamFileThreshold((int) sft);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheStats.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheStats.java
index b7f6394df6..65f8dae342 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheStats.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheStats.java
@@ -42,6 +42,8 @@
*/
package org.eclipse.jgit.storage.file;
+import java.util.Map;
+
import javax.management.MXBean;
import org.eclipse.jgit.internal.storage.file.WindowCache;
@@ -226,6 +228,13 @@ public interface WindowCacheStats {
long getOpenByteCount();
/**
+ * Number of bytes cached per repository
+ *
+ * @return number of bytes cached per repository
+ */
+ Map<String, Long> getOpenByteCountPerRepository();
+
+ /**
* Reset counters. Does not reset open bytes and open files counters.
*/
void resetCounters();