Merge branch 'stable-2.16'

* stable-2.16:
  Do not use QueryProcessor multiple times

Change-Id: I41b06d20e484f6b61e1bd226571cac9abb078340
diff --git a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/QueryChangesHealthCheck.java b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/QueryChangesHealthCheck.java
index 2f5d115..331ef21 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/QueryChangesHealthCheck.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/QueryChangesHealthCheck.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.server.util.ManualRequestContext;
 import com.google.gerrit.server.util.OneOffRequestContext;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.healthcheck.HealthCheckConfig;
 import java.util.List;
@@ -30,7 +31,8 @@
 @Singleton
 public class QueryChangesHealthCheck extends AbstractHealthCheck {
   private static final Logger log = LoggerFactory.getLogger(QueryChangesHealthCheck.class);
-  private final QueryChanges queryChanges;
+  private final Provider<QueryChanges> queryChangesProvider;
+  private final HealthCheckConfig config;
   private final int limit;
   private final OneOffRequestContext oneOffCtx;
 
@@ -38,20 +40,25 @@
   public QueryChangesHealthCheck(
       ListeningExecutorService executor,
       HealthCheckConfig config,
-      QueryChanges queryChanges,
+      Provider<QueryChanges> queryChangesProvider,
       OneOffRequestContext oneOffCtx) {
     super(executor, config, QUERYCHANGES);
-    this.queryChanges = queryChanges;
+    this.queryChangesProvider = queryChangesProvider;
+    this.config = config;
     this.limit = config.getLimit(QUERYCHANGES);
-    queryChanges.setLimit(limit);
-    queryChanges.addQuery(config.getQuery(QUERYCHANGES));
-    queryChanges.setStart(0);
+
     this.oneOffCtx = oneOffCtx;
   }
 
   @Override
   protected Result doCheck() throws Exception {
     try (ManualRequestContext ctx = oneOffCtx.open()) {
+
+      QueryChanges queryChanges = this.queryChangesProvider.get();
+      queryChanges.setLimit(limit);
+      queryChanges.addQuery(config.getQuery(QUERYCHANGES));
+      queryChanges.setStart(0);
+
       List<?> changes = queryChanges.apply(null);
       if (changes == null) {
         log.warn("Cannot query changes: received a null list of results");
diff --git a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckIT.java b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckIT.java
index 3f70903..331c784 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckIT.java
@@ -91,6 +91,18 @@
     assertCheckResult(respPayload, QUERYCHANGES, "passed");
   }
 
+  @Test
+  public void shouldReturnQueryChangesMultipleTimesCheck() throws Exception {
+    createChange("refs/for/master");
+    getHealthCheckStatus();
+    RestResponse resp = getHealthCheckStatus();
+    resp.assertOK();
+
+    JsonObject respPayload = gson.fromJson(resp.getReader(), JsonObject.class);
+
+    assertCheckResult(respPayload, QUERYCHANGES, "passed");
+  }
+
   private RestResponse getHealthCheckStatus() throws IOException {
     return adminRestSession.get("/config/server/healthcheck~status");
   }