This is an automated email from the ASF dual-hosted git repository.
jxue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git
The following commit(s) were added to refs/heads/master by this push:
new f3cf2dd2a Correctly state cluster is in maintenance mode when
maintenance znode is empty (#2559)
f3cf2dd2a is described below
commit f3cf2dd2a187d190622e9ddfd11916c8db6e5e8a
Author: Grant Paláu Spencer <[email protected]>
AuthorDate: Fri Jul 21 15:15:19 2023 -0700
Correctly state cluster is in maintenance mode when maintenance znode is
empty (#2559)
helix-rest maintenanceSignal detects cluster in maintenance mode when
maintenance znode is empty
---
.../server/resources/helix/ClusterAccessor.java | 14 +++++++----
.../helix/rest/server/TestClusterAccessor.java | 27 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 5 deletions(-)
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
index f81dc7f29..68744cbbe 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ClusterAccessor.java
@@ -765,12 +765,16 @@ public class ClusterAccessor extends
AbstractHelixResource {
@GET
@Path("{clusterId}/controller/maintenanceSignal")
public Response getClusterMaintenanceSignal(@PathParam("clusterId") String
clusterId) {
- HelixDataAccessor dataAccessor = getDataAccssor(clusterId);
- MaintenanceSignal maintenanceSignal =
- dataAccessor.getProperty(dataAccessor.keyBuilder().maintenance());
- if (maintenanceSignal != null) {
- Map<String, String> maintenanceInfo =
maintenanceSignal.getRecord().getSimpleFields();
+ boolean inMaintenanceMode = getHelixAdmin().isInMaintenanceMode(clusterId);
+
+ if (inMaintenanceMode) {
+ HelixDataAccessor dataAccessor = getDataAccssor(clusterId);
+ MaintenanceSignal maintenanceSignal =
dataAccessor.getProperty(dataAccessor.keyBuilder().maintenance());
+
+ Map<String, String> maintenanceInfo = (maintenanceSignal != null) ?
+ maintenanceSignal.getRecord().getSimpleFields() : new HashMap<>();
maintenanceInfo.put(ClusterProperties.clusterName.name(), clusterId);
+
return JSONRepresentation(maintenanceInfo);
}
return notFound(String.format("Cluster %s is not in maintenance mode!",
clusterId));
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
index 59cb51c9f..86c9d5ae3 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
@@ -523,6 +523,33 @@ public class TestClusterAccessor extends AbstractTestClass
{
}
@Test(dependsOnMethods = "testEnableDisableMaintenanceMode")
+ public void testEmptyMaintenanceSignal() throws IOException {
+ System.out.println("Start test :" + TestHelper.getTestMethodName());
+ String cluster = _clusters.iterator().next();
+
+ // Create empty maintenance znode
+ ZNRecord record = new ZNRecord("test_maintenance_node");
+ ZKUtil.createOrUpdate(_gZkClient, "/"+cluster+"/CONTROLLER/MAINTENANCE",
record, true, true);
+
+ // Verify maintenance mode enabled
+ Assert.assertTrue(isMaintenanceModeEnabled(cluster));
+ get("clusters/" + cluster + "/controller/maintenanceSignal", null,
+ Response.Status.OK.getStatusCode(), true);
+
+
+ // Disable maintenance mode
+ post("clusters/" + cluster, ImmutableMap.of("command",
"disableMaintenanceMode"),
+ Entity.entity("", MediaType.APPLICATION_JSON_TYPE),
Response.Status.OK.getStatusCode());
+
+ // Verify no longer in maintenance mode
+ Assert.assertFalse(isMaintenanceModeEnabled(cluster));
+ get("clusters/" + cluster + "/controller/maintenanceSignal", null,
+ Response.Status.NOT_FOUND.getStatusCode(), false);
+ System.out.println("End test :" + TestHelper.getTestMethodName());
+
+ }
+
+ @Test(dependsOnMethods = "testEmptyMaintenanceSignal")
public void testGetControllerLeadershipHistory() throws IOException {
System.out.println("Start test :" + TestHelper.getTestMethodName());
String cluster = _clusters.iterator().next();