Commit d2a0c95a authored by gni/root@dev3-221.dev.cn.tlan's avatar gni/root@dev3-221.dev.cn.tlan

Merge dev3-221.dev.cn.tlan:/home/ngb/mysql/mysql-5.1/mysql-5.1-new-ndb

into  dev3-221.dev.cn.tlan:/home/ngb/mysql/mysql-5.1/mysql-5.1-new-ndb-bj
parents 113a84bd 525801e3
......@@ -24,6 +24,7 @@
#include <NdbHost.h>
#include <NdbConfig.h>
#include <Configuration.hpp>
#include "EventLogger.hpp"
#include <NdbAutoPtr.hpp>
......@@ -39,7 +40,7 @@ static void dumpJam(FILE* jamStream,
Uint32 thrdTheEmulatedJamIndex,
Uint8 thrdTheEmulatedJam[]);
extern EventLogger g_eventLogger;
const char*
ErrorReporter::formatTimeStampString(){
TimeModule DateTime; /* To create "theDateTimeString" */
......@@ -196,6 +197,9 @@ ErrorReporter::handleError(int messageID,
WriteMessage(messageID, problemData,
objRef, theEmulatedJamIndex, theEmulatedJam);
g_eventLogger.info(problemData);
g_eventLogger.info(objRef);
childReportError(messageID);
if(messageID == NDBD_EXIT_ERROR_INSERT){
......
......@@ -41,6 +41,7 @@ public:
NODE_GROUP_MAP *m_nodegroup_map;
uint m_nodegroup_map_len;
virtual bool has_temp_error() {return false;}
virtual bool table_equal(const TableS &) {return true;}
};
#endif
......@@ -665,6 +665,62 @@ err:
return result;
}
bool
BackupRestore::table_equal(const TableS &tableS){
const char *tablename = tableS.getTableName();
if(tableS.m_dictTable == NULL){
ndbout<<"Table %s has no m_dictTable " << tablename << endl;
return false;
}
/**
* Ignore blob tables
*/
if(match_blob(tablename) >= 0)
return true;
const NdbTableImpl & tmptab = NdbTableImpl::getImpl(* tableS.m_dictTable);
if ((int) tmptab.m_indexType != (int) NdbDictionary::Index::Undefined){
return true;
}
BaseString tmp(tablename);
Vector<BaseString> split;
if(tmp.split(split, "/") != 3){
err << "Invalid table name format " << tablename << endl;
return false;
}
m_ndb->setDatabaseName(split[0].c_str());
m_ndb->setSchemaName(split[1].c_str());
NdbDictionary::Dictionary* dict = m_ndb->getDictionary();
const NdbDictionary::Table* tab = dict->getTable(split[2].c_str());
if(tab == 0){
err << "Unable to find table: " << split[2].c_str() << endl;
return false;
}
if(tab->getNoOfColumns() != tableS.m_dictTable->getNoOfColumns())
{
ndbout_c("m_columns.size %d != %d",tab->getNoOfColumns(),
tableS.m_dictTable->getNoOfColumns());
return false;
}
for(int i = 0; i<tab->getNoOfColumns(); i++)
{
if(!tab->getColumn(i)->equal(*(tableS.m_dictTable->getColumn(i))))
{
ndbout_c("m_columns %s != %s",tab->getColumn(i)->getName(),
tableS.m_dictTable->getColumn(i)->getName());
return false;
}
}
return true;
}
bool
BackupRestore::createSystable(const TableS & tables){
const char *tablename = tables.getTableName();
......
......@@ -73,6 +73,7 @@ public:
virtual bool finalize_table(const TableS &);
virtual bool has_temp_error();
virtual bool createSystable(const TableS & table);
virtual bool table_equal(const TableS & table);
virtual bool update_apply_status(const RestoreMetaData &metaData);
void connectToMysql();
bool map_in_frm(char *new_data, const char *data,
......
......@@ -50,6 +50,7 @@ NDB_STD_OPTS_VARS;
static bool ga_restore_epoch = false;
static bool ga_restore = false;
static bool ga_print = false;
static bool ga_skip_table_check = false;
static int _print = 0;
static int _print_meta = 0;
static int _print_data = 0;
......@@ -91,6 +92,9 @@ static struct my_option my_long_options[] =
NDB_REP_DB "." NDB_APPLY_TABLE " with id 0 will be updated/inserted.",
(gptr*) &ga_restore_epoch, (gptr*) &ga_restore_epoch, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "skip-table-check", 's', "Skip table structure check during restore of data",
(gptr*) &ga_skip_table_check, (gptr*) &ga_skip_table_check, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
{ "parallelism", 'p',
"No of parallel transactions during restore of data."
"(parallelism can be 1 to 1024)",
......@@ -459,6 +463,8 @@ main(int argc, char** argv)
g_options.appfmt(" -n %d", ga_nodeId);
if (_restore_meta)
g_options.appfmt(" -m");
if (ga_skip_table_check)
g_options.appfmt(" -s");
if (_restore_data)
g_options.appfmt(" -r");
if (ga_restore_epoch)
......@@ -589,6 +595,20 @@ main(int argc, char** argv)
{
if(_restore_data || _print_data)
{
if (!ga_skip_table_check){
for(i=0; i < metaData.getNoOfTables(); i++){
if (checkSysTable(metaData, i))
{
for(Uint32 j= 0; j < g_consumers.size(); j++)
if (!g_consumers[j]->table_equal(* metaData[i]))
{
err << "Restore: Failed to restore data, ";
err << metaData[i]->getTableName() << " table structure doesn't match backup ... Exiting " << endl;
exitHandler(NDBT_FAILED);
}
}
}
}
RestoreDataIterator dataIter(metaData, &free_data_callback);
// Read data file header
......
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