From 7caef7f4aa826db751626a9833c70df33ebf1363 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 22 Feb 2005 15:22:37 +0100 Subject: [PATCH] compatibility fixes, crashing tests include/my_sys.h: sol9x86, sunfire100b, qnx compatibility mysql-test/t/rpl_rotate_logs.test: fix the test sql/ha_innodb.cc: don't bother sql/handler.cc: few more ways to crash mysqld :) sql/handler.h: gdb/safemalloc workaround sql/log.cc: rotate a binlog on heuristic recover sql/mysqld.cc: rotate a binlog on heuristic recover --- 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 498a1bd30fe..4618c25dbfb 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 1029c64867a..c11a19c343b 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 d6e17b3b5e2..ac5cb4221be 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 b733ec6c267..b76fbe5ccd5 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 3a1862cad07..ad9345ac75c 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 6cb465f839c..5348ae795b5 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 9559ed55b3c..1cf1e8ca2bf 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);