Commit 7dd74fa3 authored by Nirbhay Choubey's avatar Nirbhay Choubey

MDEV-6481: Yum Upgrade on CentOS 6.5 causes instant

crash of MariaDB/Galera

mysqld crashes during startup when its started with --wsrep-recover
(mysqld_safe.sh). The problem was that during server startup "wsrep"
handle is not initialized for --wsrep-recover and since the condition
to register wsrep hton depended only on 'wsrep_on' global/session
variables (WSREP(thd) macro), it can eventually get registered and
calls to wsrep handle's functions (commit, rollback, etc.) can be
made (SIGSEGV!).

Fixed by adding a check for "wsrep" pointer in WSREP(thd) macro
(added by lp:1367173). Additionally, a check for WSREP(thd)
(instead of checking the availability of wsrep provider) has been
added before invoking wsrep handle's commit & rollback functions.
parent b197066c
...@@ -210,9 +210,9 @@ static int wsrep_rollback(handlerton *hton, THD *thd, bool all) ...@@ -210,9 +210,9 @@ static int wsrep_rollback(handlerton *hton, THD *thd, bool all)
} }
if ((all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && if ((all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&
(thd->variables.wsrep_on && thd->wsrep_conflict_state != MUST_REPLAY)) thd->wsrep_conflict_state != MUST_REPLAY)
{ {
if (wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) if (WSREP(thd) && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle))
{ {
DBUG_PRINT("wsrep", ("setting rollback fail")); DBUG_PRINT("wsrep", ("setting rollback fail"));
WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s", WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s",
...@@ -252,13 +252,11 @@ int wsrep_commit(handlerton *hton, THD *thd, bool all) ...@@ -252,13 +252,11 @@ int wsrep_commit(handlerton *hton, THD *thd, bool all)
Transaction didn't go through wsrep->pre_commit() so just roll back Transaction didn't go through wsrep->pre_commit() so just roll back
possible changes to clean state. possible changes to clean state.
*/ */
if (WSREP_PROVIDER_EXISTS) { if (WSREP(thd) && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle))
if (wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) {
{ DBUG_PRINT("wsrep", ("setting rollback fail"));
DBUG_PRINT("wsrep", ("setting rollback fail")); WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s",
WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s", (long long)thd->real_id, thd->query());
(long long)thd->real_id, thd->query());
}
} }
wsrep_cleanup_transaction(thd); wsrep_cleanup_transaction(thd);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment