Disable querychanges for gerrit replicas
The `querychanges` healthcheck cannot ever be executed on a gerrit
replica since it does not have any change index.
Automatically disable `querychanges` healthcheck for gerrit replica,
regardless of its `enabled` value in configuration.
Bug: Issue 13545
Change-Id: I0028fcac2d7bf156f14f7c108d5ead3e9c05f67c
diff --git a/README.md b/README.md
index e5ad599..0fe07ba 100644
--- a/README.md
+++ b/README.md
@@ -26,8 +26,8 @@
Copy the healthcheck.jar into the Gerrit's /plugins directory and wait for the plugin to be automatically loaded.
The healthcheck plugin is compatible with both Gerrit master and slave setups. The only difference to bear in mind
-is that some checks may not be successful on slaves (e.g. query changes) because the associated subsystem is switched
-off.
+is that some checks will be automatically disabled on slaves (e.g. query changes) because the associated subsystem
+is switched off.
## How to use
diff --git a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
index a19c934..126c26f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.healthcheck;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.googlesource.gerrit.plugins.healthcheck.check.HealthCheckNames.QUERYCHANGES;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
@@ -23,9 +24,11 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.util.Collections;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -48,16 +51,22 @@
private final AllUsersName allUsersName;
private final Config config;
+ private final boolean isReplica;
+
+ private static final Set<String> HEALTH_CHECK_DISABLED_FOR_REPLICAS =
+ Collections.singleton(QUERYCHANGES);
@Inject
public HealthCheckConfig(
PluginConfigFactory configFactory,
@PluginName String pluginName,
AllProjectsName allProjectsName,
- AllUsersName allUsersName) {
+ AllUsersName allUsersName,
+ @GerritServerConfig Config gerritConfig) {
config = configFactory.getGlobalPluginConfig(pluginName);
this.allProjectsName = allProjectsName;
this.allUsersName = allUsersName;
+ isReplica = gerritConfig.getBoolean("container", "slave", false);
}
@VisibleForTesting
@@ -72,6 +81,7 @@
}
allProjectsName = new AllProjectsName("All-Projects");
allUsersName = new AllUsersName("All-Users");
+ isReplica = false;
}
@VisibleForTesting
@@ -125,6 +135,9 @@
}
public boolean healthCheckEnabled(String healthCheckName) {
+ if (isReplica && HEALTH_CHECK_DISABLED_FOR_REPLICAS.contains(healthCheckName)) {
+ return false;
+ }
return config.getBoolean(
HEALTHCHECK, checkNotNull(healthCheckName), "enabled", HEALTH_CHECK_ENABLED_DEFAULT);
}
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 186693e..ef5dc8e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckIT.java
@@ -135,6 +135,15 @@
}
@Test
+ @GerritConfig(name = "container.slave", value = "true")
+ public void shouldReturnQueryChangesAsDisabledForSlave() throws Exception {
+ RestResponse resp = getHealthCheckStatus();
+ resp.assertOK();
+
+ assertCheckResult(getResponseJson(resp), QUERYCHANGES, "disabled");
+ }
+
+ @Test
public void shouldReturnQueryChangesMultipleTimesCheck() throws Exception {
createChange("refs/for/master");
getHealthCheckStatus();