Xie Ling created THRIFT-1642:
--------------------------------

             Summary: Miscalculation lead to throw unexpected 
"TTransportException::TIMED_OUT"(or called "EAGAIN (timed out)") exception
                 Key: THRIFT-1642
                 URL: https://issues.apache.org/jira/browse/THRIFT-1642
             Project: Thrift
          Issue Type: Bug
          Components: C++ - Library
    Affects Versions: 0.8
         Environment: GNU/Linux x86_64
            Reporter: Xie Ling
            Priority: Critical


In function 'uint32_t TSocket::read(uint8_t* buf, uint32_t len)', there's an 
miscalculation which can lead to wrong judgment:

struct timeval begin;
gettimeofday(&begin, NULL);
//
// do some thing
//
struct timeval end;
gettimeofday(&end, NULL);
uint32_t readElapsedMicros =  (((end.tv_sec - begin.tv_sec) * 1000 * 1000)
                               + (((uint64_t)(end.tv_usec - begin.tv_usec))));

'readElapsedMicros' will be very large when 'end.tv_usec < begin.tv_usec'.
This will lead to throw unexpected "TTransportException::TIMED_OUT"(or called 
"EAGAIN (timed out)") exception sometimes.



Besides, 
(1)I don't think the "usleep(50);" call in the same function above is 
necessary, I think delete this call could improve performance.
(2)I don't know why 'readElapsedMicros' compare with 'eagainThresholdMicros', 
which is not the value (recvTimeout_*1000), but:
   eagainThresholdMicros = (recvTimeout_*1000)/ ((maxRecvRetries_>0) ? 
maxRecvRetries_ : 2);
   can anyone tell me someting about this? Thank you!

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to