[OE-core] [meta-oe][PATCH V2] mariadb.inc: fix mysqld hung at first init time based on systemd

Hongxu Jia hongxu.jia at windriver.com
Sat Nov 21 08:12:30 UTC 2015


Sorry for mistaking the mailing list, please drop it.

//Hongxu


On 11/21/2015 04:10 PM, Hongxu Jia wrote:
> While SYSTEMD_AUTO_ENABLE_mariadb-server = "enable", the mysqld service
> hungs.
> ...
> [    **] A start job is running for Run pending postinsts (25s / no limit)
> [  OK  ] Stopped MariaDB database server.
> ...
>
> In mariadb-server's pkg_postinst, it install db at first runtime. And the
> following 'systemctl mysqld restart' casued the hunging. So the fix idea
> is to reomove pkg_postinst and still install db at first runtime.
>
> Introduce mysqld.service and mysql-systemd-start from ${S}/packaging/rpm-oel/.
> For review convenience, we add them as files.
>
> The mysql-systemd-start provides two functions: the install_db is to install
> db at fist runtime (the first runtime means if a db existed, the install_db
> will directly exit); the pinger is to wait for mysqld service startup
> completed.
>
> The newly mysqld.service add ExecStartPre and ExecStartPost than previous:
> ExecStartPre invoke 'mysql-systemd-start pre' to install db before mysqld
> start at first runtime; ExecStartPost invoke 'mysql-systemd-start post' to
> wait for mysqld service startup completed.
>
> It also fix another issue:
> When you manually restart mysqld and do mysql test to connect the server,
> the return of the restart could make sure mysqld is ready, and the following db
> connect will not fail with:
> ...
> Can't connect to local MySQL server through socket
> ...
>
> Use "?=" rather than "=" to assign SYSTEMD_AUTO_ENABLE_${PN}-server, so we could
> override it in local.conf
>
> Add 'mysql-systemd-start pre' to sysvinit startup script, so mysqld could work
> on the system based on sysvinit.
>
> Tweak my.cnf to remove obsolete/incorrect parameter.
>
> Issue: LIN8-1397
> Issue: LIN8-1687
> (LOCAL REV: NOT UPSTREAM) -- sent to oe on 20151121
>
> Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
> ---
>   meta-oe/recipes-support/mysql/mariadb.inc          | 22 ++-----
>   .../mariadb/install-db-before-start-mysqld.patch   | 32 ++++++++++
>   meta-oe/recipes-support/mysql/mariadb/my.cnf       |  1 -
>   .../mysql/mariadb/mysql-systemd-start              | 68 ++++++++++++++++++++++
>   .../recipes-support/mysql/mariadb/mysqld.service   | 50 +++++++++++++---
>   5 files changed, 147 insertions(+), 26 deletions(-)
>   create mode 100644 meta-oe/recipes-support/mysql/mariadb/install-db-before-start-mysqld.patch
>   create mode 100644 meta-oe/recipes-support/mysql/mariadb/mysql-systemd-start
>
> diff --git a/meta-oe/recipes-support/mysql/mariadb.inc b/meta-oe/recipes-support/mysql/mariadb.inc
> index 42a4eda..3a29f58 100644
> --- a/meta-oe/recipes-support/mysql/mariadb.inc
> +++ b/meta-oe/recipes-support/mysql/mariadb.inc
> @@ -10,8 +10,10 @@ SRC_URI = "http://archive.mariadb.org/mariadb-${PV}/source/mariadb-${PV}.tar.gz
>              file://fix-mysqlclient-r-version.patch \
>              file://my.cnf \
>              file://mysqld.service \
> +           file://mysql-systemd-start \
>              file://configure.cmake-fix-valgrind.patch \
>              file://fix-a-building-failure.patch \
> +           file://install-db-before-start-mysqld.patch \
>             "
>   
>   SRC_URI[md5sum] = "92f682b00eb137af01e59ea93f7e31f7"
> @@ -33,7 +35,7 @@ GROUPADD_PARAM_${PN}-server = "--system mysql"
>   
>   SYSTEMD_PACKAGES = "${PN}-server"
>   SYSTEMD_SERVICE_${PN}-server = "mysqld.service"
> -SYSTEMD_AUTO_ENABLE_${PN}-server = "disable"
> +SYSTEMD_AUTO_ENABLE_${PN}-server ?= "disable"
>   
>   EXTRA_OEMAKE = "'GEN_LEX_HASH=${STAGING_BINDIR_NATIVE}/gen_lex_hash'"
>   
> @@ -125,22 +127,9 @@ do_install() {
>   	echo "f /var/log/mysqld.err 0640 mysql mysql -" \
>               > ${D}${sysconfdir}/tmpfiles.d/99-mysqld.conf
>       fi
> -}
> -
> -pkg_postinst_${PN}-server () {
> -    if [ "x$D" != "x" ]; then
> -        exit 1
> -    fi
> -
> -    #Install the database
> -    test -d /usr/bin || mkdir -p /usr/bin
> -    test -e /usr/bin/hostname || ln -s /bin/hostname /usr/bin/hostname
> -    mkdir /var/lib/mysql
> -    chown mysql.mysql /var/lib/mysql
> -
> -    mysql_install_db --basedir=${prefix} --user=mysql
> +    install -d ${D}${bindir}
> +    install -m 755 ${WORKDIR}/mysql-systemd-start ${D}${bindir}
>   
> -    [ -x /sbin/restorecon ] && /sbin/restorecon -RF /var/lib/mysql
>   }
>   
>   PACKAGES = "${PN}-dbg ${PN} \
> @@ -236,6 +225,7 @@ FILES_${PN}-server = "\
>       ${bindir}/mysql_install_db \
>       ${bindir}/mysql_secure_installation \
>       ${bindir}/mysql_setpermission \
> +    ${bindir}/mysql-systemd-start \
>       ${bindir}/mysql_tzinfo_to_sql \
>       ${bindir}/mysql_upgrade \
>       ${bindir}/mysql_plugin \
> diff --git a/meta-oe/recipes-support/mysql/mariadb/install-db-before-start-mysqld.patch b/meta-oe/recipes-support/mysql/mariadb/install-db-before-start-mysqld.patch
> new file mode 100644
> index 0000000..724618f
> --- /dev/null
> +++ b/meta-oe/recipes-support/mysql/mariadb/install-db-before-start-mysqld.patch
> @@ -0,0 +1,32 @@
> +From 5d8495e81a748350c89849c1a385e57ee31836e2 Mon Sep 17 00:00:00 2001
> +From: Hongxu Jia <hongxu.jia at windriver.com>
> +Date: Fri, 20 Nov 2015 09:52:29 -0500
> +Subject: [PATCH] support-files/mysql.server.sh: install db at first runtime
> +
> +We remove postinst in mariadb-server, and still need to install db
> +at first runtime before mysqld start. So invoke 'mysql-systemd-start
> +pre' before mysqld startup on sysvinit system.
> +
> +The first runtime means it will skip install if a db already existed.
> +
> +Upstream-Status: inappropriate [meta-oe specific]
> +Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
> +---
> + support-files/mysql.server.sh | 1 +
> + 1 file changed, 1 insertion(+)
> +
> +diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh
> +index e23b837..e5926f5 100644
> +--- a/support-files/mysql.server.sh
> ++++ b/support-files/mysql.server.sh
> +@@ -304,6 +304,7 @@ case "$mode" in
> +     cd $basedir
> +
> +     echo $echo_n "Starting MySQL"
> ++    $bindir/mysql-systemd-start pre
> +     if test -x $bindir/mysqld_safe
> +     then
> +       # Give extra arguments to mysqld with the my.cnf file. This script
> +--
> +1.9.1
> +
> diff --git a/meta-oe/recipes-support/mysql/mariadb/my.cnf b/meta-oe/recipes-support/mysql/mariadb/my.cnf
> index 28d3899..dc4c172 100644
> --- a/meta-oe/recipes-support/mysql/mariadb/my.cnf
> +++ b/meta-oe/recipes-support/mysql/mariadb/my.cnf
> @@ -4,7 +4,6 @@ port						= 3306
>   socket						= /var/lib/mysql/mysql.sock
>   
>   [mysqld_safe]
> -err-log						= /var/log/mysql.err
>   
>   [mysqld]
>   user 						= mysql
> diff --git a/meta-oe/recipes-support/mysql/mariadb/mysql-systemd-start b/meta-oe/recipes-support/mysql/mariadb/mysql-systemd-start
> new file mode 100644
> index 0000000..8e7006b
> --- /dev/null
> +++ b/meta-oe/recipes-support/mysql/mariadb/mysql-systemd-start
> @@ -0,0 +1,68 @@
> +#! /bin/sh
> +#
> +# Scripts to run by MySQL systemd service
> +#
> +# Needed argument: pre | post
> +#
> +# pre mode  :  try to run mysql_install_db and fix perms and SELinux contexts
> +# post mode :  ping server until answer is received
> +#
> +
> +get_option () {
> +    local section=$1
> +    local option=$2
> +    local default=$3
> +    ret=$(/usr/bin/my_print_defaults $section | grep '^--'${option}'=' | cut -d= -f2-)
> +    [ -z $ret ] && ret=$default
> +    echo $ret
> +}
> +
> +install_db () {
> +    # Note: something different than datadir=/var/lib/mysql requires SELinux policy changes (in enforcing mode)
> +    datadir=$(get_option mysqld datadir "/var/lib/mysql")
> +
> +    # Restore log, dir, perms and SELinux contexts
> +    [ -d "$datadir" ] || install -d -m 0755 -omysql -gmysql "$datadir" || exit 1
> +    log=/var/log/mysqld.log
> +    [ -e $log ] || touch $log
> +    chmod 0640 $log
> +    chown mysql:mysql $log || exit 1
> +    if [ -x /usr/sbin/restorecon ]; then
> +        /usr/sbin/restorecon "$datadir"
> +        /usr/sbin/restorecon $log
> +    fi
> +
> +    # If special mysql dir is in place, skip db install
> +    [ -d "$datadir/mysql" ] && exit 0
> +
> +    # Create initial db
> +    /usr/bin/mysql_install_db --rpm --datadir="$datadir" --user=mysql
> +    exit 0
> +}
> +
> +pinger () {
> +    # Wait for ping to answer to signal startup completed,
> +    # might take a while in case of e.g. crash recovery
> +    # MySQL systemd service will timeout script if no answer
> +    datadir=$(get_option mysqld datadir "/var/lib/mysql")
> +    socket=$(get_option  mysqld socket "$datadir/mysql.sock")
> +    case $socket in
> +        /*) adminsocket="$socket" ;;
> +        *) adminsocket="$datadir/$socket" ;;
> +    esac
> +
> +    while /bin/true ; do
> +        sleep 1
> +        mysqladmin --no-defaults --socket="$adminsocket" --user=UNKNOWN_MYSQL_USER ping >/dev/null 2>&1 && break
> +    done
> +    exit 0
> +}
> +
> +# main
> +case $1 in
> +    "pre") install_db ;;
> +    "post") pinger ;;
> +esac
> +
> +exit 0
> +
> diff --git a/meta-oe/recipes-support/mysql/mariadb/mysqld.service b/meta-oe/recipes-support/mysql/mariadb/mysqld.service
> index 757d038..1bcb0ee 100644
> --- a/meta-oe/recipes-support/mysql/mariadb/mysqld.service
> +++ b/meta-oe/recipes-support/mysql/mariadb/mysqld.service
> @@ -1,16 +1,48 @@
> +#
> +# Simple MySQL systemd service file
> +#
> +# systemd supports lots of fancy features, look here (and linked docs) for a full list:
> +#   http://www.freedesktop.org/software/systemd/man/systemd.exec.html
> +#
> +# Note: this file ( /usr/lib/systemd/system/mysql.service )
> +# will be overwritten on package upgrade, please copy the file to
> +#
> +#  /etc/systemd/system/mysql.service
> +#
> +# to make needed changes.
> +#
> +# systemd-delta can be used to check differences between the two mysql.service files.
> +#
> +
>   [Unit]
> -Description=MariaDB database server
> -After=syslog.target
> +Description=MySQL Community Server
>   After=network.target
> +After=syslog.target
> +
> +[Install]
> +WantedBy=multi-user.target
> +Alias=mysql.service
>   
>   [Service]
> -PIDFile=/var/lib/mysql/mysqld.pid
> -Type=simple
>   User=mysql
>   Group=mysql
> -ExecStart=@BINDIR@/mysqld_safe --basedir=@PREFIX@
> -TimeoutSec=300
> -PrivateTmp=true
>   
> -[Install]
> -WantedBy=multi-user.target
> +# Execute pre and post scripts as root
> +PermissionsStartOnly=true
> +
> +# Needed to create system tables etc.
> +ExecStartPre=@BINDIR@/mysql-systemd-start pre
> +
> +# Start main service
> +ExecStart=@BINDIR@/mysqld_safe
> +
> +# Don't signal startup success before a ping works
> +ExecStartPost=@BINDIR@/mysql-systemd-start post
> +
> +# Give up if ping don't get an answer
> +TimeoutSec=600
> +
> +Restart=always
> +PrivateTmp=false
> +
> +




More information about the Openembedded-core mailing list