new slotted enabled start scripts, see ChangeLog
authorFrancesco Riosa <vivo@gentoo.org>
Sat, 19 Nov 2005 03:58:41 +0000 (03:58 +0000)
committerFrancesco Riosa <vivo@gentoo.org>
Sat, 19 Nov 2005 03:58:41 +0000 (03:58 +0000)
Package-Manager: portage-2.0.53_rc6

dev-db/mysql/ChangeLog
dev-db/mysql/Manifest
dev-db/mysql/files/mysql-slot.conf.d [new file with mode: 0644]
dev-db/mysql/files/mysql-slot.rc6 [new file with mode: 0644]

index 89fa8c54ce68dedadce8d48cc1543a67b9c07788..15f4ea41d24c24741b018cf98e82816f0933aa71 100644 (file)
@@ -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 <vivo@gentoo.org> +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 <weeve@gentoo.org> mysql-5.0.15.ebuild:
   Added ~sparc keyword.
index 5cc4cd7d6fe179ce7b20f3dadfad91dfc29cf4de..3421b37deaa229ef71a0b597642216db614b64e1 100644 (file)
@@ -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 (file)
index 0000000..16b5824
--- /dev/null
@@ -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 (file)
index 0000000..1b9ceb9
--- /dev/null
@@ -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
+}