From 7dd74fa3a2f167424624bf71d54ff965514239a9 Mon Sep 17 00:00:00 2001
From: Nirbhay Choubey <nirbhay@mariadb.com>
Date: Wed, 8 Oct 2014 13:30:45 -0400
Subject: [PATCH] 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.
---
 sql/wsrep_hton.cc | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc
index 48577a9b5a1..86a0b6e1ece 100644
--- a/sql/wsrep_hton.cc
+++ b/sql/wsrep_hton.cc
@@ -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)) &&
-      (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"));
       WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s",
@@ -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
         possible changes to clean state.
       */
-      if (WSREP_PROVIDER_EXISTS) {
-        if (wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle))
-        {
-          DBUG_PRINT("wsrep", ("setting rollback fail"));
-          WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s",
-                      (long long)thd->real_id, thd->query());
-        }
+      if (WSREP(thd) && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle))
+      {
+        DBUG_PRINT("wsrep", ("setting rollback fail"));
+        WSREP_ERROR("settting rollback fail: thd: %llu SQL: %s",
+                    (long long)thd->real_id, thd->query());
       }
       wsrep_cleanup_transaction(thd);
     }
-- 
GitLab