From: Francesco Riosa Date: Sat, 19 Nov 2005 03:58:41 +0000 (+0000) Subject: new slotted enabled start scripts, see ChangeLog X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=ea82b6ced0c552647df17f3f9e8625f79cacd8e0;p=gentoo.git new slotted enabled start scripts, see ChangeLog Package-Manager: portage-2.0.53_rc6 --- diff --git a/dev-db/mysql/ChangeLog b/dev-db/mysql/ChangeLog index 89fa8c54ce68..15f4ea41d24c 100644 --- a/dev-db/mysql/ChangeLog +++ b/dev-db/mysql/ChangeLog @@ -1,6 +1,21 @@ # ChangeLog for dev-db/mysql # Copyright 2002-2005 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/dev-db/mysql/ChangeLog,v 1.260 2005/11/06 16:26:17 weeve Exp $ +# $Header: /var/cvsroot/gentoo-x86/dev-db/mysql/ChangeLog,v 1.261 2005/11/19 03:58:40 vivo Exp $ + + 19 Nov 2005; Francesco Riosa +files/mysql-slot.conf.d, + +files/mysql-slot.rc6: + These two are born for slotted MySQL, however they work as is on normal MySQL + installations too. (require my_print_defaults) + Features added or changed + - Not using mysqld_safe anymore + - preparsing of my.cnf file, all options outed at startup + - (possible to) override my.cnf option from conf.d/mysql + - Start multiple server with different config files + - using new svc "--nicelevel" option, nice level may be specified on per + server basis + - stronger error handling + - some new warnings + - slotted mysql management 06 Nov 2005; Jason Wever mysql-5.0.15.ebuild: Added ~sparc keyword. diff --git a/dev-db/mysql/Manifest b/dev-db/mysql/Manifest index 5cc4cd7d6fe1..3421b37deaa2 100644 --- a/dev-db/mysql/Manifest +++ b/dev-db/mysql/Manifest @@ -1,4 +1,4 @@ -MD5 0bade6da4b2160d0db24b66ddb837b7b ChangeLog 47847 +MD5 f33439a3872a7e188fbb94a4b79b5e4a ChangeLog 48482 MD5 c6fcd70c34bed04e59808ec71c5bedfb files/digest-mysql-3.23.58-r1 140 MD5 0feb3b501c47708ea13707c8e4cdde9c files/digest-mysql-4.0.25-r2 139 MD5 201c8b31cd9eb58eec712e37d6f0c328 files/digest-mysql-4.0.26 139 @@ -17,6 +17,8 @@ MD5 277705080f05b5b98b815487e080e562 files/my.cnf-4.1 4068 MD5 625b4007f035e3da9a4f1eeee1db6b9c files/mysql-4.0.15.rc6 1187 MD5 d0fbdf4e41f2b52210eef6cb3a53e128 files/mysql-4.0.24-r1.rc6 1662 MD5 08f1246e8107e4140378d429ff9773af files/mysql-4.0.24-r2.rc6 2123 +MD5 c8a9f17eb53cb46bd7ec6b3105cd8d23 files/mysql-slot.conf.d 3218 +MD5 2c8118a63df495f28f99857bd43fb86e files/mysql-slot.rc6 7484 MD5 73be6460f548f6f73c70246a4cfd13a0 files/mysql.init 886 MD5 a2a9fdc7d010a7c04c96cb3b7c05f06b metadata.xml 158 MD5 eb11a08abb447b7a69b192a6f9be3dbf mysql-3.23.58-r1.ebuild 7219 diff --git a/dev-db/mysql/files/mysql-slot.conf.d b/dev-db/mysql/files/mysql-slot.conf.d new file mode 100644 index 000000000000..16b582454bd9 --- /dev/null +++ b/dev-db/mysql/files/mysql-slot.conf.d @@ -0,0 +1,69 @@ +# here is where to define which server start. +#> Additional parameters to be passed to mysqld at startup may be added here, +#> these one will override the ones in "my.cnf". +# +# Below are described some suggested parameters to use +# The parameters not recognized will be passed through to the mysqld daemon +# +# Parameter : description +# ----------------+----------------------------------------------------------- +# nice : integer [-20 .. 19 ] default 0 +# : change the priority of the server -20 (high) to 19 (low) +# : see "man nice 1" for description +# ----------------+----------------------------------------------------------- +# mycnf : string [full path to my.cnf] +# : specify the path to my.cnf file to be used +# ----------------+----------------------------------------------------------- +# TODO chroot : string [path to chroot directory] +# : Tell the script that the server will be run in a chrooted +# : environment. +# : You may want to "mount -obind" a shared directory for the +# : socket (usually /var/lib/run) or to instruct every client +# : that connect to localhost (thus using sock connection) +# : (will NOT be passed to the MySQL server) +# ----------------+----------------------------------------------------------- +# +# Additional parameters +# Parameter : description +# ----------------+----------------------------------------------------------- +# server-id : integer [1 .. 255] +# : Uniquely identifies the server instance in the community +# : of replication partners. +# ----------------+----------------------------------------------------------- +# port : integer [1025 .. 65535] default 3306 +# : Port number to use for connection. +# : loose any meaning if skip-networking is set. +# ----------------+----------------------------------------------------------- +# skip-networking : NULL, Don't allow connection with TCP/IP. +# log-bin : string [name of the binlog files] +# : Log update queries in binary format. Optional (but +# : strongly recommended to avoid replication problems if +# : server's hostname changes) argument should be the chosen +# : location for the binary log files. +# ----------------+----------------------------------------------------------- +# +# start a default server with default options: +# need symlinks (try emerge --config =dev-db/mysql-[version]) +# +#mysql_slot_0=() +# +# start MySQL 7.5.x reniced, chrooted and overriding some start parameters +# +#mysql_slot_705=( +# "nice=-5" +# "chroot=/chroot/mysql-705" +# "server-id=123" +# "log-bin="myhost" +# "port=3307" +#) +# start another server, same version, different my.cnf +# +#mysql_slot_705_1=( +# "mycnf=/home/test/my.cnf" +# "server-id=124" +#) +# To avoid starting a server just comment it's definition +# To avoid confusion mysql init script MUST found at least one definition +#> here or it will rant (no default start) +# Last but not least, spaces are NOT allowed inside the parameters + diff --git a/dev-db/mysql/files/mysql-slot.rc6 b/dev-db/mysql/files/mysql-slot.rc6 new file mode 100644 index 000000000000..1b9ceb963813 --- /dev/null +++ b/dev-db/mysql/files/mysql-slot.rc6 @@ -0,0 +1,265 @@ +#!/sbin/runscript +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-db/mysql/files/mysql-slot.rc6,v 1.1 2005/11/19 03:58:41 vivo Exp $ + +# external binaryes used: which, sed, tac + +depend() { + use dns net +} + +# int in_list(char * elem, char * list) +function in_list() { + local elem=${1:-"none"} + local list=${2:-","} + [[ "${list}" == "${list/,${elem},/}" ]] \ + && return 1 \ + || return 0 +} + +# int get_slot_config(srv_slot=0, srv_num) +get_slot_config() { + srv_slot="${1:-"0"}" + srv_num="${2}" + basedir="" + datadir="" + pidfile="" + socket="" + CHROOT="" + NICE="" + # grab the parameters from conf.d/mysql definition + local tmp_eval="mysql_slot_${srv_slot}${srv_num:+"_"}${srv_num}[@]" + local conf_d_parameters="${!tmp_eval}" + MY_SUFFIX="-${srv_slot}" + [[ "${MY_SUFFIX}" == '-0' ]] && MY_SUFFIX='' + MY_CNF="/etc/mysql${MY_SUFFIX}/my.cnf" + unmanagedparams="" + local my_print_defaults="$(which my_print_defaults${MY_SUFFIX} 2>/dev/null)" + local paramlist="," + local mycnf + + # check my_print_defaults executable + if [[ ! -x "${my_print_defaults}" ]]; then + eerror "my_print_defaults NOT found or not executable" + return 1 + fi + my_print_defaults="${my_print_defaults} --loose-verbose" + + # svc script force bash sourcing of same-name conf.d file ... + #> so it's not possible to use my_print_defaults with that one + for my_default in ${conf_d_parameters[*]}; do + case "${my_default}" in + nice=*) + NICE="${my_default#nice=}" + nice -n $NICE ls /tmp &>/dev/null || NICE="" + ;; + mycnf=*) + MY_CNF="${my_default#mycnf=}" + ;; + chroot=*) + # do not pass this to the mysqld it has different meanings + CHROOT="${my_default#chroot=}" + #TODO + CHROOT='' + ;; + + basedir=*) + basedir="${my_default#basedir=}" + paramlist="${paramlist}--${my_default%%=*}," + ;; + datadir=*) + datadir="${my_default#datadir=}" + paramlist="${paramlist}--${my_default%%=*}," + ;; + pid-file=*) + pidfile="${my_default#pid-file=}" + paramlist="${paramlist}--${my_default%%=*}," + ;; + socket=*) + socket="${my_default#socket=}" + paramlist="${paramlist}--${my_default%%=*}," + ;; + *) + # list of parameters we already have + # prepend "--" because my_print_defaults do it + paramlist="${paramlist}--${my_default%%=*}," + # little trick from mysqld_safe + unmanagedparams="${unmanagedparams} $(echo "--${my_default}" | sed -e 's,\([^=/a-zA-Z0-9_.-]\),\\\1,g')" + esac + done + + if [[ ! -r "${MY_CNF}" ]]; then + ewarn "Cannot access ${MY_CNF} ! Using automatic defaults!" + my_defaults=$(${my_print_defaults} mysqld server) + else + my_defaults=$(${my_print_defaults} --config-file=${MY_CNF} mysqld server) + fi + + for my_default in ${my_defaults}; do + case "${my_default}" in + --basedir=*) + if ! $(in_list "${my_default%%=*}" "${paramlist}") ; then + basedir="${my_default#--basedir=}" + fi ;; + --datadir=*) + if ! $(in_list "${my_default%%=*}" "${paramlist}") ; then + datadir="${my_default#--datadir=}" + fi ;; + --pid-file=*) + if ! $(in_list "${my_default%%=*}" "${paramlist}") ; then + pidfile="${my_default#--pid-file=}" + fi ;; + --socket=*) + if ! $(in_list "${my_default%%=*}" "${paramlist}") ; then + socket="${my_default#--socket=}" + fi ;; + *) + # check into the list of parameters we already have + if ! $(in_list "${my_default%%=*}" "${paramlist}") ; then + paramlist="${paramlist}${my_default%%=*}," + unmanagedparams="${unmanagedparams} $(echo "${my_default}" | sed -e 's,\([^=/a-zA-Z0-9_.-]\),\\\1,g')" + fi + ;; + esac + done + + for i in basedir datadir pidfile socket ; do + if [[ -z "${!i}" ]] ; then + eerror "undefined $i" + return 1 + fi + done + + for i in "server-id" "log-bin" ; do + if ! $(in_list "--${i}" "${paramlist}") ; then + ewarn "undefined $i, it's good practice set it" + fi + done + + # push these out to the script + export MY_SUFFIX NICE MY_CNF pidfile datadir basedir socket CHROOT unmanagedparams + return 0 +} + +checkconfig() { + local datadir="$1" + if [ ! -d "${datadir}" ]; then + eerror "MySQL datadir is empty or invalid" + eerror "Please check your my.cnf : ${MY_CNF}" + return 1 + fi + + if [ ! -d "$datadir/mysql" ]; then + eerror "You don't appear to have the mysql database installed yet." + eerror "Please run /usr/bin/mysql_install_db to have this done..." + return 1 + fi + return 0 +} + +start() { + MYSQL_GLOB_PID_FILE=${MYSQL_GLOB_PID_FILE:-"/var/run/svc-started-mysqld"} + # servers are defined in /etc/conf.d/mysql + local serverlist=${!mysql_slot_*} + # provide default for empty conf.d/mysql + if [[ -z "${serverlist}" ]] ; then + serverlist=0 + export mysql_slot_0=() + fi + local maxtry retstatus + local globretstatus=1 + local srv_slot srv_num + # server MUST NOT share same location for these + local pidfilelist=',' + local datadirlist=',' + + # additional security + rm -f "${MYSQL_GLOB_PID_FILE}" ; touch "${MYSQL_GLOB_PID_FILE}" + if [[ $? -ne 0 ]] ; then + eerror "cannot create MYSQL_GLOB_PID_FILE: ${MYSQL_GLOB_PID_FILE}" + return 1 + fi + + # try to start each server + for srv in ${serverlist[*]} ; do + einfo "working on ${srv}" + + srv_slot="${srv#mysql_slot_}" + if [[ "${srv_slot}" == "${srv_slot#*_}" ]] ; then + srv_num='' + else + srv_num="${srv_slot#*_}" + fi + srv_slot="${srv_slot%%_*}" + + # timeout (seconds) before declare failed the startup + maxtry=10 + retstatus=0 + + get_slot_config "${srv_slot}" "${srv_num}" || retstatus=1 + + # pre_run checks + [[ "$retstatus" -eq 0 ]] && checkconfig "${datadir}" || retstatus=2 + if [[ "$retstatus" -eq 0 ]] ; then + if $(in_list "${pidfile}" "${pidfilelist}"); then + retstatus=3 + eerror "Cowardly refusing to start another server with same ${pidfile}" + fi + if $(in_list "${datadir}" "${datadirlist}"); then + retstatus=4 + eerror "Cowardly refusing to start another server with same ${datadir}" + fi + fi + + if [[ $retstatus -eq 0 ]] ; then + # additional security + rm -f ${pidfile} ${socket} + ebegin "Starting mysqld${MY_SUFFIX:+"_"}${srv_slot}${srv_num:+"_"}${srv_num} (${MY_CNF})" + start-stop-daemon --start --quiet --background \ + ${NICE:+"--nicelevel="}${NICE} \ + --pidfile="${pidfile}" \ + --exec ${basedir}/sbin/mysqld${MY_SUFFIX} -- \ + --basedir="${basedir}" \ + --datadir="${datadir}" \ + --pid-file="${pidfile}" \ + --socket="${socket}" \ + ${unmanagedparams} >/dev/null 2>&1 + retstatus=$? + # wait for socket creation + while ! [[ -S "${socket}" || "${maxtry}" -lt 1 || "${retstatus}" -ne 0 ]] ; do + maxtry=$(($maxtry - 1)) + echo -n "." + sleep 1 + done + if [[ ! -S "${socket}" ]] ; then + eerror "MySQL${MY_SUFFIX} NOT started (${retstatus})" + retstatus=1 + fi + fi + + if [[ $retstatus -eq 0 ]]; then + globretstatus=0 + echo "${srv_slot}${srv_num:+"_"}${srv_num}=${pidfile}" >> "${MYSQL_GLOB_PID_FILE}" + fi + done + # successfull if at least one mysqld started + eend $retstatus +} + +stop () { + MYSQL_GLOB_PID_FILE=${MYSQL_GLOB_PID_FILE:-"/var/run/svc-started-mysqld"} + local runwhat pidfile shutdown_elem + local retstatus=0 + local shutdown_list="$(tac "${MYSQL_GLOB_PID_FILE}")" + # shutdown in reverse order + for shutdown_elem in $shutdown_list; do + runwhat=${shutdown_elem%%=*} + pidfile=${shutdown_elem#*=} + ebegin "Stopping mysqld (${runwhat})" + start-stop-daemon --stop --retry 5 --quiet --pidfile="${pidfile}" + retstatus=$(( $retstatus + $? )) + done + [[ "$retstatus" -eq 0 ]] && rm -f "$MYSQL_GLOB_PID_FILE" + eend $retstatus +}