From f88e6af0bbbba5f7fdf90f6c3401a2c49093a4e9 Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Mon, 14 Jun 2010 11:23:49 +0200 Subject: [PATCH 1/2] Bug #53261 MTR tests archive_plugin and blackhole_plugin fail when compiling with cmake Let mtr lookup the plugins, rather than hard-coding autotools lib path. mysql-test/include/not_parallel.inc: Add new feature for skipping when running in parallel. mysql-test/mysql-test-run.pl: Use find_plugin to locate plugins. Export opt_parallel in environment. mysql-test/suite/federated/federated_plugin-master.opt: Use plugin dir from mtr. mysql-test/suite/federated/federated_plugin.test: Skip test, disabled. mysql-test/t/archive_plugin-master.opt: Use plugin dir from mtr. mysql-test/t/archive_plugin.test: Skip test if running in parallel. mysql-test/t/blackhole_plugin-master.opt: Use plugin dir from mtr. mysql-test/t/blackhole_plugin.test: Skip test if running in parallel. --- mysql-test/include/not_parallel.inc | 3 +++ mysql-test/mysql-test-run.pl | 13 ++++++++++++- .../suite/federated/federated_plugin-master.opt | 3 +-- mysql-test/suite/federated/federated_plugin.test | 2 ++ mysql-test/t/archive_plugin-master.opt | 2 +- mysql-test/t/archive_plugin.test | 4 ++++ mysql-test/t/blackhole_plugin-master.opt | 2 +- mysql-test/t/blackhole_plugin.test | 4 ++++ 8 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 mysql-test/include/not_parallel.inc diff --git a/mysql-test/include/not_parallel.inc b/mysql-test/include/not_parallel.inc new file mode 100644 index 00000000000..39432c59813 --- /dev/null +++ b/mysql-test/include/not_parallel.inc @@ -0,0 +1,3 @@ +if (`SELECT '$MTR_PARALLEL' > 1`) { + --skip test requires --parallel=1 +} diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index fa2db663e1e..23a92828e2a 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -362,6 +362,7 @@ sub main { $opt_parallel= 1 if ($opt_parallel < 1); mtr_report("Using parallel: $opt_parallel"); } + $ENV{MTR_PARALLEL} = $opt_parallel; # Create server socket on any free port my $server = new IO::Socket::INET @@ -1826,7 +1827,7 @@ sub find_plugin($$) mtr_file_exists(vs_config_dirs($location,$plugin_filename), "$basedir/lib/plugin/".$plugin_filename, "$basedir/$location/.libs/".$plugin_filename, - "$basedir/lib/mysql/plugin/".$plugin_filename, + "$basedir/lib/mysql/plugin/".$plugin_filename, ); return $lib_example_plugin; } @@ -1943,6 +1944,16 @@ sub environment_setup { } } + # ---------------------------------------------------- + # Add the paths where mysqld will find archive/blackhole/federated plugins. + # ---------------------------------------------------- + $ENV{'ARCHIVE_PLUGIN_DIR'} = + dirname(find_plugin("ha_archive", "storage/archive")); + $ENV{'BLACKHOLE_PLUGIN_DIR'} = + dirname(find_plugin("ha_blackhole", "storage/blackhole")); + $ENV{'FEDERATED_PLUGIN_DIR'} = + dirname(find_plugin("ha_federated", "storage/federated")); + # ---------------------------------------------------- # Add the path where mysqld will find mypluglib.so # ---------------------------------------------------- diff --git a/mysql-test/suite/federated/federated_plugin-master.opt b/mysql-test/suite/federated/federated_plugin-master.opt index ac2e9458e5f..fa9ad063fe1 100644 --- a/mysql-test/suite/federated/federated_plugin-master.opt +++ b/mysql-test/suite/federated/federated_plugin-master.opt @@ -1,2 +1 @@ ---plugin_dir=../storage/federated/.libs - +--plugin_dir=$FEDERATED_PLUGIN_DIR diff --git a/mysql-test/suite/federated/federated_plugin.test b/mysql-test/suite/federated/federated_plugin.test index 81421e226b1..b9056f63352 100644 --- a/mysql-test/suite/federated/federated_plugin.test +++ b/mysql-test/suite/federated/federated_plugin.test @@ -1,6 +1,8 @@ --source include/not_windows.inc --source include/have_federated_plugin.inc +--skip federated plugin is disabled + CREATE TABLE t1(a int) ENGINE=FEDERATED; DROP TABLE t1; diff --git a/mysql-test/t/archive_plugin-master.opt b/mysql-test/t/archive_plugin-master.opt index 28e7a6a2831..36b21a74922 100644 --- a/mysql-test/t/archive_plugin-master.opt +++ b/mysql-test/t/archive_plugin-master.opt @@ -1 +1 @@ ---plugin_dir=../storage/archive/.libs +--plugin_dir=$ARCHIVE_PLUGIN_DIR diff --git a/mysql-test/t/archive_plugin.test b/mysql-test/t/archive_plugin.test index 18b7cddc7d3..567a0a58ce7 100644 --- a/mysql-test/t/archive_plugin.test +++ b/mysql-test/t/archive_plugin.test @@ -1,6 +1,10 @@ --source include/not_windows.inc --source include/have_archive_plugin.inc +# When running in parallel we get +# Warning 1620 Plugin is busy and will be uninstalled on shutdown +--source include/not_parallel.inc + CREATE TABLE t1(a int) ENGINE=ARCHIVE; DROP TABLE t1; diff --git a/mysql-test/t/blackhole_plugin-master.opt b/mysql-test/t/blackhole_plugin-master.opt index dff15c6f136..e78cd2b1662 100644 --- a/mysql-test/t/blackhole_plugin-master.opt +++ b/mysql-test/t/blackhole_plugin-master.opt @@ -1 +1 @@ ---plugin_dir=../storage/blackhole/.libs +--plugin_dir=$BLACKHOLE_PLUGIN_DIR diff --git a/mysql-test/t/blackhole_plugin.test b/mysql-test/t/blackhole_plugin.test index 5c712233dc7..1de5b2d0499 100644 --- a/mysql-test/t/blackhole_plugin.test +++ b/mysql-test/t/blackhole_plugin.test @@ -1,6 +1,10 @@ --source include/not_windows.inc --source include/have_blackhole_plugin.inc +# When running in parallel we get +# Warning 1620 Plugin is busy and will be uninstalled on shutdown +--source include/not_parallel.inc + CREATE TABLE t1(a int) ENGINE=BLACKHOLE; DROP TABLE t1; From b3eac87c3cf7a3c747173483bcb02deb3421f4b3 Mon Sep 17 00:00:00 2001 From: Joerg Bruehe Date: Tue, 15 Jun 2010 22:27:48 +0200 Subject: [PATCH 2/2] Fix bug#27072: RPM autostarts the server This is the fix for 5.1, where only the behaviour on upgrade is changed: If the server was stopped when the upgrade begins, we assume the administrator is taking manual action, so we do not start the (new) server at the end of the upgrade. We still install the start/stop script, so it will be started on reboot. support-files/mysql.spec.sh: In the "pre" section of the spec file, check the server status, and write the result to a file. In the "post" section, evaluate the status file, and start the server if it was running during status analysis. In 5.1, we start the server if there is no status file (which will happen on first installation, when there is no data directory yet). --- support-files/mysql.spec.sh | 120 +++++++++++++++++++++++++++++++++--- 1 file changed, 113 insertions(+), 7 deletions(-) diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index 91848ffc8bd..21a4d0c52a0 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -1,4 +1,4 @@ -# Copyright (C) 2000-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc. +# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -610,6 +610,7 @@ touch $RBR%{_sysconfdir}/mysqlmanager.passwd ############################################################################## %pre server +mysql_datadir=%{mysqldatadir} # Check if we can safely upgrade. An upgrade is only safe if it's from one # of our RPMs in the same version family. @@ -678,7 +679,74 @@ HERE fi fi +# We assume that if there is exactly one ".pid" file, +# it contains the valid PID of a running MySQL server. +NR_PID_FILES=`ls $mysql_datadir/*.pid 2>/dev/null | wc -l` +case $NR_PID_FILES in + 0 ) SERVER_TO_START='' ;; # No "*.pid" file == no running server + 1 ) SERVER_TO_START='true' ;; + * ) SERVER_TO_START='' # Situation not clear + SEVERAL_PID_FILES=true ;; +esac +# That logic may be debated: We might check whether it is non-empty, +# contains exactly one number (possibly a PID), and whether "ps" finds it. +# OTOH, if there is no such process, it means a crash without a cleanup - +# is that a reason not to start a new server after upgrade? + +STATUS_FILE=$mysql_datadir/RPM_UPGRADE_MARKER + +if [ -f $STATUS_FILE ]; then + echo "Some previous upgrade was not finished:" + ls -ld $STATUS_FILE + echo "Please check its status, then do" + echo " rm $STATUS_FILE" + echo "before repeating the MySQL upgrade." + exit 1 +elif [ -n "$SEVERAL_PID_FILES" ] ; then + echo "Your MySQL directory '$mysql_datadir' has more than one PID file:" + ls -ld $mysql_datadir/*.pid + echo "Please check which one (if any) corresponds to a running server" + echo "and delete all others before repeating the MySQL upgrade." + exit 1 +fi + +NEW_VERSION=%{mysql_version}-%{release} + +# The "pre" section code is also run on a first installation, +# when there is no data directory yet. Protect against error messages. +if [ -d $mysql_datadir ] ; then + echo "MySQL RPM upgrade to version $NEW_VERSION" > $STATUS_FILE + echo "'pre' step running at `date`" >> $STATUS_FILE + echo >> $STATUS_FILE + echo "ERR file(s):" >> $STATUS_FILE + ls -ltr $mysql_datadir/*.err >> $STATUS_FILE + echo >> $STATUS_FILE + echo "Latest 'Version' line in latest file:" >> $STATUS_FILE + grep '^Version' `ls -tr $mysql_datadir/*.err | tail -1` | \ + tail -1 >> $STATUS_FILE + echo >> $STATUS_FILE + + if [ -n "$SERVER_TO_START" ] ; then + # There is only one PID file, race possibility ignored + echo "PID file:" >> $STATUS_FILE + ls -l $mysql_datadir/*.pid >> $STATUS_FILE + cat $mysql_datadir/*.pid >> $STATUS_FILE + echo >> $STATUS_FILE + echo "Server process:" >> $STATUS_FILE + ps -fp `cat $mysql_datadir/*.pid` >> $STATUS_FILE + echo >> $STATUS_FILE + echo "SERVER_TO_START=$SERVER_TO_START" >> $STATUS_FILE + else + # Take a note we checked it ... + echo "PID file:" >> $STATUS_FILE + ls -l $mysql_datadir/*.pid >> $STATUS_FILE 2>&1 + fi +fi + # Shut down a previously installed server first +# Note we *could* make that depend on $SERVER_TO_START, but we rather don't, +# so a "stop" is attempted even if there is no PID file. +# (Maybe the "stop" doesn't work then, but we might fix that in itself.) if [ -x %{_sysconfdir}/init.d/mysql ] ; then %{_sysconfdir}/init.d/mysql stop > /dev/null 2>&1 echo "Giving mysqld 5 seconds to exit nicely" @@ -687,17 +755,33 @@ fi %post server mysql_datadir=%{mysqldatadir} +NEW_VERSION=%{mysql_version}-%{release} +STATUS_FILE=$mysql_datadir/RPM_UPGRADE_MARKER # ---------------------------------------------------------------------- -# Create data directory if needed +# Create data directory if needed, check whether upgrade or install # ---------------------------------------------------------------------- if [ ! -d $mysql_datadir ] ; then mkdir -m 755 $mysql_datadir; fi -if [ ! -d $mysql_datadir/mysql ] ; then mkdir $mysql_datadir/mysql; fi +if [ -f $STATUS_FILE ] ; then + SERVER_TO_START=`grep '^SERVER_TO_START=' $STATUS_FILE | cut -c17-` +else + SERVER_TO_START='true' # This is for 5.1 only, to not change behavior +fi +# echo "Analyzed: SERVER_TO_START=$SERVER_TO_START" +if [ ! -d $mysql_datadir/mysql ] ; then + mkdir $mysql_datadir/mysql; + echo "MySQL RPM installation of version $NEW_VERSION" >> $STATUS_FILE +else + # If the directory exists, we may assume it is an upgrade. + echo "MySQL RPM upgrade to version $NEW_VERSION" >> $STATUS_FILE +fi if [ ! -d $mysql_datadir/test ] ; then mkdir $mysql_datadir/test; fi # ---------------------------------------------------------------------- # Make MySQL start/shutdown automatically when the machine does it. # ---------------------------------------------------------------------- +# NOTE: This still needs to be debated. Should we check whether these links +# for the other run levels exist(ed) before the upgrade? # use insserv for older SuSE Linux versions if [ -x /sbin/insserv ] ; then /sbin/insserv %{_sysconfdir}/init.d/mysql @@ -741,11 +825,14 @@ chown -R %{mysqld_user}:%{mysqld_group} $mysql_datadir # ---------------------------------------------------------------------- chmod -R og-rw $mysql_datadir/mysql -# Restart in the same way that mysqld will be started normally. -%{_sysconfdir}/init.d/mysql start +# Was the server running before the upgrade? If so, restart the new one. +if [ "$SERVER_TO_START" = "true" ] ; then + # Restart in the same way that mysqld will be started normally. + %{_sysconfdir}/init.d/mysql start -# Allow mysqld_safe to start mysqld and print a message before we exit -sleep 2 + # Allow mysqld_safe to start mysqld and print a message before we exit + sleep 2 +fi #echo "Thank you for installing the MySQL Community Server! For Production #systems, we recommend MySQL Enterprise, which contains enterprise-ready @@ -753,6 +840,14 @@ sleep 2 #scheduled service packs and more. Visit www.mysql.com/enterprise for more #information." +# Collect an upgrade history ... +echo "Upgrade/install finished at `date`" >> $STATUS_FILE +echo >> $STATUS_FILE +echo "=====" >> $STATUS_FILE +STATUS_HISTORY=$mysql_datadir/RPM_UPGRADE_HISTORY +cat $STATUS_FILE >> $STATUS_HISTORY +rm $STATUS_FILE + %if %{CLUSTER_BUILD} %post ndb-storage mysql_clusterdir=/var/lib/mysql-cluster @@ -1038,6 +1133,17 @@ fi # merging BK trees) ############################################################################## %changelog + +* Tue Jun 15 2010 Joerg Bruehe + +- Change the behaviour on upgrade: + *Iff* the server was stopped before the upgrade is started, this is taken as a + sign the administrator is handling that manually, and so the new server will + not be started automatically at the end of the upgrade. + The start/stop scripts will still be installed, so the server will be started + on the next machine boot. + This is the 5.1 version of fixing bug#27072 (RPM autostarting the server). + * Mon Mar 01 2010 Joerg Bruehe - Set "Oracle and/or its affiliates" as the vendor and copyright owner,