1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Wsrep crash caused by COM_CHANGE_USER, COM_RESET_CONNECTION (#1358)

COM_CHANGE_USER and COM_RESET_CONNECTION commands cause
THD::cleanup() to be called in the middle of command handling.
This causes wsrep client_state sanity checks to fail.

As a fix, temporarily close wsrep client_state before THD::change_user()
is called when handling COM_CHANGE_USER and COM_RESET_CONNECTION,
and restore the state after THD::change_user() returns.

This commit also updates wsrep-lib to version which removes
exception usage in wsrep client_state sanity checks.
This commit is contained in:
Teemu Ollakka
2019-07-15 12:06:24 +03:00
committed by Jan Lindström
parent a0230bc76d
commit 61cc932781
4 changed files with 60 additions and 1 deletions

View File

@ -1660,8 +1660,16 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
case COM_RESET_CONNECTION:
{
thd->status_var.com_other++;
#ifdef WITH_WSREP
wsrep_after_command_ignore_result(thd);
wsrep_close(thd);
#endif /* WITH_WSREP */
thd->change_user();
thd->clear_error(); // if errors from rollback
#ifdef WITH_WSREP
wsrep_open(thd);
wsrep_before_command(thd);
#endif /* WITH_WSREP */
/* Restore original charset from client authentication packet.*/
if(thd->org_charset)
thd->update_charset(thd->org_charset,thd->org_charset,thd->org_charset);
@ -1673,7 +1681,15 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
int auth_rc;
status_var_increment(thd->status_var.com_other);
#ifdef WITH_WSREP
wsrep_after_command_ignore_result(thd);
wsrep_close(thd);
#endif /* WITH_WSREP */
thd->change_user();
#ifdef WITH_WSREP
wsrep_open(thd);
wsrep_before_command(thd);
#endif /* WITH_WSREP */
thd->clear_error(); // if errors from rollback
/* acl_authenticate() takes the data from net->read_pos */