List:Commits« Previous MessageNext Message »
From:Joerg Bruehe Date:June 15 2010 8:46pm
Subject:bzr commit into mysql-trunk-bugfixing branch (joerg:3096) Bug#27072
View as plain text  
#At file:///MySQL/REPO/V55/bug27072-5.5/ based on revid:alik@stripped

 3096 Joerg Bruehe	2010-06-15 [merge]
      Fix bug#27072:  RPM autostarts the server
      
      This is the fix for 5.5, where the behaviour on both installation
      and upgrade is changed:
      On installation, we do not start the server, to allow automated
      installs (which happen in some indeterminate machine status).
      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.5, we do *not* start the server if there is no status file (which will happen on first installation, when there is no data directory yet).

    modified:
      support-files/mysql.spec.sh
=== modified file 'support-files/mysql.spec.sh'
--- a/support-files/mysql.spec.sh	2010-06-02 10:38:13 +0000
+++ b/support-files/mysql.spec.sh	2010-06-15 20:46:29 +0000
@@ -504,6 +504,7 @@ rm -f $RBR%{_mandir}/man1/make_win_bin_d
 ##############################################################################
 
 %pre -n MySQL-server%{product_suffix}
+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.
 
@@ -576,7 +577,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"
@@ -585,17 +653,33 @@ fi
 
 %post -n MySQL-server%{product_suffix}
 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=''
+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
@@ -677,17 +761,30 @@ if [ -x sbin/restorecon ] ; then
   sbin/restorecon -R var/lib/mysql
 fi
 
-# Restart in the same way that mysqld will be started normally.
-if [ -x %{_sysconfdir}/init.d/mysql ] ; then
-  %{_sysconfdir}/init.d/mysql start
-  echo "Giving mysqld 2 seconds to start"
-  sleep 2
+# 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.
+	if [ -x %{_sysconfdir}/init.d/mysql ] ; then
+		%{_sysconfdir}/init.d/mysql start
+		echo "Giving mysqld 2 seconds to start"
+		sleep 2
+	fi
+
+	# Allow mysqld_safe to start mysqld and print a message before we exit
+	sleep 2
 fi
 
-# Allow mysqld_safe to start mysqld and print a message before we exit
-sleep 2
+# 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
+
 
 %preun -n MySQL-server%{product_suffix}
+
 if [ $1 = 0 ] ; then
   # Stop MySQL before uninstalling it
   if [ -x %{_sysconfdir}/init.d/mysql ] ; then
@@ -892,6 +989,17 @@ fi
 # merging BK trees)
 ##############################################################################
 %changelog
+* Tue Jun 15 2010 Joerg Bruehe <joerg.bruehe@stripped>
+
+- Change the behaviour on installation and upgrade:
+  On installation, do not autostart the server.
+  *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.5 version of fixing bug#27072 (RPM autostarting the server).
+
 * Tue Jun 1 2010 Jonathan Perkin <jonathan.perkin@stripped>
 
 - Implement SELinux checks from distribution-specific spec file.


Attachment: [text/bzr-bundle] bzr/joerg@mysql.com-20100615204629-wra0emxf9mn8u2eh.bundle
Thread
bzr commit into mysql-trunk-bugfixing branch (joerg:3096) Bug#27072Joerg Bruehe15 Jun