Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 May 2003 02:28:30 +0200 (CEST)
From:      Martin Blapp <mb@imp.ch>
To:        fvdl@netbsd.org
Cc:        current@freebsd.org
Subject:   Re: non blocking RPC-code, found reproducable error
Message-ID:  <20030517015411.L1023@cvs.imp.ch>
In-Reply-To: <20030515020716.Q47986@cvs.imp.ch>
References:  <20030515011311.M47986@cvs.imp.ch> <20030515020716.Q47986@cvs.imp.ch>

next in thread | previous in thread | raw e-mail | index | archive | help

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030517015411.L1023>