You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Ryan King (JIRA)" <ji...@apache.org> on 2010/09/16 23:21:34 UTC

[jira] Commented: (THRIFT-899) Ruby read timeouts can sometimes be 2x what they should be

    [ https://issues.apache.org/jira/browse/THRIFT-899?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12910323#action_12910323 ] 

Ryan King commented on THRIFT-899:
----------------------------------

I can't get jira to upload a the patch as an attachment, so here it is pasted:


diff --git a/lib/rb/lib/thrift/transport/socket.rb b/lib/rb/lib/thrift/transport/socket.rb
index 06c937e..dd76036 100644
--- a/lib/rb/lib/thrift/transport/socket.rb
+++ b/lib/rb/lib/thrift/transport/socket.rb
@@ -97,12 +97,12 @@ module Thrift
           data = @handle.readpartial(sz)
         else
           # it's possible to interrupt select for something other than the timeout
-          # so we need to ensure we've waited long enough
+          # so we need to ensure we've waited long enough, but not too long
           start = Time.now
-          rd = nil # scoping
-          loop do
-            rd, = IO.select([@handle], nil, nil, @timeout)
-            break if (rd and not rd.empty?) or Time.now - start >= @timeout
+          deadline = start + @timeout
+          rd = loop do
+            rd, = IO.select([@handle], nil, nil, deadline - Time.now)
+            break rd if (rd and not rd.empty?) or Time.now >= deadline
           end
           if rd.nil? or rd.empty?
             raise TransportException.new(TransportException::TIMED_OUT, "Socket: Timed out reading #{sz} bytes from #{@desc}")


> Ruby read timeouts  can sometimes be 2x what they should be
> -----------------------------------------------------------
>
>                 Key: THRIFT-899
>                 URL: https://issues.apache.org/jira/browse/THRIFT-899
>             Project: Thrift
>          Issue Type: Bug
>          Components: Ruby - Library
>    Affects Versions: 0.1, 0.2, 0.3, 0.4
>            Reporter: Ryan King
>
> Thrift::Socket#read will sometimes fail to enforce a timeout properly  and wait approximately 2x @timeout before timing out the request.
> Our testing via thrift_client (http://github.com/fauna/thrift_client) would only fail about 1/20 of the time. My hypothesis is that it only fails when you have a floating-point rounding error (we set the timeout to 0.8 seconds, but the math gave us 0.7999, so we wait another 0.8 seconds).
> The patch doesn't have any tests, because this problem is non-deterministic. (also, I couldn't figure out how to run the tests)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.