Re: [Maria-developers] [Commits] 2b3bffb: MDEV-8491 - On shutdown, report the user and the host executed that.
Hi, Sergey! On Nov 25, Sergey Vojtovich wrote:
revision-id: 2b3bffb42cc4adbec2d91c1b9c4028374b63a51a (mariadb-10.1.8-75-g2b3bffb) parent(s): 6019fee7d84e8ec7d64337ad080a04f9c106bb68 committer: Sergey Vojtovich timestamp: 2015-11-25 18:12:19 +0400 message:
MDEV-8491 - On shutdown, report the user and the host executed that.
First, a test would be nice. I suppose you can add it to the main.shutdown test.
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0502841..0694cb0 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1806,10 +1806,34 @@ static void close_server_sock() #endif /*EMBEDDED_LIBRARY*/
-void kill_mysql(void) +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; + Security_context *sctx= thd->security_ctx; + + strxnmov(user_host_buff, MAX_USER_HOST_SIZE, + sctx->priv_user ? sctx->priv_user : "", "[", + sctx->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), + "] @ ", + sctx->host ? sctx->host : "", " [", + sctx->ip ? sctx->ip : "", "]", NullS);
this will be the fifth time this expression shows up in the source code. turn it into a function, perhaps? Like, an inline method of THD? also, sometimes it's "SQL_SLAVE", sometimes it's "", sometimes it's "unauthenticated", etc. I hope these differences can be removed and there will be one method that works identically for all occasions. Btw, you can use safe_str() helper here.
+ + if ((user= my_strdup(user_host_buff, MYF(0))) && + !my_atomic_casptr((void **) &shutdown_user, + (void **) &expected_shutdown_user, user)) + my_free(user); +}
Interesting. Why is that?
+ + +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 +1912,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");
can it, really, be "unknown" here? when?
+ if (user) + my_free(user); + } else sql_print_error(ER_DEFAULT(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 59908dc..f65d466 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: normální ukončení %s\n" + dan "%s: Normal nedlukning %s\n" + nla "%s: Normaal afgesloten %s\n" + eng "%s: Normal shutdown by %s\n" + est "%s: MariaDB lõpetas %s\n" + fre "%s: Arrêt normal du serveur %s\n" + ger "%s: Normal heruntergefahren %s\n" + greek "%s: Φυσιολογική διαδικασία shutdown %s\n" + hun "%s: Normal leallitas %s\n" + ita "%s: Shutdown normale %s\n" + jpn "%s: 通常シャットダウン %s\n" + kor "%s: 정상적인 shutdown %s\n" + nor "%s: Normal avslutning %s\n" + norwegian-ny "%s: Normal nedkopling %s\n" + pol "%s: Standardowe zakończenie działania %s\n" + por "%s: 'Shutdown' normal %s\n" + rum "%s: Terminare normala %s\n" + rus "%s: Корректная остановка пользователем %s\n" + serbian "%s: Normalno gašenje %s\n" + slo "%s: normálne ukončenie %s\n" + spa "%s: Apagado normal %s\n" + swe "%s: Normal avslutning %s\n" + ukr "%s: Нормальне завершення %s\n"
Here you've fixed only the english and russian messages. Others would look pretty weird. Normal procedure in such a case is to remove all other languages and only keep those that you've fixed. In this case you can, perhaps, fix all of them in some easy way, like ger "%s: Normal heruntergefahren (%s)\n" ger "%s: Normal heruntergefahren / %s\n" ger "%s (%s): Normal heruntergefahren\n" ger "%s / %s: Normal heruntergefahren\n" or something else along these lines. See how it'll look like in the log: mysqld: Normal heruntergefahren foo [bar] @ localhost [127.0.0.1] mysqld: Normal heruntergefahren (foo [bar] @ localhost [127.0.0.1]) mysqld: Normal heruntergefahren / foo [bar] @ localhost [127.0.0.1] mysqld (foo [bar] @ localhost [127.0.0.1]): Normal heruntergefahren mysqld / foo [bar] @ localhost [127.0.0.1]: Normal heruntergefahren Regards, Sergei
Hi Sergei, On Thu, Nov 26, 2015 at 10:09:19AM +0100, Sergei Golubchik wrote:
Hi, Sergey!
On Nov 25, Sergey Vojtovich wrote:
revision-id: 2b3bffb42cc4adbec2d91c1b9c4028374b63a51a (mariadb-10.1.8-75-g2b3bffb) parent(s): 6019fee7d84e8ec7d64337ad080a04f9c106bb68 committer: Sergey Vojtovich timestamp: 2015-11-25 18:12:19 +0400 message:
MDEV-8491 - On shutdown, report the user and the host executed that.
First, a test would be nice. I suppose you can add it to the main.shutdown test. Ok.
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0502841..0694cb0 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1806,10 +1806,34 @@ static void close_server_sock() #endif /*EMBEDDED_LIBRARY*/
-void kill_mysql(void) +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; + Security_context *sctx= thd->security_ctx; + + strxnmov(user_host_buff, MAX_USER_HOST_SIZE, + sctx->priv_user ? sctx->priv_user : "", "[", + sctx->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), + "] @ ", + sctx->host ? sctx->host : "", " [", + sctx->ip ? sctx->ip : "", "]", NullS);
this will be the fifth time this expression shows up in the source code. turn it into a function, perhaps? Like, an inline method of THD?
also, sometimes it's "SQL_SLAVE", sometimes it's "", sometimes it's "unauthenticated", etc. I hope these differences can be removed and there will be one method that works identically for all occasions.
Btw, you can use safe_str() helper here.
Ok.
+ + if ((user= my_strdup(user_host_buff, MYF(0))) && + !my_atomic_casptr((void **) &shutdown_user, + (void **) &expected_shutdown_user, user)) + my_free(user); +}
Interesting. Why is that?
It supposed to be safe concurrent shutdown.
+ + +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 +1912,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");
can it, really, be "unknown" here? when?
Yes, in a few cases. E.g. killed by signal.
+ if (user) + my_free(user); + } else sql_print_error(ER_DEFAULT(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 59908dc..f65d466 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: normální ukončení %s\n" + dan "%s: Normal nedlukning %s\n" + nla "%s: Normaal afgesloten %s\n" + eng "%s: Normal shutdown by %s\n" + est "%s: MariaDB lõpetas %s\n" + fre "%s: Arrêt normal du serveur %s\n" + ger "%s: Normal heruntergefahren %s\n" + greek "%s: Φυσιολογική διαδικασία shutdown %s\n" + hun "%s: Normal leallitas %s\n" + ita "%s: Shutdown normale %s\n" + jpn "%s: 通常シャットダウン %s\n" + kor "%s: 정상적인 shutdown %s\n" + nor "%s: Normal avslutning %s\n" + norwegian-ny "%s: Normal nedkopling %s\n" + pol "%s: Standardowe zakończenie działania %s\n" + por "%s: 'Shutdown' normal %s\n" + rum "%s: Terminare normala %s\n" + rus "%s: Корректная остановка пользователем %s\n" + serbian "%s: Normalno gašenje %s\n" + slo "%s: normálne ukončenie %s\n" + spa "%s: Apagado normal %s\n" + swe "%s: Normal avslutning %s\n" + ukr "%s: Нормальне завершення %s\n"
Here you've fixed only the english and russian messages. Others would look pretty weird. Normal procedure in such a case is to remove all other languages and only keep those that you've fixed. In this case you can, perhaps, fix all of them in some easy way, like
ger "%s: Normal heruntergefahren (%s)\n" ger "%s: Normal heruntergefahren / %s\n" ger "%s (%s): Normal heruntergefahren\n" ger "%s / %s: Normal heruntergefahren\n"
or something else along these lines. See how it'll look like in the log:
mysqld: Normal heruntergefahren foo [bar] @ localhost [127.0.0.1] mysqld: Normal heruntergefahren (foo [bar] @ localhost [127.0.0.1]) mysqld: Normal heruntergefahren / foo [bar] @ localhost [127.0.0.1] mysqld (foo [bar] @ localhost [127.0.0.1]): Normal heruntergefahren mysqld / foo [bar] @ localhost [127.0.0.1]: Normal heruntergefahren
Ok. Thanks, Sergey
Hi, Sergey! On Nov 26, Sergey Vojtovich wrote:
+ + if ((user= my_strdup(user_host_buff, MYF(0))) && + !my_atomic_casptr((void **) &shutdown_user, + (void **) &expected_shutdown_user, user)) + my_free(user); +}
Interesting. Why is that? It supposed to be safe concurrent shutdown.
Okay, but please add a comment about it.
@@ -1888,7 +1912,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");
can it, really, be "unknown" here? when? Yes, in a few cases. E.g. killed by signal.
Oh, right, sorry. I thought that if() filters that out (because signals have a special message ER_DEFAULT(ER_GOT_SIGNAL) below). Any other cases? Otherwise I'd suggest - user ? user : "unknown"); + user ? user : STRINGIFY_ARG(MYSQL_KILL_SIGNAL)) Regards, Sergei
Hi Sergei, On Thu, Nov 26, 2015 at 02:55:49PM +0100, Sergei Golubchik wrote:
Hi, Sergey!
On Nov 26, Sergey Vojtovich wrote:
+ + if ((user= my_strdup(user_host_buff, MYF(0))) && + !my_atomic_casptr((void **) &shutdown_user, + (void **) &expected_shutdown_user, user)) + my_free(user); +}
Interesting. Why is that? It supposed to be safe concurrent shutdown.
Okay, but please add a comment about it. Ok.
@@ -1888,7 +1912,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");
can it, really, be "unknown" here? when? Yes, in a few cases. E.g. killed by signal.
Oh, right, sorry. I thought that if() filters that out (because signals have a special message ER_DEFAULT(ER_GOT_SIGNAL) below).
Any other cases? Otherwise I'd suggest
- user ? user : "unknown"); + user ? user : STRINGIFY_ARG(MYSQL_KILL_SIGNAL))
No user info in following cases: - if listening socket is closed and SIGNALS_DONT_BREAK_READ is defined (which is never seem to be defined), kill_server is called with MYSQL_KILL_SIGNAL - if signal SIG{TERM|QUIT|KILL} received and USE_ONE_SIGNAL_HAND defined (is it guaranteed to be defined properly, kill_server is called with 0 - special handling of SIGINT - wsrep applier thread may call kill_server() without thd, but that's probably fixable Regards, Sergey
participants (2)
-
Sergei Golubchik
-
Sergey Vojtovich