Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Sep 2005 20:03:14 +0930 (CST)
From:      Jarrod Sayers <jarrod@netleader.com.au>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/86402: [patch] Correction to prevent multiple stops's and starts's when calling restart on www/apache2 when using apache2_profiles
Message-ID:  <200509211033.j8LAXEZq080515@manhattan.netleader.com.au>
Resent-Message-ID: <200509211040.j8LAe1rA098693@freefall.freebsd.org>

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

>Number:         86402
>Category:       ports
>Synopsis:       [patch] Correction to prevent multiple stops's and starts's when calling restart on www/apache2 when using apache2_profiles
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 21 10:40:01 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Jarrod Sayers
>Release:        FreeBSD 4.11-RELEASE-p11 i386
>Organization:
>Environment:
System: FreeBSD manhattan.netleader.com.au 4.11-RELEASE-p11 FreeBSD 4.11-RELEASE-p11 #21: Sun Jul 3 15:43:12 CST 2005 root@manhattan.netleader.com.au:/usr/obj/usr/src/sys/MANHATTAN i386

Port: www/apache2
  $FreeBSD: ports/www/apache2/Makefile,v 1.226 2005/09/07 20:31:11 clement Exp $
  $FreeBSD: ports/www/apache2/files/apache.sh,v 1.14 2005/09/05 15:07:49 clement Exp $

>Description:
When www/apache2 is configured to use profiles, multiple start's and stop's are
called when the restart directive is issued.  When a large number of profiles
are used, *every* profile is started and stoped for each profile, instead of
each profile individually, i.e., when 5 profiles are configured, each profile
restarts 5 times.

When issuing a reload (a simple signal sent by rc.subr), each profile reloads,
just once:

manhattan# /usr/local/etc/rc.d/apache2.sh reload
===> apache2 profile: httpd171
Reloading apache2 config files.
Performing sanity check on apache2 configuration:
Syntax OK
===> apache2 profile: httpd171old
Reloading apache2 config files.
Performing sanity check on apache2 configuration:
Syntax OK
===> apache2 profile: httpd172
Reloading apache2 config files.
Performing sanity check on apache2 configuration:
Syntax OK
manhattan# 

Yet on a restart ($0 start, $0 stop sent by rc.subr), the apache.sh script calls
itself again for each profile (just ignore the fact that httpd171 was stopped
when I called it last):

manhattan# /usr/local/etc/rc.d/apache2.sh restart
===> apache2 profile: httpd171
Performing sanity check on apache2 configuration:
Syntax OK
===> apache2 profile: httpd171
apache2 not running? (check /var/run/httpd.httpd171.pid).
===> apache2 profile: httpd171old
Stopping apache2.
Waiting for PIDS: 78303.
===> apache2 profile: httpd172
Stopping apache2.
Waiting for PIDS: 78310.
===> apache2 profile: httpd171
Starting apache2.
===> apache2 profile: httpd171old
Starting apache2.
===> apache2 profile: httpd172
Starting apache2.
===> apache2 profile: httpd171old
Performing sanity check on apache2 configuration:
Syntax OK
===> apache2 profile: httpd171
Stopping apache2.
Waiting for PIDS: 78417.
===> apache2 profile: httpd171old
Stopping apache2.
Waiting for PIDS: 78429.
===> apache2 profile: httpd172
Stopping apache2.
Waiting for PIDS: 78436.
===> apache2 profile: httpd171
Starting apache2.
===> apache2 profile: httpd171old
Starting apache2.
===> apache2 profile: httpd172
Starting apache2.
===> apache2 profile: httpd172
Performing sanity check on apache2 configuration:
Syntax OK
===> apache2 profile: httpd171
Stopping apache2.
Waiting for PIDS: 78494.
===> apache2 profile: httpd171old
Stopping apache2.
Waiting for PIDS: 78506.
===> apache2 profile: httpd172
Stopping apache2.
Waiting for PIDS: 78518.
===> apache2 profile: httpd171
Starting apache2.
===> apache2 profile: httpd171old
Starting apache2.
===> apache2 profile: httpd172
Starting apache2.
manhattan# logout

Or the 'set -x' version:

# /usr/local/etc/rc.d/apache2.sh restart 2>&1 | grep apache2.sh
+ /usr/local/etc/rc.d/apache2.sh restart httpd171

You can see by the next line, that rc.subr has called 'stop' and is not
aware that there was a profile attached to the restart line above, so
apache.sh proceedes to stop everything.

+ /usr/local/etc/rc.d/apache2.sh stop
+ /usr/local/etc/rc.d/apache2.sh stop httpd171
+ /usr/local/etc/rc.d/apache2.sh stop httpd171old
+ /usr/local/etc/rc.d/apache2.sh stop httpd172
+ /usr/local/etc/rc.d/apache2.sh start
+ /usr/local/etc/rc.d/apache2.sh start httpd171
+ /usr/local/etc/rc.d/apache2.sh start httpd171old
+ /usr/local/etc/rc.d/apache2.sh start httpd172

So, apache.sh, thinking its just restarted the first profile, goes away
to restart the next one.

+ /usr/local/etc/rc.d/apache2.sh restart httpd171old
+ /usr/local/etc/rc.d/apache2.sh stop
+ /usr/local/etc/rc.d/apache2.sh stop httpd171
+ /usr/local/etc/rc.d/apache2.sh stop httpd171old
+ /usr/local/etc/rc.d/apache2.sh stop httpd172
+ /usr/local/etc/rc.d/apache2.sh start
+ /usr/local/etc/rc.d/apache2.sh start httpd171
+ /usr/local/etc/rc.d/apache2.sh start httpd171old
+ /usr/local/etc/rc.d/apache2.sh start httpd172

Whee....

+ /usr/local/etc/rc.d/apache2.sh restart httpd172
+ /usr/local/etc/rc.d/apache2.sh stop
+ /usr/local/etc/rc.d/apache2.sh stop httpd171
+ /usr/local/etc/rc.d/apache2.sh stop httpd171old
+ /usr/local/etc/rc.d/apache2.sh stop httpd172
+ /usr/local/etc/rc.d/apache2.sh start
+ /usr/local/etc/rc.d/apache2.sh start httpd171
+ /usr/local/etc/rc.d/apache2.sh start httpd171old
+ /usr/local/etc/rc.d/apache2.sh start httpd172
# 

>How-To-Repeat:
Install www/apache2 from ports:

manhattan# cd /usr/ports/www/apache2
manhattan# make install clean

Add lines to /etc/rc.conf to enable apache2 profiles (filenames are fake):

apache2_enable="YES"
apache2_profiles="httpd1 httpd2 httpd3"
apache2_httpd1_configfile="/usr/local/etc/apache2/httpd1.conf"
apache2_httpd2_configfile="/usr/local/etc/apache2/httpd2.conf"
apache2_httpd3_configfile="/usr/local/etc/apache2/httpd3.conf"

Run:

manhattan# /usr/local/etc/rc.d/apache2.sh restart

>Fix:
Don't rerun the apache2.sh rc script on restart's, just stop and start normally:

--- www/apache2/files/apache.sh.orig	Sat Sep 10 09:31:50 2005
+++ www/apache2/files/apache.sh	Wed Sep 21 19:56:01 2005
@@ -67,7 +67,7 @@
 		echo "$0: extra argument ignored"
 	fi
 else
-	if [ "x${apache2_profiles}" != "x" ]; then
+	if [ "x${apache2_profiles}" != "x" -a "x${1}" != "xrestart" ]; then
 	for profile in ${apache2_profiles}; do
 		echo "===> apache2 profile: ${profile}"
 		$0 $1 $profile
>Release-Note:
>Audit-Trail:
>Unformatted:



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