You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2016/09/24 14:48:43 UTC

asterixdb git commit: Fix Thread Dump Hang on Newly Dead NC

Repository: asterixdb
Updated Branches:
  refs/heads/master 0608bf58f -> 35487c014


Fix Thread Dump Hang on Newly Dead NC

+ improved exception reporting from cluster state HTTP apis

Change-Id: I6ed674ec9e6c50c7da62b82694d1807b3338b289
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1207
Sonar-Qube: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <ti...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/35487c01
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/35487c01
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/35487c01

Branch: refs/heads/master
Commit: 35487c0145c55c6230e455fee6a06d1fb1e305fc
Parents: 0608bf5
Author: Michael Blow <mb...@apache.org>
Authored: Fri Sep 23 20:36:03 2016 -0400
Committer: Michael Blow <mb...@apache.org>
Committed: Sat Sep 24 07:48:22 2016 -0700

----------------------------------------------------------------------
 .../api/http/servlet/ClusterAPIServlet.java       | 10 ++++------
 .../http/servlet/ClusterCCDetailsAPIServlet.java  | 10 ++++++----
 .../servlet/ClusterNodeDetailsAPIServlet.java     | 18 +++++++++++++-----
 .../control/cc/work/GetThreadDumpWork.java        |  6 +++++-
 4 files changed, 28 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/35487c01/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java
index 64cde54..0d9ff16 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java
@@ -30,7 +30,6 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.asterix.app.result.ResultUtil;
 import org.apache.asterix.common.config.AbstractAsterixProperties;
 import org.apache.asterix.runtime.util.ClusterStateManager;
 import org.json.JSONArray;
@@ -65,12 +64,11 @@ public class ClusterAPIServlet extends HttpServlet {
             json = getClusterStateJSON(request, "");
             response.setStatus(HttpServletResponse.SC_OK);
             responseWriter.write(json.toString(4));
-        } catch (IllegalArgumentException e) {
-            ResultUtil.apiErrorHandler(responseWriter, e);
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        } catch (IllegalArgumentException e) { // NOSONAR - exception not logged or rethrown
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
         } catch (Exception e) {
-            ResultUtil.apiErrorHandler(responseWriter, e);
-            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            LOGGER.log(Level.INFO, "exception thrown for " + request, e);
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
         }
         responseWriter.flush();
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/35487c01/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterCCDetailsAPIServlet.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterCCDetailsAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterCCDetailsAPIServlet.java
index 64e65a5..75fba74 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterCCDetailsAPIServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterCCDetailsAPIServlet.java
@@ -22,17 +22,19 @@ import static org.apache.asterix.api.http.servlet.ServletConstants.HYRACKS_CONNE
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.asterix.app.result.ResultUtil;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.json.JSONObject;
 
 public class ClusterCCDetailsAPIServlet extends ClusterAPIServlet {
     private static final long serialVersionUID = 1L;
+    private static final Logger LOGGER = Logger.getLogger(ClusterCCDetailsAPIServlet.class.getName());
 
     @Override
     protected void getUnsafe(HttpServletRequest request, HttpServletResponse response) throws IOException {
@@ -51,11 +53,11 @@ public class ClusterCCDetailsAPIServlet extends ClusterAPIServlet {
             response.setContentType("application/json");
             response.setCharacterEncoding("utf-8");
             responseWriter.write(json.toString(4));
-        } catch (IllegalArgumentException e) { //NOSONAR - exception not logged or rethrown
+        } catch (IllegalArgumentException e) { // NOSONAR - exception not logged or rethrown
             response.sendError(HttpServletResponse.SC_NOT_FOUND);
         } catch (Exception e) {
-            ResultUtil.apiErrorHandler(responseWriter, e);
-            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            LOGGER.log(Level.INFO, "exception thrown for " + request, e);
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
         }
         responseWriter.flush();
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/35487c01/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterNodeDetailsAPIServlet.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterNodeDetailsAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterNodeDetailsAPIServlet.java
index 5a91fee..f5509c2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterNodeDetailsAPIServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterNodeDetailsAPIServlet.java
@@ -25,12 +25,14 @@ import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.asterix.app.result.ResultUtil;
+import org.apache.asterix.runtime.util.ClusterStateManager;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -38,6 +40,7 @@ import org.json.JSONObject;
 
 public class ClusterNodeDetailsAPIServlet extends ClusterAPIServlet {
     private static final long serialVersionUID = 1L;
+    private static final Logger LOGGER = Logger.getLogger(ClusterNodeDetailsAPIServlet.class.getName());
 
     @Override
     protected void getUnsafe(HttpServletRequest request, HttpServletResponse response) throws IOException {
@@ -57,11 +60,13 @@ public class ClusterNodeDetailsAPIServlet extends ClusterAPIServlet {
             response.setContentType("application/json");
             response.setCharacterEncoding("utf-8");
             responseWriter.write(json.toString(4));
-        } catch (IllegalArgumentException e) { //NOSONAR - exception not logged or rethrown
+        } catch (IllegalStateException e) { // NOSONAR - exception not logged or rethrown
+            response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+        } catch (IllegalArgumentException e) { // NOSONAR - exception not logged or rethrown
             response.sendError(HttpServletResponse.SC_NOT_FOUND);
         } catch (Exception e) {
-            ResultUtil.apiErrorHandler(responseWriter, e);
-            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            LOGGER.log(Level.INFO, "exception thrown for " + request, e);
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
         }
         responseWriter.flush();
     }
@@ -187,7 +192,10 @@ public class ClusterNodeDetailsAPIServlet extends ClusterAPIServlet {
         }
         String dump = hcc.getThreadDump(node);
         if (dump == null) {
-            throw new IllegalArgumentException();
+            // check to see if this is a node that is simply down
+            throw ClusterStateManager.INSTANCE.getNodePartitions(node) != null
+                    ? new IllegalStateException()
+                    : new IllegalArgumentException();
         }
         return new JSONObject(dump);
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/35487c01/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
index b18d388..be53232 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
@@ -52,7 +52,11 @@ public class GetThreadDumpWork extends ThreadDumpWork {
                 callback.setValue(null);
             } else {
                 ccs.addThreadDumpRun(run.getRequestId(), run);
-                ncState.getNodeController().takeThreadDump(run.getRequestId());
+                try {
+                    ncState.getNodeController().takeThreadDump(run.getRequestId());
+                } catch (Exception e) {
+                    callback.setException(e);
+                }
             }
         }
     }