Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Jun 1998 23:14:29 -0700 (PDT)
From:      Dmitry Kohmanyuk <dk@dog.farm.org>
To:        barry@lustig.com
Cc:        freebsd-hackers@FreeBSD.ORG, serge@yahoo.com
Subject:   Re: Code Logic Question in 2.2 RELENG
Message-ID:  <199806040614.XAA11387@dog.farm.org>

next in thread | raw e-mail | index | archive | help
In article <19980603171959.17140.qmail@devious.lustig.com> you wrote:
>   Does it make sense to have portmap fail when svc_run returns or would it  
> make more sense to try and recover and restart the loop?  I've had portmap  
> abort a few times now, and the only easy remedy is a reboot of the machine.   
> If I try and restart portmap, I have to find all of the programs that  
> registered with it and restart them.  Any suggestions?  By the way, this is  
> from RELENG_2_2 cvsupped yesterday.

> This is from portmap.c:

>         /* additional initializations */
>         check_startup();
>         (void)signal(SIGCHLD, reap);
>         svc_run();
>         syslog(LOG_ERR, "svc_run returned unexpectedly");
>         abort();

this bites me from time to time... see end of this message for workaround...

> This is from svc_run.c in libc:
> void
> svc_run()
> {
> #ifdef FD_SETSIZE
>         fd_set readfds;
> #else
>       int readfds;
> #endif /* def FD_SETSIZE */

>         for (;;) {
> #ifdef FD_SETSIZE
>                 readfds = svc_fdset;
> #else
>                 readfds = svc_fds;
> #endif /* def FD_SETSIZE */
>                 switch (select(_rpc_dtablesize(), &readfds, NULL, NULL,
>                                (struct timeval *)0)) {
>                 case -1:
>                         if (errno == EINTR) {
>                                 continue;
>                         }
>                         perror("svc_run: - select failed");
>                         return;
>                 case 0:
>                         continue;
>                 default:
>                         svc_getreqset(&readfds);
>                 }
>         }
> }

what bothers me here is how come that select() returns -1 and yet
errno != EINTR.  According to man page, it should be then one of
EBADF or EINVAL, none of which can occur...

here is a promised workaround, running on production NIS server,
run from crontab every few minutes.  With it, FreeBSD proves
itself as a very stable operating system:

; cat rpc.restart
#!/bin/sh
#
# RPC services restart script

# If there is a global system configuration file, suck it in.
if [ -f /etc/sysconfig ]; then
	. /etc/sysconfig
fi

rpcinfo -p >/dev/null && exit 0


echo -n restarting RPC daemons:

# Portmapper should always be run, to provide RPC services for inetd.
if [ -x /usr/sbin/portmap ]; then
	killall -9 portmap
	sleep 1			# looks like it helps
	echo -n ' portmap';		portmap
fi


# Start ypserv if we're an NIS server.
# Run rpc.ypxfrd and rpc.yppasswdd only on the NIS master server.
if [ "X${nis_serverflags}" != X"NO" ]; then
	killall -9 ypserv
	sleep 1			# looks like it helps
	echo -n ' ypserv'; ypserv ${nis_serverflags}

	killall -9 rpc.ypxfrd
	sleep 1			# looks like it helps
	if [ "X${ypxfrdflags}" != X"NO" ]; then
		echo -n ' rpc.ypxfrd'; rpc.ypxfrd ${ypxfrdflags}
	fi

	killall -9 rpc.yppasswdd
	sleep 1			# looks like it helps
	if [ "X${yppasswddflags}" != X"NO" ]; then
		echo -n ' rpc.yppasswdd'; rpc.yppasswdd ${yppasswddflags}
	fi
fi

# Start ypbind if we're an NIS client
if [ "X${nis_clientflags}" != X"NO" ]; then
	killall -9 ypbind
	sleep 1			# looks like it helps
	echo -n ' ypbind'; ypbind ${nis_clientflags}
	if [ "X${nis_ypsetflags}" != X"NO" ]; then
		echo -n ' ypset'; ypset ${nis_ypsetflags}
	fi
fi

echo ""
exit 1	# make it mail about this

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



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