> The ypserv bug (the one where ypserv randomly stops responding or
> just seg-faults) is still very much alive.  I had to restart it
> about 11 times in the course of 20 minutes this morning.  That's
> the bad news, the good news is that I started it each time with
> 'ktrace -i'.
>
> Also, in the last 200 lines of kdump output for each and every crash there
> is the sequence of calls "select();  gettimeofday();"... that sequence of
> calls never appears in the ypserv source code, but does appear in
svc_tcp.c
> in librpc... my question is: "ypserv defines its own svc_run, and for
> TCP connections specifically handles things itself very carefully, how is
> the svc_tcp.c code getting called at all?"  I think the answer to that is
> the source of the problem (it should also be noted that in the case where
> ypserv hasn't died and I have collected ktrace information -- up to 8 gig
> of it -- the "select(); gettimeofday();" sequence is _never_ called.)

I have virtually no experience with RPC or YP/NIS, but I can trace code.
Here's what I found:

Case #1

usr.sbin/ypserv/ypserv.c : main() calls svctcp_create()
lib/libc/rpc/svc_tcp.c : svctcp_create() returns an SVCXPRT with a reference
to an initialized rendezvous handler

That in itself seems fine, but a rendezvous_request() op on the rendezvous
handler can trigger the problem:

lib/libc/rpc/svc_tcp.c : rendezvous_request() calls makefd_xprt()
lib/libc/rpc/svc_tcp.c : makefd_xprt() calls xdrrec_create() with a pointer
to readtcp()
lib/libc/rpc/svc_tcp.c : readtcp() calls select(), gettimeofday()

Case #2

usr.sbin/ypserv/ypserv.c : main() calls svc_register()
lib/libc/rpc/svc_tcp.c : svc_register() calls pmap_set()
lib/libc/rpc/pmap_clnt.c: pmap_set() *may* call clnt_create()
lib/libc/rpc/clnt_generic.c : clnt_create() calls clnttcp_create()
lib/libc/rpc/svc_tcp.c : clnttcp_create() calls readtcp()
lib/libc/rpc/svc_tcp.c : readtcp() calls select(), gettimeofday()

In answer to your question about "how is the svc_tcp.c code getting called
at all?":

In case #1, it's getting called when main() starts up and creates the
initial TCP listener.
In case #2, it's getting called when main() registers the services.

Hopefully this will aid you (and others) in tracking down this problem.

--
Matt Emmerton


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to