Merge changes Id5e823a5,Ieb0f1fcc
* changes:
Debounce rerendering after inputs change
Fix canceling diff processor/syntax layer
diff --git a/Documentation/metrics.txt b/Documentation/metrics.txt
index 6864c68..064859d 100644
--- a/Documentation/metrics.txt
+++ b/Documentation/metrics.txt
@@ -23,10 +23,12 @@
=== Pushes
* `receivecommits/changes`: histogram of number of changes processed
-in a single upload, split up by update type (new change created,
-existing changed updated, change autoclosed).
+in a single upload, split up by update type (change created/updated,
+change autoclosed).
* `receivecommits/latency`: latency per change for processing a push,
split up by update type (create+replace, and autoclose)
+* `receivecommits/push_latency`: total latency for processing a push,
+split up by update type (create+replace, autoclose, normal)
* `receivecommits/timeout`: number of timeouts during push processing.
=== Process
diff --git a/java/com/google/gerrit/common/FileUtil.java b/java/com/google/gerrit/common/FileUtil.java
index 24e3808..04288bc 100644
--- a/java/com/google/gerrit/common/FileUtil.java
+++ b/java/com/google/gerrit/common/FileUtil.java
@@ -14,7 +14,6 @@
package com.google.gerrit.common;
-import com.google.common.annotations.GwtIncompatible;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -25,7 +24,6 @@
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.IO;
-@GwtIncompatible("Unemulated classes in java.io, java.nio and JGit")
public class FileUtil {
public static boolean modified(FileBasedConfig cfg) throws IOException {
byte[] curVers;
diff --git a/java/com/google/gerrit/common/FooterConstants.java b/java/com/google/gerrit/common/FooterConstants.java
index d76c92b..3ec809c 100644
--- a/java/com/google/gerrit/common/FooterConstants.java
+++ b/java/com/google/gerrit/common/FooterConstants.java
@@ -14,10 +14,8 @@
package com.google.gerrit.common;
-import com.google.common.annotations.GwtIncompatible;
import org.eclipse.jgit.revwalk.FooterKey;
-@GwtIncompatible("Unemulated com.google.gerrit.common.FooterConstants")
public class FooterConstants {
/** The change ID as used to track patch sets. */
public static final FooterKey CHANGE_ID = new FooterKey("Change-Id");
diff --git a/java/com/google/gerrit/common/IoUtil.java b/java/com/google/gerrit/common/IoUtil.java
index 526e88b..37f6c2c 100644
--- a/java/com/google/gerrit/common/IoUtil.java
+++ b/java/com/google/gerrit/common/IoUtil.java
@@ -14,7 +14,6 @@
package com.google.gerrit.common;
-import com.google.common.annotations.GwtIncompatible;
import com.google.common.collect.Sets;
import java.io.IOException;
import java.io.InputStream;
@@ -30,7 +29,6 @@
import java.util.Collections;
import java.util.Set;
-@GwtIncompatible("Unemulated methods in Class and OutputStream")
public final class IoUtil {
public static void copyWithThread(InputStream src, OutputStream dst) {
new Thread("IoUtil-Copy") {
diff --git a/java/com/google/gerrit/common/PluginData.java b/java/com/google/gerrit/common/PluginData.java
index b14543d..c440de1 100644
--- a/java/com/google/gerrit/common/PluginData.java
+++ b/java/com/google/gerrit/common/PluginData.java
@@ -14,11 +14,9 @@
package com.google.gerrit.common;
-import com.google.common.annotations.GwtIncompatible;
import java.nio.file.Path;
import java.util.Objects;
-@GwtIncompatible("Unemulated java.nio.file.Path")
public class PluginData {
public final String name;
public final String version;
diff --git a/java/com/google/gerrit/common/RawInputUtil.java b/java/com/google/gerrit/common/RawInputUtil.java
index e102eab..4a676e6 100644
--- a/java/com/google/gerrit/common/RawInputUtil.java
+++ b/java/com/google/gerrit/common/RawInputUtil.java
@@ -18,14 +18,12 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Objects.requireNonNull;
-import com.google.common.annotations.GwtIncompatible;
import com.google.gerrit.extensions.restapi.RawInput;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
-@GwtIncompatible("Unemulated classes in java.io and javax.servlet")
public class RawInputUtil {
public static RawInput create(String content) {
return create(content.getBytes(UTF_8));
diff --git a/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java b/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
index be8c16e..fa9b139 100644
--- a/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
+++ b/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
@@ -18,7 +18,6 @@
import static com.google.gerrit.common.FileUtil.lastModified;
import static java.util.stream.Collectors.joining;
-import com.google.common.annotations.GwtIncompatible;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
@@ -30,7 +29,6 @@
import java.nio.file.Path;
import java.util.List;
-@GwtIncompatible("Unemulated classes in java.nio and Guava")
public final class SiteLibraryLoaderUtil {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
diff --git a/java/com/google/gerrit/common/UsedAt.java b/java/com/google/gerrit/common/UsedAt.java
index cfbe835..1be6353 100644
--- a/java/com/google/gerrit/common/UsedAt.java
+++ b/java/com/google/gerrit/common/UsedAt.java
@@ -18,7 +18,6 @@
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import com.google.common.annotations.GwtCompatible;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@@ -28,7 +27,6 @@
*/
@Target({METHOD, TYPE})
@Retention(RUNTIME)
-@GwtCompatible
public @interface UsedAt {
/** Enumeration of projects that call a method that would otherwise be private. */
enum Project {
diff --git a/java/com/google/gerrit/common/Version.java b/java/com/google/gerrit/common/Version.java
index b8d3b67..6197be5 100644
--- a/java/com/google/gerrit/common/Version.java
+++ b/java/com/google/gerrit/common/Version.java
@@ -16,7 +16,6 @@
import static java.nio.charset.StandardCharsets.UTF_8;
-import com.google.common.annotations.GwtIncompatible;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.flogger.FluentLogger;
import java.io.BufferedReader;
@@ -24,7 +23,6 @@
import java.io.InputStream;
import java.io.InputStreamReader;
-@GwtIncompatible("Unemulated com.google.gerrit.common.Version")
public class Version {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
diff --git a/java/com/google/gerrit/common/data/SubmitRecord.java b/java/com/google/gerrit/common/data/SubmitRecord.java
index 8638d6d..22861b2 100644
--- a/java/com/google/gerrit/common/data/SubmitRecord.java
+++ b/java/com/google/gerrit/common/data/SubmitRecord.java
@@ -14,7 +14,6 @@
package com.google.gerrit.common.data;
-import com.google.common.annotations.GwtIncompatible;
import com.google.gerrit.reviewdb.client.Account;
import java.util.Collection;
import java.util.List;
@@ -65,7 +64,7 @@
public Status status;
public List<Label> labels;
- @GwtIncompatible public List<SubmitRequirement> requirements;
+ public List<SubmitRequirement> requirements;
public String errorMessage;
public static class Label {
@@ -136,7 +135,6 @@
}
}
- @GwtIncompatible
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
@@ -164,7 +162,6 @@
return sb.toString();
}
- @GwtIncompatible
@Override
public boolean equals(Object o) {
if (o instanceof SubmitRecord) {
@@ -177,7 +174,6 @@
return false;
}
- @GwtIncompatible
@Override
public int hashCode() {
return Objects.hash(status, labels, errorMessage, requirements);
diff --git a/java/com/google/gerrit/common/data/SubmitRequirement.java b/java/com/google/gerrit/common/data/SubmitRequirement.java
index 0c978ca..66e647d 100644
--- a/java/com/google/gerrit/common/data/SubmitRequirement.java
+++ b/java/com/google/gerrit/common/data/SubmitRequirement.java
@@ -17,13 +17,11 @@
import static com.google.common.base.Preconditions.checkState;
import com.google.auto.value.AutoValue;
-import com.google.common.annotations.GwtIncompatible;
import com.google.common.base.CharMatcher;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
/** Describes a requirement to submit a change. */
-@GwtIncompatible
@AutoValue
@AutoValue.CopyAnnotations
public abstract class SubmitRequirement {
diff --git a/java/com/google/gerrit/common/data/SubscribeSection.java b/java/com/google/gerrit/common/data/SubscribeSection.java
index a3468d7..aaf0798 100644
--- a/java/com/google/gerrit/common/data/SubscribeSection.java
+++ b/java/com/google/gerrit/common/data/SubscribeSection.java
@@ -14,7 +14,6 @@
package com.google.gerrit.common.data;
-import com.google.common.annotations.GwtIncompatible;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import java.util.ArrayList;
@@ -24,7 +23,6 @@
import org.eclipse.jgit.transport.RefSpec;
/** Portion of a {@link Project} describing superproject subscription rules. */
-@GwtIncompatible("Unemulated org.eclipse.jgit.transport.RefSpec")
public class SubscribeSection {
private final List<RefSpec> multiMatchRefSpecs;
diff --git a/java/com/google/gerrit/server/change/RevisionResource.java b/java/com/google/gerrit/server/change/RevisionResource.java
index deb5022..caafe24 100644
--- a/java/com/google/gerrit/server/change/RevisionResource.java
+++ b/java/com/google/gerrit/server/change/RevisionResource.java
@@ -34,7 +34,7 @@
public static final TypeLiteral<RestView<RevisionResource>> REVISION_KIND =
new TypeLiteral<RestView<RevisionResource>>() {};
- public static RevisionResource createNonCachable(ChangeResource change, PatchSet ps) {
+ public static RevisionResource createNonCacheable(ChangeResource change, PatchSet ps) {
return new RevisionResource(change, ps, Optional.empty(), false);
}
@@ -52,11 +52,11 @@
}
private RevisionResource(
- ChangeResource change, PatchSet ps, Optional<ChangeEdit> edit, boolean cachable) {
+ ChangeResource change, PatchSet ps, Optional<ChangeEdit> edit, boolean cacheable) {
this.change = change;
this.ps = ps;
this.edit = edit;
- this.cacheable = cachable;
+ this.cacheable = cacheable;
}
public boolean isCacheable() {
diff --git a/java/com/google/gerrit/server/config/ConfigResource.java b/java/com/google/gerrit/server/config/ConfigResource.java
index 4275dc4..f2b7c8e 100644
--- a/java/com/google/gerrit/server/config/ConfigResource.java
+++ b/java/com/google/gerrit/server/config/ConfigResource.java
@@ -26,7 +26,7 @@
/**
* Default cache control that gets set on the 'Cache-Control' header for responses on this
- * resource that are cachable.
+ * resource that are cacheable.
*
* <p>Not all resources are cacheable and in fact the vast majority might not be. Caching is a
* trade-off between the freshness of data and the number of QPS that the web UI sends.
diff --git a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
index f0077cd..1f3f001 100644
--- a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
@@ -175,29 +175,45 @@
}
}
+ private enum PushType {
+ CREATE_REPLACE,
+ NORMAL,
+ AUTOCLOSE,
+ };
+
@Singleton
private static class Metrics {
- private final Histogram1<ResultChangeIds.Key> changes;
- private final Timer1<String> latencyPerChange;
+ private final Histogram1<PushType> changes;
+ private final Timer1<PushType> latencyPerChange;
+ private final Timer1<PushType> latencyPerPush;
private final Counter0 timeouts;
@Inject
Metrics(MetricMaker metricMaker) {
changes =
metricMaker.newHistogram(
- "receivecommits/changes",
+ "receivecommits/changes_per_push",
new Description("number of changes uploaded in a single push.").setCumulative(),
- Field.ofEnum(
- ResultChangeIds.Key.class,
- "type",
- "type of update (replace, create, autoclose)"));
+ Field.ofEnum(PushType.class, "type", "type of push (create/replace, autoclose)"));
+
latencyPerChange =
metricMaker.newTimer(
- "receivecommits/latency",
- new Description("average delay per updated change")
+ "receivecommits/latency_per_push_per_change",
+ new Description(
+ "Processing delay per push divided by the number of changes in said push. "
+ + "(Only includes pushes which contain changes.)")
.setUnit(Units.MILLISECONDS)
.setCumulative(),
- Field.ofString("type", "type of update (create/replace, autoclose)"));
+ Field.ofEnum(PushType.class, "type", "type of push (create/replace, autoclose)"));
+
+ latencyPerPush =
+ metricMaker.newTimer(
+ "receivecommits/latency_per_push",
+ new Description("processing delay for a processing single push")
+ .setUnit(Units.MILLISECONDS)
+ .setCumulative(),
+ Field.ofEnum(
+ PushType.class, "type", "type of push (create/replace, autoclose, normal)"));
timeouts =
metricMaker.newCounter(
@@ -342,24 +358,29 @@
long deltaNanos = System.nanoTime() - startNanos;
int totalChanges = 0;
+ PushType pushType;
if (resultChangeIds.isMagicPush()) {
+ pushType = PushType.CREATE_REPLACE;
List<Change.Id> created = resultChangeIds.get(ResultChangeIds.Key.CREATED);
- metrics.changes.record(ResultChangeIds.Key.CREATED, created.size());
List<Change.Id> replaced = resultChangeIds.get(ResultChangeIds.Key.REPLACED);
- metrics.changes.record(ResultChangeIds.Key.REPLACED, replaced.size());
- totalChanges += replaced.size() + created.size();
+ metrics.changes.record(pushType, created.size() + replaced.size());
+ totalChanges = replaced.size() + created.size();
} else {
List<Change.Id> autoclosed = resultChangeIds.get(ResultChangeIds.Key.AUTOCLOSED);
- metrics.changes.record(ResultChangeIds.Key.AUTOCLOSED, autoclosed.size());
- totalChanges += autoclosed.size();
+ if (!autoclosed.isEmpty()) {
+ pushType = PushType.AUTOCLOSE;
+ metrics.changes.record(pushType, autoclosed.size());
+ totalChanges = autoclosed.size();
+ } else {
+ pushType = PushType.NORMAL;
+ }
}
if (totalChanges > 0) {
- metrics.latencyPerChange.record(
- resultChangeIds.isMagicPush() ? "CREATE_REPLACE" : ResultChangeIds.Key.AUTOCLOSED.name(),
- deltaNanos / totalChanges,
- NANOSECONDS);
+ metrics.latencyPerChange.record(pushType, deltaNanos / totalChanges, NANOSECONDS);
}
+
+ metrics.latencyPerPush.record(pushType, deltaNanos, NANOSECONDS);
}
/** Returns the Change.Ids that were processed in onPreReceive */
diff --git a/java/com/google/gerrit/server/restapi/change/Revisions.java b/java/com/google/gerrit/server/restapi/change/Revisions.java
index 4edd741..84257e9 100644
--- a/java/com/google/gerrit/server/restapi/change/Revisions.java
+++ b/java/com/google/gerrit/server/restapi/change/Revisions.java
@@ -82,7 +82,7 @@
if (id.get().equals("current")) {
PatchSet ps = psUtil.current(change.getNotes());
if (ps != null && visible(change)) {
- return RevisionResource.createNonCachable(change, ps);
+ return RevisionResource.createNonCacheable(change, ps);
}
throw new ResourceNotFoundException(id);
}
diff --git a/plugins/codemirror-editor b/plugins/codemirror-editor
index 0ffcc1c..65f3cba 160000
--- a/plugins/codemirror-editor
+++ b/plugins/codemirror-editor
@@ -1 +1 @@
-Subproject commit 0ffcc1c5865bbfecb811d8631e010251fae04317
+Subproject commit 65f3cbac2174c7aad65a3d7c9325a66871ae5752
diff --git a/plugins/delete-project b/plugins/delete-project
index 1304fb0..3eb70e3 160000
--- a/plugins/delete-project
+++ b/plugins/delete-project
@@ -1 +1 @@
-Subproject commit 1304fb030ea990d63df42cab678cdf2b46722d1b
+Subproject commit 3eb70e3aee5206bfb9d6c1c4dfdd3c92dab56bae
diff --git a/plugins/gitiles b/plugins/gitiles
index 623105f..a25b295 160000
--- a/plugins/gitiles
+++ b/plugins/gitiles
@@ -1 +1 @@
-Subproject commit 623105f14dca02cb294ed94a952f5e8ce0e96683
+Subproject commit a25b295040d6dfa6b27d42ed10ff0539ab66ac71
diff --git a/plugins/webhooks b/plugins/webhooks
index b8fcfd5..47e2f28 160000
--- a/plugins/webhooks
+++ b/plugins/webhooks
@@ -1 +1 @@
-Subproject commit b8fcfd5d712abb599e49c3e40d266b77f05a398a
+Subproject commit 47e2f285e8e21ce8df2a865fa7605d8272aa4d70