summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/shutdown.result4
-rw-r--r--mysql-test/t/shutdown.test7
-rw-r--r--sql/mysqld.cc35
-rw-r--r--sql/mysqld.h2
-rw-r--r--sql/share/errmsg-utf8.txt46
-rw-r--r--sql/sql_parse.cc4
6 files changed, 70 insertions, 28 deletions
diff --git a/mysql-test/r/shutdown.result b/mysql-test/r/shutdown.result
index 7039afb129e..553dab6de29 100644
--- a/mysql-test/r/shutdown.result
+++ b/mysql-test/r/shutdown.result
@@ -5,3 +5,7 @@ create procedure try_shutdown() shutdown;
drop procedure try_shutdown;
shutdown;
drop user user1@localhost;
+#
+# MDEV-8491 - On shutdown, report the user and the host executed that.
+#
+FOUND /mysqld \(root\[root\] @ localhost \[\]\): Normal shutdown/ in mysqld.1.err
diff --git a/mysql-test/t/shutdown.test b/mysql-test/t/shutdown.test
index ac7f06b116d..d764e80cb72 100644
--- a/mysql-test/t/shutdown.test
+++ b/mysql-test/t/shutdown.test
@@ -30,3 +30,10 @@ drop procedure try_shutdown;
drop user user1@localhost;
+--echo #
+--echo # MDEV-8491 - On shutdown, report the user and the host executed that.
+--echo #
+--let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err
+--let SEARCH_RANGE= -50000
+--let SEARCH_PATTERN=mysqld \(root\[root\] @ localhost \[\]\): Normal shutdown
+--source include/search_pattern_in_file.inc
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 4986e40f036..0c3de5a9b1c 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1806,10 +1806,35 @@ static void close_server_sock()
#endif /*EMBEDDED_LIBRARY*/
-void kill_mysql(void)
+/**
+ Set shutdown user
+
+ @note this function may be called by multiple threads concurrently, thus
+ it performs safe update of shutdown_user (first thread wins).
+*/
+
+static volatile char *shutdown_user;
+static void set_shutdown_user(THD *thd)
+{
+ char user_host_buff[MAX_USER_HOST_SIZE + 1];
+ char *user, *expected_shutdown_user= 0;
+
+ make_user_name(thd, user_host_buff);
+
+ if ((user= my_strdup(user_host_buff, MYF(0))) &&
+ !my_atomic_casptr((void **) &shutdown_user,
+ (void **) &expected_shutdown_user, user))
+ my_free(user);
+}
+
+
+void kill_mysql(THD *thd)
{
DBUG_ENTER("kill_mysql");
+ if (thd)
+ set_shutdown_user(thd);
+
#if defined(SIGNALS_DONT_BREAK_READ) && !defined(EMBEDDED_LIBRARY)
abort_loop=1; // Break connection loops
close_server_sock(); // Force accept to wake up
@@ -1888,7 +1913,13 @@ static void __cdecl kill_server(int sig_ptr)
if (sig != 0) // 0 is not a valid signal number
my_sigset(sig, SIG_IGN); /* purify inspected */
if (sig == MYSQL_KILL_SIGNAL || sig == 0)
- sql_print_information(ER_DEFAULT(ER_NORMAL_SHUTDOWN),my_progname);
+ {
+ char *user= (char *) my_atomic_loadptr((void**) &shutdown_user);
+ sql_print_information(ER_DEFAULT(ER_NORMAL_SHUTDOWN), my_progname,
+ user ? user : "unknown");
+ if (user)
+ my_free(user);
+ }
else
sql_print_error(ER_DEFAULT(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 5c27f86b654..e06c70aa2e5 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -78,7 +78,7 @@ enum enum_slave_parallel_mode {
};
/* Function prototypes */
-void kill_mysql(void);
+void kill_mysql(THD *thd= 0);
void close_connection(THD *thd, uint sql_errno= 0);
void handle_connection_in_main_thread(THD *thd);
void create_thread_to_handle_connection(THD *thd);
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 59908dc51c0..0afd13eb19b 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -1735,29 +1735,29 @@ ER_WRONG_AUTO_KEY 42000 S1009
ER_UNUSED_9
eng "You should never see it"
ER_NORMAL_SHUTDOWN
- cze "%s: normální ukončení\n"
- dan "%s: Normal nedlukning\n"
- nla "%s: Normaal afgesloten \n"
- eng "%s: Normal shutdown\n"
- est "%s: MariaDB lõpetas\n"
- fre "%s: Arrêt normal du serveur\n"
- ger "%s: Normal heruntergefahren\n"
- greek "%s: Φυσιολογική διαδικασία shutdown\n"
- hun "%s: Normal leallitas\n"
- ita "%s: Shutdown normale\n"
- jpn "%s: 通常シャットダウン\n"
- kor "%s: 정상적인 shutdown\n"
- nor "%s: Normal avslutning\n"
- norwegian-ny "%s: Normal nedkopling\n"
- pol "%s: Standardowe zakończenie działania\n"
- por "%s: 'Shutdown' normal\n"
- rum "%s: Terminare normala\n"
- rus "%s: Корректная остановка\n"
- serbian "%s: Normalno gašenje\n"
- slo "%s: normálne ukončenie\n"
- spa "%s: Apagado normal\n"
- swe "%s: Normal avslutning\n"
- ukr "%s: Нормальне завершення\n"
+ cze "%s (%s): normální ukončení\n"
+ dan "%s (%s): Normal nedlukning\n"
+ nla "%s (%s): Normaal afgesloten \n"
+ eng "%s (%s): Normal shutdown\n"
+ est "%s (%s): MariaDB lõpetas\n"
+ fre "%s (%s): Arrêt normal du serveur\n"
+ ger "%s (%s): Normal heruntergefahren\n"
+ greek "%s (%s): Φυσιολογική διαδικασία shutdown\n"
+ hun "%s (%s): Normal leallitas\n"
+ ita "%s (%s): Shutdown normale\n"
+ jpn "%s (%s): 通常シャットダウン\n"
+ kor "%s (%s): 정상적인 shutdown\n"
+ nor "%s (%s): Normal avslutning\n"
+ norwegian-ny "%s (%s): Normal nedkopling\n"
+ pol "%s (%s): Standardowe zakończenie działania\n"
+ por "%s (%s): 'Shutdown' normal\n"
+ rum "%s (%s): Terminare normala\n"
+ rus "%s (%s): Корректная остановка\n"
+ serbian "%s (%s): Normalno gašenje\n"
+ slo "%s (%s): normálne ukončenie\n"
+ spa "%s (%s): Apagado normal\n"
+ swe "%s (%s): Normal avslutning\n"
+ ukr "%s (%s): Нормальне завершення\n"
ER_GOT_SIGNAL
cze "%s: přijat signal %d, končím\n"
dan "%s: Fangede signal %d. Afslutter!!\n"
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 52dcc7ee5d6..96985aac051 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1804,7 +1804,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
DBUG_PRINT("quit",("Got shutdown command for level %u", level));
general_log_print(thd, command, NullS);
my_eof(thd);
- kill_mysql();
+ kill_mysql(thd);
error=TRUE;
break;
}
@@ -4907,7 +4907,7 @@ end_with_restore_list:
#ifndef EMBEDDED_LIBRARY
if (check_global_access(thd,SHUTDOWN_ACL))
goto error;
- kill_mysql();
+ kill_mysql(thd);
my_ok(thd);
#else
my_error(ER_NOT_SUPPORTED_YET, MYF(0), "embedded server");