Browse Source

[HUE-6090] Hue to do a keep alive on idle sessions to HiveServer2

This patch has been contributed by Christopher Conner.

In this patch we are adding socket.SO_KEEPALIVE attribute to the establish socket.

SO_KEEPALIVE will keep idle connection active such that firewall in between does not kill the connection. This fix enables Hue do keep alive on the thrift sessions to HS2 and Impala.
Chris Conner 8 years ago
parent
commit
6148e7d

+ 4 - 0
desktop/core/ext-py/thrift-0.9.1/src/transport/TSSLSocket.py

@@ -86,6 +86,10 @@ class TSSLSocket(TSocket.TSocket):
         sock_family, sock_type = res[0:2]
         sock_family, sock_type = res[0:2]
         ip_port = res[4]
         ip_port = res[4]
         plain_sock = socket.socket(sock_family, sock_type)
         plain_sock = socket.socket(sock_family, sock_type)
+        # check and turn on TCP Keepalive
+        sockprops = plain_sock.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE)
+        if (sockprops == 0):
+          sockprops = plain_sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
         self.handle = ssl.wrap_socket(plain_sock,
         self.handle = ssl.wrap_socket(plain_sock,
                                       ssl_version=self.SSL_VERSION,
                                       ssl_version=self.SSL_VERSION,
                                       do_handshake_on_connect=True,
                                       do_handshake_on_connect=True,

+ 8 - 0
desktop/core/ext-py/thrift-0.9.1/src/transport/TSocket.py

@@ -83,6 +83,10 @@ class TSocket(TSocketBase):
       res0 = self._resolveAddr()
       res0 = self._resolveAddr()
       for res in res0:
       for res in res0:
         self.handle = socket.socket(res[0], res[1])
         self.handle = socket.socket(res[0], res[1])
+        # check and turn on TCP Keepalive
+        sockprops = self.handle.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE)
+        if (sockprops == 0):
+          sockprops = self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
         self.handle.settimeout(self._timeout)
         self.handle.settimeout(self._timeout)
         try:
         try:
           self.handle.connect(res[4])
           self.handle.connect(res[4])
@@ -167,6 +171,10 @@ class TServerSocket(TSocketBase, TServerTransportBase):
           os.unlink(res[4])
           os.unlink(res[4])
 
 
     self.handle = socket.socket(res[0], res[1])
     self.handle = socket.socket(res[0], res[1])
+    # check and turn on TCP Keepalive
+    sockprops = self.handle.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE)
+    if (sockprops == 0):
+      sockprops = self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
     self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     if hasattr(self.handle, 'settimeout'):
     if hasattr(self.handle, 'settimeout'):
       self.handle.settimeout(None)
       self.handle.settimeout(None)