HAWQ-557. Set connection pool connections always NODELAY and KEEPALIVE

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

Branch: refs/heads/HAWQ-459
Commit: e82ac3f17319dcc630b467868491089a189aeeec
Parents: f38ad11
Author: YI JIN <[email protected]>
Authored: Fri Mar 18 13:58:18 2016 +1100
Committer: YI JIN <[email protected]>
Committed: Fri Mar 18 13:58:18 2016 +1100

----------------------------------------------------------------------
 .../communication/rmcomm_AsyncComm.c            |  6 +++++
 .../communication/rmcomm_Connect.c              |  5 ++++
 .../communication/rmcomm_QD2RM.c                | 27 ++++++++++++++++++++
 .../include/utils/network_utils.h               |  1 +
 .../resourcemanager/utils/network_utils.c       | 20 +++++++++++++++
 5 files changed, 59 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/e82ac3f1/src/backend/resourcemanager/communication/rmcomm_AsyncComm.c
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/communication/rmcomm_AsyncComm.c 
b/src/backend/resourcemanager/communication/rmcomm_AsyncComm.c
index 0084edc..181cc86 100644
--- a/src/backend/resourcemanager/communication/rmcomm_AsyncComm.c
+++ b/src/backend/resourcemanager/communication/rmcomm_AsyncComm.c
@@ -718,6 +718,12 @@ int registerAsyncConnectionFileDesc(const char             
                *address,
        sockres = connect(fd, (struct sockaddr *)&server_addr, 
sizeof(server_addr));
        if ( sockres == 0 )
        {
+               if ( setConnectionLongTermNoDelay(fd) != FUNC_RETURN_OK )
+               {
+                       close(fd);
+                       res = UTIL_NETWORK_FAIL_CONNECT;
+                       goto exit;
+               }
                /*
                 * New connection is created. Suppose domain socket and local 
socket
                 * connection can be done now. Register a normal client FD in 
poll() to

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/e82ac3f1/src/backend/resourcemanager/communication/rmcomm_Connect.c
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/communication/rmcomm_Connect.c 
b/src/backend/resourcemanager/communication/rmcomm_Connect.c
index fd916da..6c58a5c 100644
--- a/src/backend/resourcemanager/communication/rmcomm_Connect.c
+++ b/src/backend/resourcemanager/communication/rmcomm_Connect.c
@@ -68,6 +68,11 @@ void WriteReadyHandler_Connect(AsyncCommBuffer buffer)
                shouldclose = true;
        }
 
+       if ( setConnectionLongTermNoDelay(buffer->FD) != FUNC_RETURN_OK )
+       {
+               shouldclose = true;
+       }
+
        if ( shouldclose )
        {
                ErrorHandler_Connect(buffer);

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/e82ac3f1/src/backend/resourcemanager/communication/rmcomm_QD2RM.c
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/communication/rmcomm_QD2RM.c 
b/src/backend/resourcemanager/communication/rmcomm_QD2RM.c
index d601383..59494a0 100644
--- a/src/backend/resourcemanager/communication/rmcomm_QD2RM.c
+++ b/src/backend/resourcemanager/communication/rmcomm_QD2RM.c
@@ -1440,6 +1440,7 @@ void *generateResourceRefreshHeartBeat(void *arg)
                                int sockres = 0;
                                while(true)
                                {
+                                       int on;
                                        sockres = connect(fd,
                                                                          
(struct sockaddr *)&server_addr,
                                                                          
sizeof(server_addr));
@@ -1455,8 +1456,34 @@ void *generateResourceRefreshHeartBeat(void *arg)
                                                                          
"failed to connect to resource manager, "
                                                                          "fd 
%d (errno %d)", fd, errno);
                                                        close(fd);
+                                                       fd = -1;
                                                }
                                        }
+#ifdef TCP_NODELAY
+                                       on = 1;
+                                       if (sockres == 0 &&
+                                               setsockopt(fd,
+                                                                  IPPROTO_TCP, 
TCP_NODELAY,
+                                                                  (char *) 
&on, sizeof(on)) < 0)
+                                       {
+                                               write_log("ERROR 
setsockopt(TCP_NODELAY) failed: %m");
+                                               close(fd);
+                                               fd = -1;
+                                               sockres = -1;
+                                       }
+#endif
+                                       on = 1;
+                                       if (sockres == 0 &&
+                                               setsockopt(fd,
+                                                                  SOL_SOCKET, 
SO_KEEPALIVE,
+                                                                  (char *) 
&on, sizeof(on)) < 0)
+                                       {
+                                               write_log("ERROR 
setsockopt(SO_KEEPALIVE) failed: %m");
+                                               close(fd);
+                                               fd = -1;
+                                               sockres = -1;
+                                       }
+
                                        break;
                                }
 

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/e82ac3f1/src/backend/resourcemanager/include/utils/network_utils.h
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/include/utils/network_utils.h 
b/src/backend/resourcemanager/include/utils/network_utils.h
index 4aa2cf0..a048131 100644
--- a/src/backend/resourcemanager/include/utils/network_utils.h
+++ b/src/backend/resourcemanager/include/utils/network_utils.h
@@ -109,6 +109,7 @@ int setConnectionNonBlocked(int fd);
 
 #define DRM_SOCKET_CONN_RETRY 5
 int  connectToServerRemote(const char *address,uint16_t port,int *clientfd);
+int setConnectionLongTermNoDelay(int fd);
 void closeConnectionRemote(int *clientfd);
 void returnAliveConnectionRemote(int                   *clientfd,
                                                                 const char     
*hostname,

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/e82ac3f1/src/backend/resourcemanager/utils/network_utils.c
----------------------------------------------------------------------
diff --git a/src/backend/resourcemanager/utils/network_utils.c 
b/src/backend/resourcemanager/utils/network_utils.c
index b8bbab9..fbfe0a9 100644
--- a/src/backend/resourcemanager/utils/network_utils.c
+++ b/src/backend/resourcemanager/utils/network_utils.c
@@ -715,3 +715,23 @@ static void cleanupSocketConnectionPool(int code, Datum 
arg)
        freePAIRRefList(&ResolvedHostnames, &addrlist);
        cleanHASHTABLE(&ResolvedHostnames);
 }
+
+int setConnectionLongTermNoDelay(int fd)
+{
+       int on;
+#ifdef TCP_NODELAY
+       on = 1;
+       if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &on, sizeof(on)) 
< 0)
+       {
+               elog(WARNING, "setsockopt(TCP_NODELAY) failed: %m");
+               return SYSTEM_CALL_ERROR;
+       }
+#endif
+       on = 1;
+       if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) 
< 0)
+       {
+               elog(WARNING, "setsockopt(SO_KEEPALIVE) failed: %m");
+               return SYSTEM_CALL_ERROR;
+       }
+       return FUNC_RETURN_OK;
+}

Reply via email to