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();

Reply via email to