peien luo created THRIFT-2958:
---------------------------------

             Summary: connect() interrupted is not handled properly in TSocket
                 Key: THRIFT-2958
                 URL: https://issues.apache.org/jira/browse/THRIFT-2958
             Project: Thrift
          Issue Type: Bug
    Affects Versions: 0.9.2, 0.9.1
            Reporter: peien luo


In ./lib/cpp/src/thrift/transport/TSocket.cpp, function void 
TSocket::openConnection(struct addrinfo *res)

If *nix connect() is interrupted, it should not be aborted and throw a 
TException, this will result subsequent connect() failures.

When we close the socket connection on signal EINTR and retry, we will end up 
in same old state and stuck in loop.

Instead,  if connect() is interrupted by a signal that is caught, while blocked 
waiting to establish a connection, connect() shall fail and set connect() to 
[EINTR], but the connection request shall not be aborted, and the connection 
shall be established asynchronously.

In the current thrift code, when connect() fails due to interruptions, an 
exception is thrown and user have no way to establish the connection later.

 273     ret = connect(socket_, res->ai_addr, 
static_cast<int>(res->ai_addrlen));
 274   }
 275
 276   // success case
 277   if (ret == 0) {
 278     goto done;
 279   }
 280
 281   if ((THRIFT_GET_SOCKET_ERROR != THRIFT_EINPROGRESS) && 
(THRIFT_GET_SOCKET_ERROR != THRIFT_EWOULDBLOCK)) {
 282     int errno_copy = THRIFT_GET_SOCKET_ERROR;
 283     GlobalOutput.perror("TSocket::open() connect() " + getSocketInfo(), 
errno_copy);
 284     throw TTransportException(TTransportException::NOT_OPEN, "connect() 
failed", errno_copy);
 285   }




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to