RFR 8075484:SocketInputStream.socketRead0 can hang even with soTimeout set

Mark Sheppard mark.sheppard at oracle.com
Thu Sep 1 17:51:25 UTC 2016


Hi Vyom,
      thanks for doing the refactoring.
changes look OK to me

regards
Mark

On 01/09/2016 17:03, Vyom Tewari wrote:
>
> please find the updated 
> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.1/index.html 
> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.1/index.html>). 
> I incorporated the review comments.
>
> Thanks,
>
> Vyom
>
>
> On Tuesday 30 August 2016 04:11 PM, Mark Sheppard wrote:
>>
>> Hi
>>   perhaps there is an opportunity to do  some refactoring here (...  
>> for me a "goto " carries a code smell! )
>>
>> along the lines
>>
>> if (timeout) {
>>     nread =  NET_ReadWithTimeout(...);
>> } else {
>>      nread = NET_Read(...);
>> }
>>
>>
>> the NET_ReadWithTimeout (...) function will contain a restructuring 
>> of your goto loop
>> while (_timeout > 0) { nread = NET_Timeout(fd, _timeout);
>>            if (nread <= 0) {
>>                if (nread == 0) {
>>                    JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
>>                                "Read timed out");
>>                } else if (nread == -1) {
>>                    if (errno == EBADF) {
>>                         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
>>                    } else if (errno == ENOMEM) {
>>                        JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
>>                    } else {
>>                        JNU_ThrowByNameWithMessageAndLastError
>>                            (env, JNU_JAVANETPKG "SocketException", "select/poll failed");
>>                    }
>>                }
>>                  // release buffer in main call flow
>> //              if (bufP != BUF) {
>> //                  free(bufP);
>> //             }
>>               nread = -1;
>>               break;
>>            } else {
>> nread = NET_NonBlockingRead(fd, bufP, len);
>> if (nread == -1 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) {
>>                gettimeofday(&t, NULL);
>> newtime = t.tv_sec * 1000 + t.tv_usec / 1000;
>> _timeout -= newtime - prevtime;
>> if(_timeout > 0){
>> prevtime = newtime;
>>                    }
>> } else { break; } } } return nread;
>>
>> e&oe
>>
>> regards
>> Mark
>>
>>
>> On 29/08/2016 10:58, Vyom Tewari wrote:
>>> gentle reminder, please review the below code change.
>>>
>>> Vyom
>>>
>>>
>>> On Monday 22 August 2016 05:12 PM, Vyom Tewari wrote:
>>>> Hi All,
>>>>
>>>> Please review the code changes for below issue.
>>>>
>>>> Bug         : https://bugs.openjdk.java.net/browse/JDK-8075484
>>>>
>>>> webrev    : 
>>>> http://cr.openjdk.java.net/~vtewari/8075484/webrev0.0/index.html 
>>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.0/index.html>
>>>>
>>>> This issue is SocketInputStream.socketread0() hangs even with 
>>>> "soTimeout" set.the implementation of 
>>>> Java_java_net_SocketInputStream_socketRead0 assumes that read() 
>>>> won't block after poll() reports that a read is possible.
>>>>
>>>> This assumption does not hold, as noted on the man page for select 
>>>> (referenced by the man page for poll): Under Linux, select() may 
>>>> report a socket file descriptor as "ready for reading", while 
>>>> nevertheless a subsequent read blocks. This could for example 
>>>> happen when data has arrived but upon examination has wrong 
>>>> checksum and is discarded.
>>>>
>>>> Thanks,
>>>>
>>>> Vyom
>>>>
>>>>
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/net-dev/attachments/20160901/46eb4ad2/attachment-0001.html>


More information about the net-dev mailing list