You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Dmytro Shteflyuk (Jira)" <ji...@apache.org> on 2026/03/29 22:26:00 UTC

[jira] [Updated] (THRIFT-5942) Incorrect connection timeout handling in TSocket / TSSLSocket

     [ https://issues.apache.org/jira/browse/THRIFT-5942?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dmytro Shteflyuk updated THRIFT-5942:
-------------------------------------
    Summary: Incorrect connection timeout handling in TSocket / TSSLSocket  (was: Incorrect connection timeout handling in {{TSocket}} / {{TSSLSocket}})

> Incorrect connection timeout handling in TSocket / TSSLSocket
> -------------------------------------------------------------
>
>                 Key: THRIFT-5942
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5942
>             Project: Thrift
>          Issue Type: Bug
>          Components: Ruby - Library
>            Reporter: Dmytro Shteflyuk
>            Priority: Major
>
> The Ruby transport has inconsistent and partially broken timeout behavior during connection establishment.
> Plain TCP open does not appear to hang forever, but it handles timeout and cleanup poorly.
> SSL open is worse: the handshake loop can retry indefinitely when the readiness wait times out, so a caller-provided timeout is not reliably enforced.
> This affects:
>  * {{lib/rb/lib/thrift/transport/socket.rb}}
>  * {{lib/rb/lib/thrift/transport/ssl_socket.rb}}
> h2. Problem
> The Ruby transport currently uses one code path for TCP connect and a separate retry loop for SSL handshake, and both have issues.
> h3. Plain TCP issues
> In {{Socket#open}}:
>  * connect waits for writability after {{connect_nonblock}}
>  * if the wait call times out, the code falls through to the next address candidate
>  * that timeout is not surfaced as {{TransportException::TIMED_OUT}}
>  * the failed candidate socket is not closed before trying the next address
>  * if all candidates fail through that path, the final error can be weak or lose the real cause
>  * {{timeout == 0}} behaves like immediate timeout during open, which is inconsistent with the existing read/write behavior where {{nil}} and {{0}} mean blocking
> Important note: plain TCP does *not* seem to loop forever in the same way as SSL, but it still mishandles timeout semantics and cleanup.
> h3. SSL issues
> In {{SSLSocket#open}}:
>  * the code wraps the TCP socket in {{OpenSSL::SSL::SSLSocket}}
>  * it calls {{connect_nonblock}}
>  * on {{IO::WaitReadable}} / {{IO::WaitWritable}}, it does a readiness wait and then unconditionally retries
> This creates a real bug:
>  * if the readiness wait returns {{nil}} on timeout, the code still retries
>  * each retry effectively gets a fresh full timeout window
>  * repeated read/write wait states during handshake can therefore exceed the user-supplied timeout indefinitely



--
This message was sent by Atlassian Jira
(v8.20.10#820010)