Add load durations to HitHashMap uses
The PredicateCache and changesByNamesFactoryQuery now make explicit use
of getOrStartLoad for accurate load duration accounting. The other users
do this implicitly with computeIfAbsent.
Change-Id: Ib505994e1594a3f67e9054e83c42d92057127df9
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 a7f0f72..453c118 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMap.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/HitHashMap.java
@@ -26,7 +26,10 @@
public static class Statistics {
public long hits;
public int size;
+ public long sumNanosecondsLoading;
public List<Object> elements;
+
+ protected transient StopWatch loadingStopWatch;
}
public static final long serialVersionUID = 1;
@@ -50,6 +53,14 @@
return v;
}
+ public V getOrStartLoad(K key) {
+ V v = get(key);
+ if (v == null) {
+ startLoad();
+ }
+ return v;
+ }
+
@Override
public V getOrDefault(Object key, V dv) {
V v = get(key);
@@ -61,11 +72,13 @@
@Override
public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
- V v = get(key);
+ V v = getOrStartLoad(key);
if (v == null) {
v = mappingFunction.apply(key);
if (v != null) {
put(key, v);
+ } else {
+ stopLoad(key);
}
}
return v;
@@ -73,6 +86,7 @@
@Override
public V put(K key, V value) {
+ stopLoad(key);
if (statistics != null && value instanceof TracksStatistics) {
((TracksStatistics) value).ensureStatistics();
}
@@ -124,9 +138,23 @@
throw new UnsupportedOperationException(); // Todo if needed
}
+ public void startLoad() {
+ if (statistics != null && statistics.loadingStopWatch != null) {
+ statistics.loadingStopWatch.start();
+ }
+ }
+
+ public void stopLoad(K key) {
+ if (statistics != null && statistics.loadingStopWatch != null) {
+ statistics.loadingStopWatch.stop();
+ }
+ }
+
@Override
public void initStatistics() {
statistics = new Statistics();
+ statistics.loadingStopWatch =
+ new StopWatch().enable().setConsumer(ns -> statistics.sumNanosecondsLoading += ns);
}
@Override
@@ -147,6 +175,7 @@
if (!elementStatistics.isEmpty()) {
statistics.elements = elementStatistics;
}
+ statistics.loadingStopWatch = null;
return statistics;
}
}
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 8655e6b..4c3748d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
@@ -45,8 +45,7 @@
protected final ChangeQueryBuilder cqb;
protected final Set<String> cacheableByBranchPredicateClassNames;
protected final CurrentUser user;
- protected final StatisticsMap<
- String, ThrowingProvider<Predicate<ChangeData>, QueryParseException>>
+ protected final HitHashMap<String, ThrowingProvider<Predicate<ChangeData>, QueryParseException>>
predicatesByQuery = new HitHashMap<>();
protected Statistics statistics;
@@ -90,7 +89,7 @@
protected Predicate<ChangeData> getPredicate(String query) throws QueryParseException {
ThrowingProvider<Predicate<ChangeData>, QueryParseException> predProvider =
- predicatesByQuery.get(query);
+ predicatesByQuery.getOrStartLoad(query);
if (predProvider != null) {
return predProvider.get();
}
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 17b1a1b..172208a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskTree.java
@@ -86,7 +86,7 @@
protected final NodeList root = new NodeList();
protected final Provider<ChangeQueryBuilder> changeQueryBuilderProvider;
protected final Provider<ChangeQueryProcessor> changeQueryProcessorProvider;
- protected final StatisticsMap<String, List<ChangeData>> changesByNamesFactoryQuery =
+ protected final HitHashMap<String, List<ChangeData>> changesByNamesFactoryQuery =
new HitHashMap<>();
protected final StatisticsMap<SubSectionKey, List<Task>> definitionsBySubSection =
new HitHashMapOfCollection<>();
@@ -593,7 +593,7 @@
}
public List<ChangeData> query(String query) throws StorageException, QueryParseException {
- List<ChangeData> changeDataList = changesByNamesFactoryQuery.get(query);
+ List<ChangeData> changeDataList = changesByNamesFactoryQuery.getOrStartLoad(query);
if (changeDataList == null) {
changeDataList =
changeQueryProcessorProvider