diff options
author | unknown <ram@gw.mysql.r18.ru> | 2004-06-24 16:52:51 +0500 |
---|---|---|
committer | unknown <ram@gw.mysql.r18.ru> | 2004-06-24 16:52:51 +0500 |
commit | 200545c5ffd49317828fcae79f87110755c6e1d3 (patch) | |
tree | a0543f876f5e45613e279a7a43c9c9d102f9502a | |
parent | f527bdb79c2d1188554873f3076d893825d8e454 (diff) | |
parent | 8fade23549552b099fa1e92e244c2f938469cd78 (diff) | |
download | mariadb-git-200545c5ffd49317828fcae79f87110755c6e1d3.tar.gz |
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.1
into gw.mysql.r18.ru:/usr/home/ram/work/4.1.b4198
-rw-r--r-- | mysql-test/r/ndb_autodiscover2.result | 6 | ||||
-rw-r--r-- | mysql-test/t/ndb_autodiscover2.test | 2 | ||||
-rw-r--r-- | ndb/src/kernel/SimBlockList.cpp | 41 | ||||
-rw-r--r-- | ndb/src/ndbapi/Ndb.cpp | 44 | ||||
-rw-r--r-- | ndb/src/ndbapi/Ndbinit.cpp | 28 | ||||
-rw-r--r-- | sql/handler.cc | 16 | ||||
-rw-r--r-- | sql/handler.h | 2 | ||||
-rw-r--r-- | sql/log.cc | 15 | ||||
-rw-r--r-- | sql/mysql_priv.h | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 11 |
10 files changed, 86 insertions, 81 deletions
diff --git a/mysql-test/r/ndb_autodiscover2.result b/mysql-test/r/ndb_autodiscover2.result index cafaf4dce6f..08803d997a5 100644 --- a/mysql-test/r/ndb_autodiscover2.result +++ b/mysql-test/r/ndb_autodiscover2.result @@ -1,9 +1,9 @@ -select * from t9; +select * from t9 order by a; a b +1 2 2 3 -4 5 3 4 -1 2 +4 5 show status like 'handler_discover%'; Variable_name Value Handler_discover 1 diff --git a/mysql-test/t/ndb_autodiscover2.test b/mysql-test/t/ndb_autodiscover2.test index 2aae2508a2b..297795d909e 100644 --- a/mysql-test/t/ndb_autodiscover2.test +++ b/mysql-test/t/ndb_autodiscover2.test @@ -5,7 +5,7 @@ # The previous step has simply removed the frm file # from disk, but left the table in NDB # -select * from t9; +select * from t9 order by a; # handler_discover should be zero show status like 'handler_discover%'; diff --git a/ndb/src/kernel/SimBlockList.cpp b/ndb/src/kernel/SimBlockList.cpp index c41b17e1919..75a52ae0c4b 100644 --- a/ndb/src/kernel/SimBlockList.cpp +++ b/ndb/src/kernel/SimBlockList.cpp @@ -34,6 +34,9 @@ #include <Dbtux.hpp> #include <NdbEnv.h> +#ifndef VM_TRACE +#define NEW_BLOCK(B) new B +#else enum SIMBLOCKLIST_DUMMY { A_VALUE = 0 }; static @@ -60,13 +63,13 @@ void * operator new (size_t sz, SIMBLOCKLIST_DUMMY dummy){ return tmp; } +#define NEW_BLOCK(B) new(A_VALUE) B +#endif void SimBlockList::load(const Configuration & conf){ noOfBlocks = 16; theList = new SimulatedBlock * [noOfBlocks]; - for(int i = 0; i<noOfBlocks; i++) - theList[i] = 0; Dbdict* dbdict = 0; Dbdih* dbdih = 0; @@ -75,28 +78,28 @@ SimBlockList::load(const Configuration & conf){ Uint32 dl; const ndb_mgm_configuration_iterator * p = conf.getOwnConfigIterator(); if(p && !ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS, &dl) && dl){ - fs = new (A_VALUE) VoidFs(conf); + fs = NEW_BLOCK(VoidFs)(conf); } else { - fs = new (A_VALUE) Ndbfs(conf); + fs = NEW_BLOCK(Ndbfs)(conf); } } - theList[0] = new (A_VALUE) Dbacc(conf); - theList[1] = new (A_VALUE) Cmvmi(conf); + theList[0] = NEW_BLOCK(Dbacc)(conf); + theList[1] = NEW_BLOCK(Cmvmi)(conf); theList[2] = fs; - theList[3] = dbdict = new (A_VALUE) Dbdict(conf); - theList[4] = dbdih = new (A_VALUE) Dbdih(conf); - theList[5] = new (A_VALUE) Dblqh(conf); - theList[6] = new (A_VALUE) Dbtc(conf); - theList[7] = new (A_VALUE) Dbtup(conf); - theList[8] = new (A_VALUE) Ndbcntr(conf); - theList[9] = new (A_VALUE) Qmgr(conf); - theList[10] = new (A_VALUE) Trix(conf); - theList[11] = new (A_VALUE) Backup(conf); - theList[12] = new (A_VALUE) DbUtil(conf); - theList[13] = new (A_VALUE) Suma(conf); - theList[14] = new (A_VALUE) Grep(conf); - theList[15] = new (A_VALUE) Dbtux(conf); + theList[3] = dbdict = NEW_BLOCK(Dbdict)(conf); + theList[4] = dbdih = NEW_BLOCK(Dbdih)(conf); + theList[5] = NEW_BLOCK(Dblqh)(conf); + theList[6] = NEW_BLOCK(Dbtc)(conf); + theList[7] = NEW_BLOCK(Dbtup)(conf); + theList[8] = NEW_BLOCK(Ndbcntr)(conf); + theList[9] = NEW_BLOCK(Qmgr)(conf); + theList[10] = NEW_BLOCK(Trix)(conf); + theList[11] = NEW_BLOCK(Backup)(conf); + theList[12] = NEW_BLOCK(DbUtil)(conf); + theList[13] = NEW_BLOCK(Suma)(conf); + theList[14] = NEW_BLOCK(Grep)(conf); + theList[15] = NEW_BLOCK(Dbtux)(conf); // Metadata common part shared by block instances ptrMetaDataCommon = new MetaData::Common(*dbdict, *dbdih); diff --git a/ndb/src/ndbapi/Ndb.cpp b/ndb/src/ndbapi/Ndb.cpp index 3be78bbf2f8..fe7260c4693 100644 --- a/ndb/src/ndbapi/Ndb.cpp +++ b/ndb/src/ndbapi/Ndb.cpp @@ -38,10 +38,6 @@ Name: Ndb.cpp #include <NdbEnv.h> #include <BaseString.hpp> -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - /**************************************************************************** void connect(); @@ -1028,18 +1024,14 @@ const char * Ndb::getCatalogName() const void Ndb::setCatalogName(const char * a_catalog_name) { if (a_catalog_name) { - strncpy(theDataBase, a_catalog_name, NDB_MAX_DATABASE_NAME_SIZE); - // Prepare prefix for faster operations - uint db_len = MIN(strlen(theDataBase), NDB_MAX_DATABASE_NAME_SIZE - 1); - uint schema_len = - MIN(strlen(theDataBaseSchema), NDB_MAX_SCHEMA_NAME_SIZE - 1); - strncpy(prefixName, theDataBase, NDB_MAX_DATABASE_NAME_SIZE - 1); - prefixName[db_len] = table_name_separator; - strncpy(prefixName+db_len+1, theDataBaseSchema, - NDB_MAX_SCHEMA_NAME_SIZE - 1); - prefixName[db_len+schema_len+1] = table_name_separator; - prefixName[db_len+schema_len+2] = '\0'; - prefixEnd = prefixName + db_len+schema_len + 2; + snprintf(theDataBase, sizeof(theDataBase), "%s", + a_catalog_name ? a_catalog_name : ""); + + int len = snprintf(prefixName, sizeof(prefixName), "%s%c%s%c", + theDataBase, table_name_separator, + theDataBaseSchema, table_name_separator); + prefixEnd = prefixName + (len < sizeof(prefixName) ? len : + sizeof(prefixName) - 1); } } @@ -1051,18 +1043,14 @@ const char * Ndb::getSchemaName() const void Ndb::setSchemaName(const char * a_schema_name) { if (a_schema_name) { - strncpy(theDataBaseSchema, a_schema_name, NDB_MAX_SCHEMA_NAME_SIZE); - // Prepare prefix for faster operations - uint db_len = MIN(strlen(theDataBase), NDB_MAX_DATABASE_NAME_SIZE - 1); - uint schema_len = - MIN(strlen(theDataBaseSchema), NDB_MAX_SCHEMA_NAME_SIZE - 1); - strncpy(prefixName, theDataBase, NDB_MAX_DATABASE_NAME_SIZE - 1); - prefixName[db_len] = table_name_separator; - strncpy(prefixName+db_len+1, theDataBaseSchema, - NDB_MAX_SCHEMA_NAME_SIZE - 1); - prefixName[db_len+schema_len+1] = table_name_separator; - prefixName[db_len+schema_len+2] = '\0'; - prefixEnd = prefixName + db_len+schema_len + 2; + snprintf(theDataBaseSchema, sizeof(theDataBase), "%s", + a_schema_name ? a_schema_name : ""); + + int len = snprintf(prefixName, sizeof(prefixName), "%s%c%s%c", + theDataBase, table_name_separator, + theDataBaseSchema, table_name_separator); + prefixEnd = prefixName + (len < sizeof(prefixName) ? len : + sizeof(prefixName) - 1); } } diff --git a/ndb/src/ndbapi/Ndbinit.cpp b/ndb/src/ndbapi/Ndbinit.cpp index 03baff4aefd..f451ba885d4 100644 --- a/ndb/src/ndbapi/Ndbinit.cpp +++ b/ndb/src/ndbapi/Ndbinit.cpp @@ -56,7 +56,7 @@ Ndb(const char* aDataBase); Parameters: aDataBase : Name of the database. Remark: Connect to the database. ***************************************************************************/ -Ndb::Ndb( const char* aDataBase , const char* aDataBaseSchema) : +Ndb::Ndb( const char* aDataBase , const char* aSchema) : theNdbObjectIdMap(0), thePreparedTransactionsArray(NULL), theSentTransactionsArray(NULL), @@ -121,22 +121,16 @@ Ndb::Ndb( const char* aDataBase , const char* aDataBaseSchema) : theLastTupleId[i] = 0; }//for - if (aDataBase) - strncpy(theDataBase, aDataBase, NDB_MAX_DATABASE_NAME_SIZE); - else - memset(theDataBase, 0, sizeof(theDataBase)); - strncpy(theDataBaseSchema, aDataBaseSchema, NDB_MAX_SCHEMA_NAME_SIZE); - // Prepare prefix for faster operations - uint db_len = MIN(strlen(theDataBase), NDB_MAX_DATABASE_NAME_SIZE - 1); - uint schema_len = - MIN(strlen(theDataBaseSchema), NDB_MAX_SCHEMA_NAME_SIZE - 1); - strncpy(prefixName, theDataBase, NDB_MAX_DATABASE_NAME_SIZE - 1); - prefixName[db_len] = table_name_separator; - strncpy(prefixName+db_len+1, theDataBaseSchema, - NDB_MAX_SCHEMA_NAME_SIZE - 1); - prefixName[db_len+schema_len+1] = table_name_separator; - prefixName[db_len+schema_len+2] = '\0'; - prefixEnd = prefixName + db_len+schema_len + 2; + snprintf(theDataBase, sizeof(theDataBase), "%s", + aDataBase ? aDataBase : ""); + snprintf(theDataBaseSchema, sizeof(theDataBaseSchema), "%s", + aSchema ? aSchema : ""); + + int len = snprintf(prefixName, sizeof(prefixName), "%s%c%s%c", + theDataBase, table_name_separator, + theDataBaseSchema, table_name_separator); + prefixEnd = prefixName + (len < sizeof(prefixName) ? len : + sizeof(prefixName) - 1); NdbMutex_Lock(&createNdbMutex); diff --git a/sql/handler.cc b/sql/handler.cc index 0e1b2d62a4f..f4cd2901be1 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -385,17 +385,25 @@ int ha_report_binlog_offset_and_commit(THD *thd, #ifdef HAVE_INNOBASE_DB THD_TRANS *trans; trans = &thd->transaction.all; - if (trans->innobase_tid) + if (trans->innobase_tid && trans->innodb_active_trans) { + /* + If we updated some InnoDB tables (innodb_active_trans is true), the + binlog coords will be reported into InnoDB during the InnoDB commit + (innobase_report_binlog_offset_and_commit). But if we updated only + non-InnoDB tables, we need an explicit call to report it. + */ if ((error=innobase_report_binlog_offset_and_commit(thd, - trans->innobase_tid, - log_file_name, - end_offset))) + trans->innobase_tid, + log_file_name, + end_offset))) { my_error(ER_ERROR_DURING_COMMIT, MYF(0), error); error=1; } } + else if (opt_innodb_safe_binlog) // Don't report if not useful + innobase_store_binlog_offset_and_flush_log(log_file_name, end_offset); #endif return error; } diff --git a/sql/handler.h b/sql/handler.h index 3d5aaacb661..a9416b1b2c5 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -283,7 +283,7 @@ public: create_time(0), check_time(0), update_time(0), key_used_on_scan(MAX_KEY), active_index(MAX_KEY), ref_length(sizeof(my_off_t)), block_size(0), - raid_type(0), ft_handler(0), implicit_emptied(0), inited(NONE) + raid_type(0), ft_handler(0), inited(NONE), implicit_emptied(0) {} virtual ~handler(void) { /* TODO: DBUG_ASSERT(inited == NONE); */ } int ha_open(const char *name, int mode, int test_if_locked); diff --git a/sql/log.cc b/sql/log.cc index 89f8f2480e3..124439ae9eb 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2073,9 +2073,9 @@ bool MYSQL_LOG::cut_spurious_tail() name); DBUG_RETURN(1); } - sql_print_error("After InnoDB crash recovery, trying to truncate " - "the binary log '%s' at position %s corresponding to the " - "last committed transaction...", name, llstr(pos, llbuf1)); + sql_print_error("After InnoDB crash recovery, checking if the binary log " + "'%s' contains rolled back transactions which must be " + "removed from it...", name); /* If we have a too long binlog, cut. If too short, print error */ int fd= my_open(name, O_EXCL | O_APPEND | O_BINARY | O_WRONLY, MYF(MY_WME)); if (fd < 0) @@ -2091,10 +2091,17 @@ bool MYSQL_LOG::cut_spurious_tail() if (pos > (actual_size= my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME)))) { + /* + Note that when we have MyISAM rollback this error message should be + reconsidered. + */ sql_print_error("The binary log '%s' is shorter than its expected size " "(actual: %s, expected: %s) so it misses at least one " "committed transaction; so it should not be used for " - "replication.", name, llstr(actual_size, llbuf1), + "replication or point-in-time recovery. You would need " + "to restart slaves from a fresh master's data " + "snapshot ", + name, llstr(actual_size, llbuf1), llstr(pos, llbuf2)); error= 1; goto err; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 64739f348b4..eba37ed924b 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -869,7 +869,7 @@ extern ulong rpl_recovery_rank, thread_cache_size; extern ulong com_stat[(uint) SQLCOM_END], com_other, back_log; extern ulong specialflag, current_pid; extern ulong expire_logs_days, sync_binlog_period, sync_binlog_counter; -extern my_bool relay_log_purge; +extern my_bool relay_log_purge, opt_innodb_safe_binlog; extern uint test_flags,select_errors,ha_open_options; extern uint protocol_version, mysqld_port, dropping_tables; extern uint delay_key_write_options, lower_case_table_names; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b2d9266c0ce..7b36be3dd84 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2538,6 +2538,12 @@ server."); if (opt_innodb_safe_binlog) { + if (have_innodb != SHOW_OPTION_YES) + { + sql_print_error("Error: --innodb-safe-binlog is meaningful only if " + "the InnoDB storage engine is enabled in the server."); + unireg_abort(1); + } if (innobase_flush_log_at_trx_commit != 1) { sql_print_error("Warning: --innodb-safe-binlog is meaningful only if " @@ -4641,9 +4647,8 @@ replicating a LOAD DATA INFILE command.", effect). */ {"innodb_safe_binlog", OPT_INNODB_SAFE_BINLOG, - "After a crash recovery by InnoDB, truncate the binary log to the last \ -InnoDB committed transaction. Use only if this server updates ONLY InnoDB \ -tables.", + "After a crash recovery by InnoDB, truncate the binary log after the last " + "not-rolled-back statement/transaction.", (gptr*) &opt_innodb_safe_binlog, (gptr*) &opt_innodb_safe_binlog, 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0}, #endif |