+1

From: net-dev [mailto:net-dev-boun...@openjdk.java.net] On Behalf Of Mark 
Sheppard
Sent: Donnerstag, 1. September 2016 19:51
To: Vyom Tewari <vyom.tew...@oracle.com>; net-dev@openjdk.java.net
Subject: Re: RFR 8075484:SocketInputStream.socketRead0 can hang even with 
soTimeout set

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>
 
<http://cr.openjdk.java.net/%7Evtewari/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





Reply via email to