From a4dbb3b061a2d9172d2a4536f35ecb5629eb0c36 Mon Sep 17 00:00:00 2001
From: "serg@serg.mylan" <>
Date: Tue, 22 Feb 2005 15:22:37 +0100
Subject: [PATCH] compatibility fixes, crashing tests

---
 include/my_sys.h                  |  7 ++++++-
 mysql-test/t/rpl_rotate_logs.test |  1 +
 sql/ha_innodb.cc                  |  4 ++--
 sql/handler.cc                    |  8 ++++++--
 sql/handler.h                     |  4 ++++
 sql/log.cc                        | 11 ++++++++---
 sql/mysqld.cc                     |  2 +-
 7 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/include/my_sys.h b/include/my_sys.h
index 498a1bd30f..4618c25dbf 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -804,8 +804,13 @@ my_bool my_gethwaddr(uchar *to);
 #endif
 
 #define my_mmap(a,b,c,d,e,f)    mmap(a,b,c,d,e,f)
+#ifdef HAVE_GETPAGESIZE
 #define my_getpagesize()        getpagesize()
-#define my_munmap(a,b)          munmap(a,b)
+#else
+/* qnx ? */
+#define my_getpagesize()        8192
+#endif
+#define my_munmap(a,b)          munmap((char*)(a),(b))
 
 #else
 /* not a complete set of mmap() flags, but only those that nesessary */
diff --git a/mysql-test/t/rpl_rotate_logs.test b/mysql-test/t/rpl_rotate_logs.test
index 1029c64867..c11a19c343 100644
--- a/mysql-test/t/rpl_rotate_logs.test
+++ b/mysql-test/t/rpl_rotate_logs.test
@@ -174,6 +174,7 @@ while ($1)
 --enable_query_log
 commit;
 drop table t1;
+--replace_result "xid=373" "xid=146"
 show binlog events in 'master-bin.000001';
 show binlog events in 'master-bin.000002';
 
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index d6e17b3b5e..ac5cb4221b 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -1346,14 +1346,14 @@ innobase_commit_low(
                 return;
         }
 
-#ifdef HAVE_REPLICATION
+#ifdef DISABLE_HAVE_REPLICATION
         if (current_thd->slave_thread) {
                 /* Update the replication position info inside InnoDB */
 
                 trx->mysql_master_log_file_name
                                         = active_mi->rli.group_master_log_name;
                 trx->mysql_master_log_pos= ((ib_longlong)
-                   			    active_mi->rli.future_group_master_log_pos);
+                                            active_mi->rli.future_group_master_log_pos);
         }
 #endif /* HAVE_REPLICATION */
 
diff --git a/sql/handler.cc b/sql/handler.cc
index b733ec6c26..b76fbe5ccd 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -553,6 +553,7 @@ int ha_commit_trans(THD *thd, bool all)
 #ifdef USING_TRANSACTIONS
   if (trans->nht)
   {
+    DBUG_EXECUTE_IF("crash_commit_before", abort(););
     if (!trans->no_2pc && trans->nht > 1)
     {
       for (; *ht && !error; ht++)
@@ -565,16 +566,20 @@ int ha_commit_trans(THD *thd, bool all)
         }
         statistic_increment(thd->status_var.ha_prepare_count,&LOCK_status);
       }
+      DBUG_EXECUTE_IF("crash_commit_after_prepare", abort(););
       if (error || (is_real_trans && xid &&
                     (error= !(cookie= tc_log->log(thd, xid)))))
       {
         ha_rollback_trans(thd, all);
         return 1;
       }
+    DBUG_EXECUTE_IF("crash_commit_after_log", abort(););
     }
     error=ha_commit_one_phase(thd, all) ? cookie ? 2 : 1 : 0;
+    DBUG_EXECUTE_IF("crash_commit_before_unlog", abort(););
     if (cookie)
       tc_log->unlog(cookie, xid);
+    DBUG_EXECUTE_IF("crash_commit_after", abort(););
   }
 #endif /* USING_TRANSACTIONS */
   DBUG_RETURN(error);
@@ -738,8 +743,7 @@ int ha_recover(HASH *commit_list)
   DBUG_ASSERT(total_ha_2pc);
   DBUG_ASSERT(commit_list || tc_heuristic_recover);
 
-  for (len=commit_list ? commit_list->records : MAX_XID_LIST_SIZE ;
-       list==0 && len > MIN_XID_LIST_SIZE; len/=2)
+  for (len= MAX_XID_LIST_SIZE ; list==0 && len > MIN_XID_LIST_SIZE; len/=2)
   {
     list=(XID *)my_malloc(len*sizeof(XID), MYF(0));
   }
diff --git a/sql/handler.h b/sql/handler.h
index 3a1862cad0..ad9345ac75 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -253,7 +253,11 @@ typedef struct xid_t XID;
 
 /* for recover() handlerton call */
 #define MIN_XID_LIST_SIZE  128
+#ifdef SAFEMALLOC
+#define MAX_XID_LIST_SIZE  256
+#else
 #define MAX_XID_LIST_SIZE  (1024*128)
+#endif
 
 /*
   handlerton is a singleton structure - one instance per storage engine -
diff --git a/sql/log.cc b/sql/log.cc
index 6cb465f839..5348ae795b 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -2903,7 +2903,12 @@ int TC_LOG_BINLOG::open(const char *opt_name)
   pthread_cond_init (&COND_prep_xids, 0);
 
   if (using_heuristic_recover())
+  {
+    /* generate a new binlog to mask a corrupted one */
+    open(opt_name, LOG_BIN, 0, WRITE_CACHE, 0, max_binlog_size, 0);
+    cleanup();
     return 1;
+  }
 
   if ((error= find_log_pos(&log_info, NullS, 1)))
   {
@@ -2946,9 +2951,9 @@ int TC_LOG_BINLOG::open(const char *opt_name)
     if ((ev= Log_event::read_log_event(&log, 0, &fdle)) &&
         ev->get_type_code() == FORMAT_DESCRIPTION_EVENT &&
         ev->flags & LOG_EVENT_BINLOG_IN_USE_F)
-        error= recover(&log, (Format_description_log_event *)ev);
-      else
-        error=0;
+      error= recover(&log, (Format_description_log_event *)ev);
+    else
+      error=0;
 
     delete ev;
     end_io_cache(&log);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 9559ed55b3..1cf1e8ca2b 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2738,7 +2738,7 @@ server.");
                  (TC_LOG *)&tc_log_mmap   :
                  (TC_LOG *)&tc_log_dummy;
 
-  if (tc_log->open(opt_tc_log_file))
+  if (tc_log->open(opt_bin_logname))
   {
     sql_print_error("Can't init tc log");
     unireg_abort(1);
-- 
2.30.9