Add a --summary-count switch to configure statistics
The summary size tracked by the TopKeyMap is now configurable from the
command line.
Change-Id: Ic1b352428b60c8dc8b37fd20846fa37efdf9d649
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java b/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java
index 91d7ad4..8d9b9ec 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java
@@ -28,7 +28,7 @@
public int numberOfRows;
public int numberOfColumns;
public Long sumNanosecondsLoading;
- public TopKeyMap<V> topNanosecondsLoadingKeys = new TopKeyMap<>();
+ public TopKeyMap<V> topNanosecondsLoadingKeys;
}
protected Statistics<TopKeyMap.TableKeyValue<R, C>> statistics;
@@ -67,14 +67,15 @@
}
@Override
- public void initStatistics() {
+ public void initStatistics(int summaryCount) {
statistics = new Statistics<>();
+ statistics.topNanosecondsLoadingKeys = new TopKeyMap<>(summaryCount);
}
@Override
- public void ensureStatistics() {
+ public void ensureStatistics(int summaryCount) {
if (statistics == null) {
- initStatistics();
+ initStatistics(summaryCount);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMap.java b/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMap.java
index 433b091..6ea5a13 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMap.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMap.java
@@ -27,7 +27,7 @@
public long hits;
public int size;
public Long sumNanosecondsLoading;
- public TopKeyMap<K> topNanosecondsLoadingKeys = new TopKeyMap<>();
+ public TopKeyMap<K> topNanosecondsLoadingKeys;
public List<Object> elements;
}
@@ -37,12 +37,6 @@
public HitHashMap() {}
- public HitHashMap(boolean initStatistics) {
- if (initStatistics) {
- initStatistics();
- }
- }
-
@Override
public V get(Object key) {
V v = super.get(key);
@@ -93,7 +87,7 @@
@Override
public V put(K key, V value) {
if (statistics != null && value instanceof TracksStatistics) {
- ((TracksStatistics) value).ensureStatistics();
+ ((TracksStatistics) value).ensureStatistics(statistics.topNanosecondsLoadingKeys.size());
}
return super.put(key, value);
}
@@ -144,14 +138,15 @@
}
@Override
- public void initStatistics() {
+ public void initStatistics(int summaryCount) {
statistics = new Statistics<>();
+ statistics.topNanosecondsLoadingKeys = new TopKeyMap<>(summaryCount);
}
@Override
- public void ensureStatistics() {
+ public void ensureStatistics(int summaryCount) {
if (statistics == null) {
- initStatistics();
+ initStatistics(summaryCount);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMapOfCollection.java b/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMapOfCollection.java
index 82d04fc..67b2dde 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMapOfCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMapOfCollection.java
@@ -33,15 +33,9 @@
public HitHashMapOfCollection() {}
- public HitHashMapOfCollection(boolean initStatistics) {
- if (initStatistics) {
- initStatistics();
- }
- }
-
@Override
- public void initStatistics() {
- super.initStatistics();
+ public void initStatistics(int summaryCount) {
+ super.initStatistics(summaryCount);
statistics = new Statistics<>();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
index df0b921..08fa5ce 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
@@ -55,8 +55,8 @@
return isMatched;
}
- public void initStatistics() {
- resultByChangeByQuery.initStatistics();
+ public void initStatistics(int summaryCount) {
+ resultByChangeByQuery.initStatistics(summaryCount);
}
public Object getStatistics() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java b/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java
index 6f8d5cd..4ef065e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java
@@ -64,6 +64,9 @@
@Option(name = "--include-statistics", usage = "Include statistcs about the task evaluations")
public boolean includeStatistics = false;
+ @Option(name = "--summary-count", usage = "number of items to output in statistics summaries")
+ public int summaryCount = 5;
+
@Option(
name = "--preview",
metaVar = "{CHANGE,PATCHSET}",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
index 279729e..4aa6f57 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
@@ -63,9 +63,9 @@
config.getStringList(pluginName, "cacheable-predicates", "byBranch-className")));
}
- public void initStatistics() {
+ public void initStatistics(int summaryCount) {
statistics = new Statistics();
- predicatesByQuery.initStatistics();
+ predicatesByQuery.initStatistics(summaryCount);
}
public Object getStatistics() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java b/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
index 6721c86..e3a5700 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
@@ -222,9 +222,9 @@
return extended;
}
- public void initStatistics() {
+ public void initStatistics(int summaryCount) {
statistics = new Statistics();
- optionalTaskByExpression.initStatistics();
+ optionalTaskByExpression.initStatistics(summaryCount);
}
public Statistics getStatistics() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
index 414ca25..02840de 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
@@ -347,10 +347,10 @@
public void initStatistics() {
if (options.includeStatistics) {
statistics = new Statistics();
- definitions.predicateCache.initStatistics();
- definitions.matchCache.initStatistics();
- definitions.preloader.initStatistics();
- definitions.initStatistics();
+ definitions.predicateCache.initStatistics(options.summaryCount);
+ definitions.matchCache.initStatistics(options.summaryCount);
+ definitions.preloader.initStatistics(options.summaryCount);
+ definitions.initStatistics(options.summaryCount);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
index 70cd039..ef860bb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
@@ -73,6 +73,7 @@
public Object definitionsByBranchBySubSectionCache;
public Object changesByNamesFactoryQueryCache;
public Properties.Statistics properties;
+ public transient int summaryCount;
}
protected static final String TASK_DIR = "task";
@@ -504,12 +505,12 @@
if (filterable.isPresent()) {
if (!isChange()) {
if (nodesByBranch == null) {
- nodesByBranch = new HitHashMapOfCollection<>(statistics != null);
+ nodesByBranch = initStatistics(new HitHashMapOfCollection<>());
}
nodesByBranch.put(branch, filterable.get());
} else {
if (definitionsByBranch == null) {
- definitionsByBranch = new HitHashMap<>(statistics != null);
+ definitionsByBranch = initStatistics(new HitHashMap<>());
definitionsByBranchBySubSection.put(subSection, definitionsByBranch);
}
definitionsByBranch.put(
@@ -611,11 +612,19 @@
return changeDataList;
}
- public void initStatistics() {
+ public void initStatistics(int summaryCount) {
statistics = new Statistics();
- definitionsBySubSection.initStatistics();
- definitionsByBranchBySubSection.initStatistics();
- changesByNamesFactoryQuery.initStatistics();
+ statistics.summaryCount = summaryCount;
+ definitionsBySubSection.initStatistics(summaryCount);
+ definitionsByBranchBySubSection.initStatistics(summaryCount);
+ changesByNamesFactoryQuery.initStatistics(summaryCount);
+ }
+
+ protected <T extends TracksStatistics> T initStatistics(T tracker) {
+ if (statistics != null) {
+ tracker.initStatistics(statistics.summaryCount);
+ }
+ return tracker;
}
public Statistics getStatistics() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TopKeyMap.java b/src/main/java/com/googlesource/gerrit/plugins/task/TopKeyMap.java
index 5753b52..d4b7987 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TopKeyMap.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TopKeyMap.java
@@ -15,8 +15,8 @@
package com.googlesource.gerrit.plugins.task;
/**
- * A TopKeyMap is a lightweight limited size (5) map with 'long' keys designed to store only the
- * elements with the top five largest keys.
+ * A TopKeyMap is a lightweight limited size (default 5) map with 'long' keys designed to store only
+ * the elements with the top five largest keys.
*
* <p>A TopKeyMap is array based and has O(n) insertion time. Despite not having O(1) insertion
* times, it should likely be much faster than a hash based map for small n sizes. It also is more
@@ -55,10 +55,15 @@
}
}
- @SuppressWarnings("unchecked")
- protected Entry[] entries = (Entry[]) new Object[5];
+ protected Entry[] entries;
public TopKeyMap() {
+ this(5);
+ }
+
+ @SuppressWarnings("unchecked")
+ public TopKeyMap(int length) {
+ entries = (Entry[]) new Object[length];
for (int i = 0; i < entries.length; i++) {
entries[i] = new Entry();
}
@@ -82,4 +87,8 @@
}
}
}
+
+ public int size() {
+ return entries.length;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TracksStatistics.java b/src/main/java/com/googlesource/gerrit/plugins/task/TracksStatistics.java
index d7d0651..12d8722 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TracksStatistics.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TracksStatistics.java
@@ -15,9 +15,9 @@
package com.googlesource.gerrit.plugins.task;
public interface TracksStatistics {
- void initStatistics();
+ void initStatistics(int summaryCount);
- void ensureStatistics();
+ void ensureStatistics(int summaryCount);
Object getStatistics();
}