Hi Vyom,

I'll do an AIX build with your patch and let you know later today.

Best regards
Christoph

> -----Original Message-----
> From: net-dev [mailto:net-dev-boun...@openjdk.java.net] On Behalf Of Vyom
> Tewari
> Sent: Mittwoch, 7. September 2016 08:46
> To: Chris Hegarty <chris.hega...@oracle.com>
> Cc: net-dev@openjdk.java.net
> Subject: Re: RFR 8075484:SocketInputStream.socketRead0 can hang even with
> soTimeout set
> 
> Hi Chris,
> 
> Please find the latest
> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.3/index.html
> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.3/index.html>). I
> did some code refactoring, JPRT is in progress.
> 
> I need help from some one to build and test latest changes on AIX, may
> be Christoph can help.
> 
> Thanks,
> 
> Vyom
> 
> 
> On Tuesday 06 September 2016 06:25 PM, Chris Hegarty wrote:
> > Vyom,
> >
> >> On 6 Sep 2016, at 10:20, Vyom Tewari <vyom.tew...@oracle.com> wrote:
> >>
> >> Hi,
> >>
> >> Please find the latest
> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.2/index.html
> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.2/index.html>). I
> have incorporated the review comments.
> > Your changes completely avoid NET_Timeout, which is quite complex on
> > Linux, Mac, and AIX, for various reasons. ( NET_Timeout will use the
> > async close mechanism to signal/interrupt a thread blocked in a poll /
> > select ). Also, select is used on Mac, which will use poll after your
> > changes ( I do remember that there was a bug in poll on Mac around
> > the time of the original Mac port ).
> >
> > Would is be better, rather than replicating the logic in  NET_Timeout,
> > to have a version that supports passing a function pointer, to run if
> > the poll/select returns before the timeout? Just an idea.
> >
> > -Chris.
> >
> >> Thanks,
> >>
> >> Vyom
> >>
> >>
> >> On Monday 05 September 2016 08:37 PM, Chris Hegarty wrote:
> >>> On 05/09/16 15:37, Mark Sheppard wrote:
> >>>> if the desire is to avoid making double calls on gettimeofday in the
> >>>> NET_ReadWithTimeout's while loop for its main call flow,
> >>> Yes, the desire is to make no more calls to gettimeofday, than are
> >>> already done.
> >>>
> >>>> then consider a modification to NET_Timeout and create a version
> >>>> int NET_TimeoutWithCurrentTime(int s, long timeout, stuct timeval *
> >>>> current_time)
> >>>>
> >>>> int NET_TimeoutWithCurrentTime(int s, long timeout, stuct timeval *
> >>>> current_time) {
> >>>>     int result;
> >>>>     struct timeval t;
> >>>>     long prevtime, newtime;
> >>>>     struct pollfd pfd;
> >>>>     pfd.fd = s;
> >>>>     pfd.events = POLLIN;
> >>>>
> >>>>     if (timeout > 0) {
> >>>>         prevtime = (current_time->tv_sec * 1000)  +
> >>>> current_time->tv_usec / 1000;
> >>>>     }
> >>>>
> >>>>     for(;;) {
> >>>>         result = poll(&pfd, 1, timeout);
> >>>>         if (result < 0 && errno == EINTR) {
> >>>>             if (timeout > 0) {
> >>>>                 gettimeofday(&t, NULL);
> >>>>                 newtime = (t.tv_sec * 1000)  +  t.tv_usec /1000;
> >>>>                 timeout -= newtime - prevtime;
> >>>>                 if (timeout <= 0)
> >>>>                     return 0;
> >>>>                 prevtime = newtime;
> >>>>             }
> >>>>         } else {
> >>>>             return result;
> >>>>         }
> >>>>     }
> >>>> }
> >>>>
> >>>> the NET_ReadWithTimeout is modified with.
> >>>>
> >>>>    while (timeout > 0) {
> >>>>         result = NET_TimeoutWithCurrentTime(fd, timeout, &t);
> >>>>
> >>>> in any case there is the potential for multiple invocation of
> >>>> gettimeofday due to a need to make
> >>>> poll restartable,
> >>> Yes, and that is fine. Just no more than is already there.
> >>>
> >>> and adjust the originally specified timeout
> >>>> accordingly, and for the edge case
> >>>> after the non blocking read.
> >>> After an initial skim, your suggestion seems reasonable.
> >>>
> >>> -Chris.
> >>>
> >>>> regards
> >>>> Mark
> >>>>
> >>>>
> >>>>
> >>>> On 05/09/2016 12:02, Chris Hegarty wrote:
> >>>>> Vyom,
> >>>>>
> >>>>>
> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.1/index.html
> >>>>>
> >>>>> There is some concern about the potential performance effect, etc,
> >>>>> of gettimeofday, maybe there is a way out of this. The reuse of
> >>>>> NET_Timeout is good, but it also calls gettimeofday. It seems that
> >>>>> a specific NET_ReadWithTimeout could be written to NOT reuse
> >>>>> NET_Timeout, but effectively inline its interruptible operation.
> >>>>> Or write a variant of NET_Timeout that takes a function to
> >>>>> execute. Rather than effectively two loops conditioned on the
> >>>>> timeout.  Disclaimer: I have not actually tried to do this, but
> >>>>> it seems worth considering / evaluating.
> >>>>>
> >>>>> -Chris.
> >>>>>
> >>>>> On 02/09/16 04:39, Vyom Tewari wrote:
> >>>>>> hi Dimitry,
> >>>>>>
> >>>>>> thanks for review, I did consider to use  a monotonically increasing
> >>>>>> clock like "clock_gettime" but  existing nearby code("NET_Timeout")
> uses
> >>>>>> "gettimeofday"  so i choose to be consistent with the existing code.
> >>>>>>
> >>>>>> Thanks,
> >>>>>>
> >>>>>> Vyom
> >>>>>>
> >>>>>>
> >>>>>> On Friday 02 September 2016 01:38 AM, Dmitry Samersoff wrote:
> >>>>>>> Vyom,
> >>>>>>>
> >>>>>>> Did you consider to use select() to calculate timeout instead of
> >>>>>>> gettimeofday ?
> >>>>>>>
> >>>>>>> gettimeofday is affected by system time changes, so running ntpd can
> >>>>>>> cause unpredictable behavior of this code. Also it's rather expensive
> >>>>>>> syscall.
> >>>>>>>
> >>>>>>> -Dmitry
> >>>>>>>
> >>>>>>> On 2016-09-01 19: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
> >>>>>>>>>>>
> >>>>>>>>>>>

Reply via email to