HAWQ-559. Fix QD hang when QE is immediately killed after created

Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/0bb22dce
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/0bb22dce
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/0bb22dce

Branch: refs/heads/HAWQ-459
Commit: 0bb22dce146cbd34507293b32f5603a6dc706aec
Parents: 6e88cba
Author: Lili Ma <[email protected]>
Authored: Fri Mar 18 16:49:06 2016 +0800
Committer: Lili Ma <[email protected]>
Committed: Mon Mar 21 09:49:06 2016 +0800

----------------------------------------------------------------------
 src/backend/cdb/dispatcher.c  |  2 ++
 src/backend/cdb/executormgr.c | 20 +++++++++++++++-----
 2 files changed, 17 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/0bb22dce/src/backend/cdb/dispatcher.c
----------------------------------------------------------------------
diff --git a/src/backend/cdb/dispatcher.c b/src/backend/cdb/dispatcher.c
index 5d7105c..55a7823 100644
--- a/src/backend/cdb/dispatcher.c
+++ b/src/backend/cdb/dispatcher.c
@@ -1240,6 +1240,8 @@ dispatch_run(DispatchData *data)
         * Only after we have the executors, we can serialize the state. Or we
         * don't know the executor listening address.
         */
+       CHECK_FOR_INTERRUPTS();
+
        dispatcher_serialize_state(data);
        dispatcher_serialize_query_resource(data);
        dispatcher_set_state_run(data);

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/0bb22dce/src/backend/cdb/executormgr.c
----------------------------------------------------------------------
diff --git a/src/backend/cdb/executormgr.c b/src/backend/cdb/executormgr.c
index 47f5bbe..2bc5059 100644
--- a/src/backend/cdb/executormgr.c
+++ b/src/backend/cdb/executormgr.c
@@ -364,7 +364,19 @@ executormgr_validate_conn(PGconn *conn)
 {
   if (conn == NULL)
     return false;
-  return dispatch_validate_conn(conn->sock);
+  if (!dispatch_validate_conn(conn->sock))
+  {
+    printfPQExpBuffer(&conn->errorMessage,
+              libpq_gettext(
+                  "server closed the connection unexpectedly\n"
+             "\tThis probably means the server terminated abnormally\n"
+                 "\tbefore or while processing the request.\n"));
+    conn->status = CONNECTION_BAD;
+    closesocket(conn->sock);
+    conn->sock = -1;
+    return false;
+  }
+  return true;
 }
 
 /*
@@ -408,7 +420,7 @@ executormgr_dispatch_and_run(struct DispatchData *data, 
QueryExecutor *executor)
        DispatchCommandQueryParms       *parms = 
dispatcher_get_QueryParms(data);
 
        if (!executormgr_is_dispatchable(executor))
-               return false;
+         goto error;
 
        TIMING_BEGIN(executor->time_dispatch_begin);
        query = PQbuildGpQueryString(parms->strCommand, parms->strCommandlen,
@@ -573,10 +585,8 @@ executormgr_catch_error(QueryExecutor *executor)
 
        msg = PQerrorMessage(conn);
 
-       if (msg && (strcmp("", msg) != 0) && (executor->refResult->errcode == 
0)){
+       if (msg && (strcmp("", msg) != 0) && (executor->refResult->errcode == 
0)) {
          errCode = ERRCODE_GP_INTERCONNECTION_ERROR;
-         if (errCode == ERRCODE_GP_INTERCONNECTION_ERROR)
-           errCode = ERRCODE_GP_INTERCONNECTION_ERROR;
        }
 
        PQExpBufferData selfDesc;

Reply via email to