Do not rely on System.nanoTime for E2E metrics
The E2E metrics are calculated across JVMs where
the System.nanoTime cannot be trusted as source of
time as it is JVM-specific.
Use the System.currentTimeMillis and convert the
result into nanos for keeping the API compatibility
with the existing code.
Change-Id: I89fdcf7b5c8f50890be31476e2252ce796fbcf6a
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/PullReplicationApiRequestMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/PullReplicationApiRequestMetrics.java
index 8a97901..597b66f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/PullReplicationApiRequestMetrics.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/PullReplicationApiRequestMetrics.java
@@ -14,6 +14,8 @@
package com.googlesource.gerrit.plugins.replication.pull.api;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.replication.pull.FetchReplicationMetrics;
import java.util.Optional;
@@ -51,18 +53,22 @@
startTimeNanos =
Optional.ofNullable(req.getHeader(HTTP_HEADER_X_START_TIME_NANOS))
.map(Long::parseLong)
- /* Adjust with System.nanoTime() for preventing negative execution times
+ /* Adjust with the system's nanotime for preventing negative execution times
* due to a clock skew between the client and the server timestamp.
*/
- .map(nanoTime -> Math.min(System.nanoTime(), nanoTime));
+ .map(nanoTime -> Math.min(currentTimeNanos(), nanoTime));
}
public Optional<Long> stop(String replicationSourceName) {
return startTimeNanos.map(
start -> {
- long elapsed = System.nanoTime() - start;
+ long elapsed = currentTimeNanos() - start;
metrics.recordEnd2End(replicationSourceName, elapsed);
return elapsed;
});
}
+
+ private long currentTimeNanos() {
+ return MILLISECONDS.toNanos(System.currentTimeMillis());
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchApiClient.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchApiClient.java
index 6b23a9f..6000eb9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchApiClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchApiClient.java
@@ -14,6 +14,8 @@
package com.googlesource.gerrit.plugins.replication.pull.client;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
import com.google.gerrit.entities.Project;
import com.googlesource.gerrit.plugins.replication.pull.Source;
import com.googlesource.gerrit.plugins.replication.pull.api.data.RevisionData;
@@ -34,7 +36,7 @@
default HttpResult callFetch(Project.NameKey project, String refName, URIish targetUri)
throws ClientProtocolException, IOException {
- return callFetch(project, refName, targetUri, System.nanoTime());
+ return callFetch(project, refName, targetUri, MILLISECONDS.toNanos(System.currentTimeMillis()));
}
HttpResult initProject(Project.NameKey project, URIish uri) throws IOException;