summaryrefslogtreecommitdiff
path: root/sql/mysqld.cc
diff options
context:
space:
mode:
authorVenkatesh Duggirala <venkatesh.duggirala@oracle.com>2012-12-28 16:13:48 +0530
committerVenkatesh Duggirala <venkatesh.duggirala@oracle.com>2012-12-28 16:13:48 +0530
commitec70b93e7b529dbd0da0eaab317fe0edf9ea1c24 (patch)
treeedf413db3ffddb0b39db8239a104dce99b790187 /sql/mysqld.cc
parent825459b8cda4f97a3ef1f3affb4889d7807a0f3a (diff)
downloadmariadb-git-ec70b93e7b529dbd0da0eaab317fe0edf9ea1c24.tar.gz
BUG#14726272- BACKPORT FIX FOR BUG 11746142 TO 5.5 AND 5.1
Details of BUG#11746142: CALLING MYSQLD WHILE ANOTHER INSTANCE IS RUNNING, REMOVES PID FILE Fix: Before removing the pid file, ensure it was created by the same process, leave it intact otherwise. sql/mysqld.cc: delete_pid_file() introduced, which checks that the pid file belongs to the process before removing it
Diffstat (limited to 'sql/mysqld.cc')
-rw-r--r--sql/mysqld.cc46
1 files changed, 38 insertions, 8 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index cb1bc6bed12..12b52a87adc 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -867,6 +867,7 @@ static void clean_up(bool print_message);
static int test_if_case_insensitive(const char *dir_name);
#ifndef EMBEDDED_LIBRARY
+static bool pid_file_created= false;
static void usage(void);
static void start_signal_handler(void);
static void close_server_sock();
@@ -875,6 +876,7 @@ static void wait_for_signal_thread_to_end(void);
static void create_pid_file();
static void end_ssl();
#endif
+static void delete_pid_file(myf flags);
#ifndef EMBEDDED_LIBRARY
@@ -1395,10 +1397,7 @@ void clean_up(bool print_message)
debug_sync_end();
#endif /* defined(ENABLED_DEBUG_SYNC) */
-#if !defined(EMBEDDED_LIBRARY)
- if (!opt_bootstrap)
- (void) my_delete(pidfile_name,MYF(0)); // This may not always exist
-#endif
+ delete_pid_file(MYF(0));
if (print_message && errmesg && server_start_time)
sql_print_information(ER(ER_SHUTDOWN_COMPLETE),my_progname);
thread_scheduler.end();
@@ -4387,9 +4386,7 @@ we force server id to 2, but this MySQL server will not act as a slave.");
(void) pthread_kill(signal_thread, MYSQL_KILL_SIGNAL);
#endif /* __NETWARE__ */
- if (!opt_bootstrap)
- (void) my_delete(pidfile_name,MYF(MY_WME)); // Not needed anymore
-
+ delete_pid_file(MYF(MY_WME));
if (unix_sock != INVALID_SOCKET)
unlink(mysqld_unix_port);
exit(1);
@@ -9098,12 +9095,13 @@ static void create_pid_file()
if ((file = my_create(pidfile_name,0664,
O_WRONLY | O_TRUNC, MYF(MY_WME))) >= 0)
{
- char buff[21], *end;
+ char buff[MAX_BIGINT_WIDTH + 1], *end;
end= int10_to_str((long) getpid(), buff, 10);
*end++= '\n';
if (!my_write(file, (uchar*) buff, (uint) (end-buff), MYF(MY_WME | MY_NABP)))
{
(void) my_close(file, MYF(0));
+ pid_file_created= true;
return;
}
(void) my_close(file, MYF(0));
@@ -9113,6 +9111,38 @@ static void create_pid_file()
}
#endif /* EMBEDDED_LIBRARY */
+
+/**
+ Remove the process' pid file.
+
+ @param flags file operation flags
+*/
+
+static void delete_pid_file(myf flags)
+{
+#ifndef EMBEDDED_LIBRARY
+ File file;
+ if (opt_bootstrap ||
+ !pid_file_created ||
+ !(file= my_open(pidfile_name, O_RDONLY, flags)))
+ return;
+
+ /* Make sure that the pid file was created by the same process. */
+ uchar buff[MAX_BIGINT_WIDTH + 1];
+ size_t error= my_read(file, buff, sizeof(buff), flags);
+ my_close(file, flags);
+ buff[sizeof(buff) - 1]= '\0';
+ if (error != MY_FILE_ERROR &&
+ atol((char *) buff) == (long) getpid())
+ {
+ my_delete(pidfile_name, flags);
+ pid_file_created= false;
+ }
+#endif /* EMBEDDED_LIBRARY */
+ return;
+}
+
+
/** Clear most status variables. */
void refresh_status(THD *thd)
{