shalinmangar commented on a change in pull request #1387: SOLR-14210: Include 
replica health in healtcheck handler
URL: https://github.com/apache/lucene-solr/pull/1387#discussion_r402303966
 
 

 ##########
 File path: 
solr/core/src/java/org/apache/solr/handler/admin/HealthCheckHandler.java
 ##########
 @@ -88,15 +96,46 @@ public void handleRequestBody(SolrQueryRequest req, 
SolrQueryResponse rsp) throw
       return;
     }
 
-    // Set status to true if this node is in live_nodes
-    if 
(clusterState.getLiveNodes().contains(cores.getZkController().getNodeName())) {
-      rsp.add(STATUS, OK);
-    } else {
+    // Fail if not in live_nodes
+    if 
(!clusterState.getLiveNodes().contains(cores.getZkController().getNodeName())) {
       rsp.add(STATUS, FAILURE);
       rsp.setException(new 
SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Host Unavailable: 
Not in live nodes as per zk"));
+      return;
     }
 
-    rsp.setHttpCaching(false);
+    // Optionally require that all cores on this node are active if param 
'requireHealthyCores=true'
+    if (req.getParams().getBool(PARAM_REQUIRE_HEALTHY_CORES, false)) {
+      List<String> unhealthyCores = findUnhealthyCores(clusterState,
+              cores.getNodeConfig().getNodeName(),
+              cores.getAllCoreNames());
+      if (unhealthyCores.size() > 0) {
+          rsp.add(STATUS, FAILURE);
+          rsp.setException(new 
SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE,
+                  "Replica(s) " + unhealthyCores + " are currently 
initializing or recovering"));
+          return;
+      }
+      rsp.add("message", "All cores are healthy");
+    }
+
+    // All lights green, report healthy
+    rsp.add(STATUS, OK);
+  }
+
+  /**
+   * Find replicas DOWN or RECOVERING, or replicas in clusterstate that do not 
exist on local node
+   * @param clusterState clusterstate from ZK
+   * @param nodeName this node name
+   * @param allCoreNames list of all core names on current node
+   * @return list of core names that are either DOWN ore RECOVERING on 
'nodeName'
+   */
+  static List<String> findUnhealthyCores(ClusterState clusterState, String 
nodeName, Collection<String> allCoreNames) {
+    return clusterState.getCollectionsMap().values().stream()
 
 Review comment:
   Why does this need to go to cluster state? This becomes a very expensive 
method when you have a lot of collections because it fetches collection states 
for all collections from ZK even if those collections have no replicas on the 
current node. Imagine having 300 collections and doing 299 zk read operations 
just for a health check if the node hosts replicas for one collection only.
   
   I think this method should be rewritten to iterate over the CloudDescriptors 
of all local cores and check for `hasRegistered == true` and `lastPublished == 
ACTIVE`. Those two should be sufficient for a health check functionality. We 
don't even need to consult the cluster state.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to