Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Jul 2011 12:10:40 -0500
From:      Mark Felder <feld@feld.me>
To:        freebsd-ports@freebsd.org
Subject:   net/haproxy doesn't stop all processes
Message-ID:  <op.vyvlz2af34t2sn@tech304>

next in thread | raw e-mail | index | archive | help
Hi all,

I recently installed haproxy and I am in the process of configuring  
redundant load balancers and I discovered a bug in the haproxy shutdown  
sequence. For some reason the first PID in /var/run/haproxy is the only  
one that gets a kill signal when you shutdown. In order to reproduce this  
behavior you will have to increase the number of haproxy processes with  
the following setting:


nbproc          4 # Number of processes


I can get it to kill cleanly from the shell but when I modify the  
pre_stop() it still doesn't work. Any thoughts?


Current rc script for those who don't have it installed is below.

Regards,


Mark


#!/bin/sh

# PROVIDE: haproxy
# REQUIRE: DAEMON
# KEYWORD: shutdown

#######
#
# Add the following lines to /etc/rc.conf to enable haproxy:
#
# haproxy_enable (bool):        default: "NO"
#                               Set to "YES" to enable haproxy
# haproxy_pidfile (str):        default: /var/run/${name}.pid
#                               Set to the full path of the pid file
# haproxy_config (str):         default: /usr/local/etc/${name}.conf
#                               Set to the full path of the config file
# haproxy_flags (str):          default: Autogenerated using pidfile and  
config options
#                               Set to override with your own options
#
#######
#
# rc.d Script Runtime Options:
#
# start         - starts application normally
# stop          - (softstop) stops all proxies and exits once all sessions  
are closed
# forcestop     - (immediate) stops all proxies and kills active sessions
# reload        - hot-reconfig using "-sf" option (active sessions kept)
# forcereload   - hot-reconfig using "-st" option (active sessions killed)
# restart       - equiv to "stop" then "start"
# checkconfig   - checks configuration file defined in haproxy_config
#
#######

. /etc/rc.subr

name="haproxy"
rcvar=`set_rcvar`
command="/usr/local/sbin/haproxy"

# Load Configs/Set Defaults
load_rc_config $name
: ${haproxy_enable:="NO"}
: ${haproxy_config:="/usr/local/etc/${name}.conf"}
: ${haproxy_pidfile:="/var/run/${name}.pid"}
: ${haproxy_flags="-q -f ${haproxy_config} -p ${haproxy_pidfile}"}

# Update the globals
pidfile=${haproxy_pidfile}
required_files=${haproxy_config}

# Commands: start, stop, restart, reload, checkconfig
extra_commands="reload checkconfig"

checkconfig_cmd="haproxy_checkconfig"
reload_cmd="haproxy_reload"

haproxy_reload()
{
         # Check configuration file quietly first
         ${command} -q -c -f ${haproxy_config}
         if [ $? -ne 0 ]; then
                 echo "Error found in ${haproxy_config} - not reloading  
current process!"
                 return
         fi
         rc_pid=$(check_pidfile ${haproxy_pidfile} ${command})
         if [ $rc_pid ]; then
                 if [ $rc_force ]; then
                         ${command} ${haproxy_flags} -st ${rc_pid}
                 else
                         ${command} ${haproxy_flags} -sf ${rc_pid}
                 fi
         else
                 echo "No process found.  Maybe $command isn't running?"
         fi
}

haproxy_checkconfig()
{
         ${command} -c -f ${haproxy_config}
}

haproxy_prestart()
{
         ${command} -q -c -f ${haproxy_config}
         rc_flags=${haproxy_flags}
}

haproxy_prestop()
{
         # SIGUSR1 = softstop, SIGTERM = faststop
         if [ $rc_force ]; then
                 sig_stop="SIGTERM"
         else
                 sig_stop="SIGUSR1"
         fi
}


run_rc_command "$1"



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