non blocking RPC-code, found reproducable error
    Martin Blapp 
    mb at imp.ch
       
    Fri May 16 17:28:34 PDT 2003
    
    
  
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
    
    
More information about the freebsd-current
mailing list