You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by hu...@apache.org on 2019/05/25 01:19:42 UTC

[helix] 08/44: Swallow exceptions during health status checks for getting instance by id

This is an automated email from the ASF dual-hosted git repository.

hulee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git

commit b4e9d4b83fc955a024dce6c43fce98231c2d4c7c
Author: Yi Wang <yw...@linkedin.com>
AuthorDate: Mon Apr 1 15:54:21 2019 -0700

    Swallow exceptions during health status checks for getting instance by id
    
    RB=1615554
    G=helix-reviewers
    A=jxue
    
    Signed-off-by: Hunter Lee <hu...@linkedin.com>
---
 .../helix/rest/server/json/instance/InstanceInfo.java  |  5 +++++
 .../helix/rest/server/service/InstanceServiceImpl.java | 11 +++++++++--
 .../helix/rest/server/TestPerInstanceAccessor.java     | 18 ++++++++++++++++++
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/helix-rest/src/main/java/org/apache/helix/rest/server/json/instance/InstanceInfo.java b/helix-rest/src/main/java/org/apache/helix/rest/server/json/instance/InstanceInfo.java
index b1600ce..f258c92 100644
--- a/helix-rest/src/main/java/org/apache/helix/rest/server/json/instance/InstanceInfo.java
+++ b/helix-rest/src/main/java/org/apache/helix/rest/server/json/instance/InstanceInfo.java
@@ -106,6 +106,11 @@ public class InstanceInfo {
       return this;
     }
 
+    public Builder healthStatus(boolean isHealth) {
+      this.isHealth = isHealth;
+      return this;
+    }
+
     public InstanceInfo build() {
       return new InstanceInfo(this);
     }
diff --git a/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java b/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
index 22ac30b..a928b98 100644
--- a/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
+++ b/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
@@ -24,8 +24,10 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+
 import org.apache.helix.ConfigAccessor;
 import org.apache.helix.HelixDataAccessor;
+import org.apache.helix.HelixException;
 import org.apache.helix.model.CurrentState;
 import org.apache.helix.model.InstanceConfig;
 import org.apache.helix.model.LiveInstance;
@@ -123,8 +125,13 @@ public class InstanceServiceImpl implements InstanceService {
       }
       instanceInfoBuilder.partitions(partitions);
     }
-    instanceInfoBuilder
-        .healthStatus(getInstanceHealthStatus(clusterId, instanceName, healthChecks));
+    try {
+      Map<String, Boolean> healthStatus = getInstanceHealthStatus(clusterId, instanceName, healthChecks);
+      instanceInfoBuilder.healthStatus(healthStatus);
+    } catch (HelixException ex) {
+      _logger.error("Exception while getting health status: {}, reporting health status as unHealth", ex);
+      instanceInfoBuilder.healthStatus(false);
+    }
 
     return instanceInfoBuilder.build();
   }
diff --git a/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java b/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
index 1a9a6da..f58bc69 100644
--- a/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
+++ b/helix-rest/src/test/java/org/apache/helix/rest/server/TestPerInstanceAccessor.java
@@ -26,6 +26,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.MediaType;
@@ -39,6 +40,7 @@ import org.apache.helix.manager.zk.ZKHelixDataAccessor;
 import org.apache.helix.model.InstanceConfig;
 import org.apache.helix.model.Message;
 import org.apache.helix.rest.server.resources.AbstractResource;
+import org.apache.helix.rest.server.resources.helix.InstancesAccessor;
 import org.apache.helix.rest.server.resources.helix.PerInstanceAccessor;
 import org.apache.helix.rest.server.util.JerseyUriRequestBuilder;
 import org.apache.helix.util.InstanceValidationUtil;
@@ -130,6 +132,22 @@ public class TestPerInstanceAccessor extends AbstractTestClass {
   }
 
   @Test(dependsOnMethods = "testGetMessagesByStateModelDef")
+  public void testGetAllInstances() throws IOException {
+    System.out.println("Start test :" + TestHelper.getTestMethodName());
+    String body = new JerseyUriRequestBuilder("clusters/{}/instances").isBodyReturnExpected(true)
+        .format(CLUSTER_NAME).get(this);
+
+    JsonNode node = OBJECT_MAPPER.readTree(body);
+    String instancesStr = node.get(InstancesAccessor.InstancesProperties.instances.name()).toString();
+    Assert.assertNotNull(instancesStr);
+
+    Set<String> instances = OBJECT_MAPPER.readValue(instancesStr,
+        OBJECT_MAPPER.getTypeFactory().constructCollectionType(Set.class, String.class));
+    Assert.assertEquals(instances, _instancesMap.get(CLUSTER_NAME), "Instances from response: "
+        + instances + " vs instances actually: " + _instancesMap.get(CLUSTER_NAME));
+  }
+
+  @Test(dependsOnMethods = "testGetAllInstances")
   public void testGetInstanceById() throws IOException {
     System.out.println("Start test :" + TestHelper.getTestMethodName());
     String body = new JerseyUriRequestBuilder("clusters/{}/instances/{}").isBodyReturnExpected(true)