Subject: Re: Proposed rc.d changes....
To: None <tech-userlevel@netbsd.org>
From: Luke Mewburn <lukem@wasabisystems.com>
List: tech-userlevel
Date: 02/23/2001 11:18:01
On Tue, Feb 20, 2001 at 07:12:48PM +1100, Luke Mewburn wrote:
> On Tue, Feb 20, 2001 at 02:36:04PM +1100, Luke Mewburn wrote:
> > I've been meaning to ask for testing from users with much slower
> > machines than my laptop (a PIII-700), because I didn't notice any
> > difference with my laptop with the patch.
> > 
> > Any takers? (Or should I just post it here and have people post their
> > before & after results? :)
> 
> here's a work in progress. use at your own risk, etc ...
> 
> i'd be interested in the difference between:
> 
> 	(a) the system as it stands now.
> 
> 	(b) the following patch without rc_fast_and_loose set
> 	    (it only loads rc.conf once, and has other speedups)
> 
> 	(c) the following patch WITH rc_fast_and_loose set.
> 
> the patch adds a call to `date' at the start of /etc/rc, so that could
> be added to your /etc/rc before test (a) so you have an idea on when
> it starts (date is already run at the end).

So, I posted the patches a couple of days ago, and I haven't received
any feedback yet.

Does it take *that* long to reboot the slow boxen?


Luke.

> 
> enjoy,
> luke.
> 
> Index: rc
> ===================================================================
> RCS file: /cvsroot/basesrc/etc/rc,v
> retrieving revision 1.154
> diff -p -r1.154 rc
> *** rc	2000/12/15 00:00:09	1.154
> --- rc	2001/02/20 08:06:28
> *************** export PATH=/sbin:/bin:/usr/sbin:/usr/bi
> *** 14,20 ****
> --- 14,29 ----
>   
>   . /etc/rc.subr
>   . /etc/rc.conf
> + _rc_conf_loaded=YES
>   
> + #	Uncomment the following to execute each /etc/rc.d script in
> + #	the current shell rather than in a subshell.  This may be
> + #	faster on slow machines.
> + #	CAUTION: USE THIS AT YOUR OWN RISK; A BAD SCRIPT MAY
> + #	INADVERTENTLY PREVENT BOOT TO MULTIUSER.
> + #
> + #rc_fast_and_loose=YES
> + 
>   if ! checkyesno rc_configured; then
>   	echo "/etc/rc.conf is not configured.  Multiuser boot aborted."
>   	exit 1
> *************** trap : 2
> *** 34,42 ****
>   trap "echo 'Boot interrupted.'; exit 1" 3
>   
>   files=`rcorder -s nostart /etc/rc.d/*`
>   
> ! for i in $files; do
> ! 	run_rc_script $i start
>   done
>   
>   date
> --- 43,53 ----
>   trap "echo 'Boot interrupted.'; exit 1" 3
>   
>   files=`rcorder -s nostart /etc/rc.d/*`
> + 
> + date
>   
> ! for _rc_elem in $files; do
> ! 	run_rc_script $_rc_elem start
>   done
>   
>   date
> Index: rc.subr
> ===================================================================
> RCS file: /cvsroot/basesrc/etc/rc.subr,v
> retrieving revision 1.29
> diff -p -r1.29 rc.subr
> *** rc.subr	2000/11/17 03:47:43	1.29
> --- rc.subr	2001/02/20 08:06:29
> *************** check_pidfile()
> *** 117,132 ****
>   	fi
>   	_procnamebn=${_procname##*/}
>   	ps -p $_pid -o 'pid,command' | while read _npid _arg0 _argv; do
> ! 		if [ "$_npid" = "PID" ]; then
> ! 			continue
> ! 		fi
> ! 		if [   "$_arg0" = "$_procname" \
> ! 		    -o "$_arg0" = "$_procnamebn" \
> ! 		    -o "$_arg0" = "${_procnamebn}:" \
> ! 		    -o "$_arg0" = "(${_procnamebn})" ]; then
>   			echo $_npid
>   			return
> ! 		fi
>   	done
>   }
>   
> --- 117,132 ----
>   	fi
>   	_procnamebn=${_procname##*/}
>   	ps -p $_pid -o 'pid,command' | while read _npid _arg0 _argv; do
> ! 		case "$_npid" in
> ! 		    PID)
> ! 			continue ;;
> ! 		esac
> ! 		case "$_arg0" in
> ! 		    $_procname|$_procnamebn|${_procnamebn}:|"(${_procnamebn})")
>   			echo $_npid
>   			return
> ! 			;;
> ! 		esac
>   	done
>   }
>   
> *************** check_process()
> *** 144,159 ****
>   	_procnamebn=${_procname##*/}
>   	_pref=
>   	ps -ax -o 'pid,command' | while read _npid _arg0 _argv; do
> ! 		if [ "$_npid" = "PID" ]; then
> ! 			continue
> ! 		fi
> ! 		if [   "$_arg0" = "$_procname" \
> ! 		    -o "$_arg0" = "$_procnamebn" \
> ! 		    -o "$_arg0" = "${_procnamebn}:" \
> ! 		    -o "$_arg0" = "(${_procnamebn})" ]; then
>   			echo -n "$_pref$_npid"
>   			_pref=" "
> ! 		fi
>   	done
>   }
>   
> --- 144,159 ----
>   	_procnamebn=${_procname##*/}
>   	_pref=
>   	ps -ax -o 'pid,command' | while read _npid _arg0 _argv; do
> ! 		case "$_npid" in
> ! 		    PID)
> ! 			continue ;;
> ! 		esac
> ! 		case "$_arg0" in
> ! 		    $_procname|$_procnamebn|${_procnamebn}:|"(${_procnamebn})")
>   			echo -n "$_pref$_npid"
>   			_pref=" "
> ! 			;;
> ! 		esac
>   	done
>   }
>   
> *************** run_rc_command()
> *** 256,262 ****
>   {
>   	_arg=$1
>   	if [ -z "$name" ]; then
> ! 		err 3 '$name is not set.'
>   	fi
>   
>   	case "$_arg" in
> --- 256,262 ----
>   {
>   	_arg=$1
>   	if [ -z "$name" ]; then
> ! 		err 3 'run_rc_command: $name is not set.'
>   	fi
>   
>   	case "$_arg" in
> *************** run_rc_command()
> *** 297,314 ****
>   	else
>   		eval _flags=\$${name}_flags
>   	fi
> ! 	eval _chdir=\$${name}_chdir
> ! 	eval _chroot=\$${name}_chroot
> ! 	eval _nice=\$${name}_nice
> ! 	eval _user=\$${name}_user
> ! 	eval _group=\$${name}_group
> ! 	eval _groups=\$${name}_groups
>   
>   					# if ${rcvar} is set, and $1 is not
>   					# "rcvar" or "status", then run
>   					#	checkyesno ${rcvar}
>   					# and return if that failed
>   					#
>   	if [ -n "${rcvar}" -a "$_arg" != "rcvar" -a "$_arg" != "status" ]; then
>   		if ! checkyesno ${rcvar}; then
>   			return 0
> --- 297,312 ----
>   	else
>   		eval _flags=\$${name}_flags
>   	fi
> ! 	eval _chdir=\$${name}_chdir	_chroot=\$${name}_chroot \
> ! 	    _nice=\$${name}_nice	_user=\$${name}_user \
> ! 	    _group=\$${name}_group	_groups=\$${name}_groups
>   
>   					# if ${rcvar} is set, and $1 is not
>   					# "rcvar" or "status", then run
>   					#	checkyesno ${rcvar}
>   					# and return if that failed
>   					#
> + 	# XXXX use case?
>   	if [ -n "${rcvar}" -a "$_arg" != "rcvar" -a "$_arg" != "status" ]; then
>   		if ! checkyesno ${rcvar}; then
>   			return 0
> *************** run_rc_command()
> *** 325,332 ****
>   					# if there's a custom ${XXX_cmd},
>   					# run that instead of the default
>   					#
> ! 		eval _cmd=\$${_arg}_cmd
> ! 		eval _precmd=\$${_arg}_precmd
>   		if [ -n "$_cmd" ]; then
>   					# if the precmd failed and force
>   					# isn't set, exit
> --- 323,329 ----
>   					# if there's a custom ${XXX_cmd},
>   					# run that instead of the default
>   					#
> ! 		eval _cmd=\$${_arg}_cmd _precmd=\$${_arg}_precmd
>   		if [ -n "$_cmd" ]; then
>   					# if the precmd failed and force
>   					# isn't set, exit
> *************** run_rc_script()
> *** 515,528 ****
>   		err 3 'USAGE: run_rc_script file arg'
>   	fi
>   
> ! 	case "$_file" in
> ! 	*.sh)				# run in current shell
>   		set $_arg ; . $_file
> ! 		;;
> ! 	*)				# run in subshell
> ! 		( set $_arg ; . $_file )
> ! 		;;
> ! 	esac
>   }
>   
>   #
> --- 512,532 ----
>   		err 3 'USAGE: run_rc_script file arg'
>   	fi
>   
> ! 	if [ -n "$rc_fast_and_loose" ]; then
> ! 		unset name command command_args extra_commands pidfile rcvar
> ! 		unset required_dirs required_files required_vars
> ! 		eval unset ${_arg}_cmd ${_arg}_precmd
>   		set $_arg ; . $_file
> ! 	else
> ! 		case "$_file" in
> ! 		*.sh)				# run in current shell
> ! 			set $_arg ; . $_file
> ! 			;;
> ! 		*)				# run in subshell
> ! 			( set $_arg ; . $_file )
> ! 			;;
> ! 		esac
> ! 	fi
>   }
>   
>   #
> *************** load_rc_config()
> *** 536,542 ****
>   		err 3 'USAGE: load_rc_config command'
>   	fi
>   
> ! 	. /etc/rc.conf
>   	if [ -f /etc/rc.conf.d/"$_command" ]; then
>   		. /etc/rc.conf.d/"$_command"
>   	fi
> --- 540,549 ----
>   		err 3 'USAGE: load_rc_config command'
>   	fi
>   
> ! 	if [ -z "$_rc_conf_loaded" ]; then
> ! 		. /etc/rc.conf
> ! 		_rc_conf_loaded=YES
> ! 	fi
>   	if [ -f /etc/rc.conf.d/"$_command" ]; then
>   		. /etc/rc.conf.d/"$_command"
>   	fi

-- 
Luke Mewburn  <lukem@wasabisystems.com>  http://www.wasabisystems.com
Luke Mewburn     <lukem@netbsd.org>      http://www.netbsd.org
Wasabi Systems - providing NetBSD sales, support and service.