Re: non blocking RPC-code, found reproducable error

From: Martin Blapp <mb_at_imp.ch>
Date: Sat, 17 May 2003 02:28:30 +0200 (CEST)
Hi

I got a bit futher. It seams that the serializing is broken
somewhat. If the reads on the server side are like:

read() = -1, errorno=EAGAIN (svc_vc.c line 511)
read() = 88, (svc_vc.c line 511)
read() = 4, (svc_vc.c line 511)

it works as it should.

And here it doesn't work.

read() = 88, (svc_vc.c line 511)
read() = 4, (svc_vc.c line 511)
read() = -1, errorno=EAGAIN (svc_vc.c line 511)

The last read happens because svc_vc_stat returns
XPRT_MOREREQS. I'm still investigating why this happens.
Maybe the calculation is still wrong somewhere in xdrrec ?

The tcpdump looks normal, as expected since mountd fails
while reading data, not replying.

In __xdrrec_getrec() rstrm->in_received == rstrm->in_received
In __xdrrec_getrec() rstrm->in_received == 88
In __xdrrec_getrec() rstrm->last_frag == 1
In __xdrrec_getrec() == TRUE (xdr_rec.c line 645)
xdrrec_eof() == FALSE (xdr_rec.c line 517)
svc_vc_stat() == XPRT_MOREREQS

I've found that we missed in svc_vc_recv() a xdrrec_skiprecord after
XDR_DECODE, but that didn't change the behaviour for
this bug.

        if (cd->nonblock) {
                cd->strm_stat = XPRT_IDLE;
                if (!__xdrrec_getrec(xdrs, &cd->strm_stat, TRUE)) {
                        return FALSE;
                }
        }

        xdrs->x_op = XDR_DECODE;
+        (void)xdrrec_skiprecord(xdrs);


Martin
Received on Fri May 16 2003 - 15:28:34 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:08 UTC