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

kuldeep gupta commented on THRIFT-1642:
---------------------------------------

In read function of TSocket.cpp 
eagainThresholdMicros is calculated using recvTimeout_ and maxRecvRetries_ 
variables.

TSocket.cpp provides 2 useful API's setMaxRecvRetries and setRecvTimeout.
Both variables can be set using these API's setMaxRecvRetries(int 
maxRecvRetries) and setRecvTimeout(int ms)
It is User's responsibility to set these Variables.

If the user is not setting these variables, by default value will be used , 
which may cause EAGAIN (timed out) or EAGAIN (unavailable resources) in a heavy 
or concurrent Running Server where multiple Requests are processed at runtime 
in a mutithreaded environment.
                
> 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: catxl
>            Priority: Critical
>         Attachments: TSocket.cpp.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> 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
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to