summaryrefslogtreecommitdiff
path: root/ndb
diff options
context:
space:
mode:
Diffstat (limited to 'ndb')
-rw-r--r--ndb/src/kernel/blocks/backup/restore/Restore.cpp11
-rw-r--r--ndb/src/kernel/blocks/backup/restore/Restore.hpp51
-rw-r--r--ndb/src/kernel/blocks/backup/restore/consumer.hpp1
-rw-r--r--ndb/src/kernel/blocks/backup/restore/consumer_restore.cpp27
-rw-r--r--ndb/src/kernel/blocks/backup/restore/consumer_restore.hpp1
-rw-r--r--ndb/src/kernel/blocks/backup/restore/main.cpp14
-rw-r--r--ndb/src/mgmclient/CommandInterpreter.cpp10
7 files changed, 101 insertions, 14 deletions
diff --git a/ndb/src/kernel/blocks/backup/restore/Restore.cpp b/ndb/src/kernel/blocks/backup/restore/Restore.cpp
index f60480ad7bf..9e1ad228ee5 100644
--- a/ndb/src/kernel/blocks/backup/restore/Restore.cpp
+++ b/ndb/src/kernel/blocks/backup/restore/Restore.cpp
@@ -88,7 +88,7 @@ RestoreMetaData::~RestoreMetaData(){
allTables.clear();
}
-const TableS *
+TableS *
RestoreMetaData::getTable(Uint32 tableId) const {
for(Uint32 i= 0; i < allTables.size(); i++)
if(allTables[i]->getTableId() == tableId)
@@ -201,6 +201,8 @@ TableS::TableS(NdbTableImpl* tableImpl)
{
m_dictTable = tableImpl;
m_noOfNullable = m_nullBitmaskSize = 0;
+ m_auto_val_id= ~(Uint32)0;
+ m_max_auto_val= 0;
for (int i = 0; i < tableImpl->getNoOfColumns(); i++)
createAttr(tableImpl->getColumn(i));
@@ -269,7 +271,7 @@ int TupleS::getNoOfAttributes() const {
return m_currentTable->getNoOfAttributes();
};
-const TableS * TupleS::getTable() const {
+TableS * TupleS::getTable() const {
return m_currentTable;
};
@@ -282,7 +284,7 @@ AttributeData * TupleS::getData(int i) const{
};
bool
-TupleS::prepareRecord(const TableS & tab){
+TupleS::prepareRecord(TableS & tab){
if (allAttrData) {
if (getNoOfAttributes() == tab.getNoOfAttributes())
{
@@ -698,6 +700,9 @@ void TableS::createAttr(NdbDictionary::Column *column)
d->attrId = allAttributesDesc.size();
allAttributesDesc.push_back(d);
+ if (d->m_column->getAutoIncrement())
+ m_auto_val_id= d->attrId;
+
if(d->m_column->getPrimaryKey() /* && not variable */)
{
m_fixedKeys.push_back(d);
diff --git a/ndb/src/kernel/blocks/backup/restore/Restore.hpp b/ndb/src/kernel/blocks/backup/restore/Restore.hpp
index 5a705740c69..8ca68fd9b23 100644
--- a/ndb/src/kernel/blocks/backup/restore/Restore.hpp
+++ b/ndb/src/kernel/blocks/backup/restore/Restore.hpp
@@ -91,9 +91,9 @@ class TupleS {
private:
friend class RestoreDataIterator;
- const TableS *m_currentTable;
+ TableS *m_currentTable;
AttributeData *allAttrData;
- bool prepareRecord(const TableS &);
+ bool prepareRecord(TableS &);
public:
TupleS() {
@@ -108,7 +108,7 @@ public:
TupleS(const TupleS& tuple); // disable copy constructor
TupleS & operator=(const TupleS& tuple);
int getNoOfAttributes() const;
- const TableS * getTable() const;
+ TableS * getTable() const;
const AttributeDesc * getDesc(int i) const;
AttributeData * getData(int i) const;
}; // class TupleS
@@ -130,6 +130,9 @@ class TableS {
Uint32 m_noOfNullable;
Uint32 m_nullBitmaskSize;
+ Uint32 m_auto_val_id;
+ Uint64 m_max_auto_val;
+
int pos;
void createAttr(NdbDictionary::Column *column);
@@ -170,6 +173,42 @@ public:
return allAttributesDesc.size();
};
+ bool have_auto_inc() const {
+ return m_auto_val_id != ~(Uint32)0;
+ };
+
+ bool have_auto_inc(Uint32 id) const {
+ return m_auto_val_id == id;
+ };
+
+ Uint64 get_max_auto_val() const {
+ return m_max_auto_val;
+ };
+
+ void update_max_auto_val(const char *data, int size) {
+ Uint64 val= 0;
+ switch(size){
+ case 8:
+ val= *(Uint8*)data;
+ break;
+ case 16:
+ val= *(Uint16*)data;
+ break;
+ case 24:
+ val= (0xffffff)&*(Uint32*)data;
+ break;
+ case 32:
+ val= *(Uint32*)data;
+ break;
+ case 64:
+ val= *(Uint64*)data;
+ break;
+ default:
+ return;
+ };
+ if(val > m_max_auto_val)
+ m_max_auto_val= val;
+ };
/**
* Get attribute descriptor
*/
@@ -245,7 +284,7 @@ public:
Uint32 getNoOfTables() const { return allTables.size();}
const TableS * operator[](int i) const { return allTables[i];}
- const TableS * getTable(Uint32 tableId) const;
+ TableS * getTable(Uint32 tableId) const;
Uint32 getStopGCP() const;
}; // RestoreMetaData
@@ -254,7 +293,7 @@ public:
class RestoreDataIterator : public BackupFile {
const RestoreMetaData & m_metaData;
Uint32 m_count;
- const TableS* m_currentTable;
+ TableS* m_currentTable;
TupleS m_tuple;
public:
@@ -278,7 +317,7 @@ public:
LE_UPDATE
};
EntryType m_type;
- const TableS * m_table;
+ TableS * m_table;
Vector<AttributeS*> m_values;
Vector<AttributeS*> m_values_e;
AttributeS *add_attr() {
diff --git a/ndb/src/kernel/blocks/backup/restore/consumer.hpp b/ndb/src/kernel/blocks/backup/restore/consumer.hpp
index 0b7b517c666..692c814159f 100644
--- a/ndb/src/kernel/blocks/backup/restore/consumer.hpp
+++ b/ndb/src/kernel/blocks/backup/restore/consumer.hpp
@@ -30,6 +30,7 @@ public:
virtual void endOfTuples(){}
virtual void logEntry(const LogEntry &){}
virtual void endOfLogEntrys(){}
+ virtual bool finalize_table(const TableS &){return true;}
};
#endif
diff --git a/ndb/src/kernel/blocks/backup/restore/consumer_restore.cpp b/ndb/src/kernel/blocks/backup/restore/consumer_restore.cpp
index c132bccee75..fb82570b0b9 100644
--- a/ndb/src/kernel/blocks/backup/restore/consumer_restore.cpp
+++ b/ndb/src/kernel/blocks/backup/restore/consumer_restore.cpp
@@ -131,6 +131,21 @@ BackupRestore::get_table(const NdbDictionary::Table* tab){
}
bool
+BackupRestore::finalize_table(const TableS & table){
+ bool ret= true;
+ if (!m_restore && !m_restore_meta)
+ return ret;
+ if (table.have_auto_inc())
+ {
+ Uint64 max_val= table.get_max_auto_val();
+ Uint64 auto_val= m_ndb->readAutoIncrementValue(get_table(table.m_dictTable));
+ if (max_val+1 > auto_val || auto_val == ~(Uint64)0)
+ ret= m_ndb->setAutoIncrementValue(get_table(table.m_dictTable), max_val+1, false);
+ }
+ return ret;
+}
+
+bool
BackupRestore::table(const TableS & table){
if (!m_restore && !m_restore_meta)
return true;
@@ -179,6 +194,9 @@ BackupRestore::table(const TableS & table){
err << "Unable to find table: " << split[2].c_str() << endl;
return false;
}
+ if(m_restore_meta){
+ m_ndb->setAutoIncrementValue(tab, ~(Uint64)0, false);
+ }
const NdbDictionary::Table* null = 0;
m_new_tables.fill(table.m_dictTable->getTableId(), null);
m_new_tables[table.m_dictTable->getTableId()] = tab;
@@ -316,6 +334,10 @@ void BackupRestore::tuple_a(restore_callback_t *cb)
int arraySize = attr_desc->arraySize;
char * dataPtr = attr_data->string_value;
Uint32 length = (size * arraySize) / 8;
+
+ if (j == 0 && tup.getTable()->have_auto_inc(i))
+ tup.getTable()->update_max_auto_val(dataPtr,size);
+
if (attr_desc->m_column->getPrimaryKey())
{
if (j == 1) continue;
@@ -510,8 +532,11 @@ BackupRestore::logEntry(const LogEntry & tup)
int arraySize = attr->Desc->arraySize;
const char * dataPtr = attr->Data.string_value;
+ if (tup.m_table->have_auto_inc(attr->Desc->attrId))
+ tup.m_table->update_max_auto_val(dataPtr,size);
+
const Uint32 length = (size / 8) * arraySize;
- if (attr->Desc->m_column->getPrimaryKey())
+ if (attr->Desc->m_column->getPrimaryKey())
op->equal(attr->Desc->attrId, dataPtr, length);
else
op->setValue(attr->Desc->attrId, dataPtr, length);
diff --git a/ndb/src/kernel/blocks/backup/restore/consumer_restore.hpp b/ndb/src/kernel/blocks/backup/restore/consumer_restore.hpp
index ca336eeea4f..59e2734ea1f 100644
--- a/ndb/src/kernel/blocks/backup/restore/consumer_restore.hpp
+++ b/ndb/src/kernel/blocks/backup/restore/consumer_restore.hpp
@@ -59,6 +59,7 @@ public:
virtual void endOfTuples();
virtual void logEntry(const LogEntry &);
virtual void endOfLogEntrys();
+ virtual bool finalize_table(const TableS &);
void connectToMysql();
Ndb * m_ndb;
bool m_restore;
diff --git a/ndb/src/kernel/blocks/backup/restore/main.cpp b/ndb/src/kernel/blocks/backup/restore/main.cpp
index 5708415c61e..f7b1479cc93 100644
--- a/ndb/src/kernel/blocks/backup/restore/main.cpp
+++ b/ndb/src/kernel/blocks/backup/restore/main.cpp
@@ -355,6 +355,20 @@ main(int argc, const char** argv)
logIter.validateFooter(); //not implemented
for (i= 0; i < g_consumers.size(); i++)
g_consumers[i]->endOfLogEntrys();
+ for(i = 0; i<metaData.getNoOfTables(); i++)
+ {
+ if (checkSysTable(metaData[i]->getTableName()))
+ {
+ for(Uint32 j= 0; j < g_consumers.size(); j++)
+ if (!g_consumers[j]->finalize_table(* metaData[i]))
+ {
+ ndbout_c("Restore: Failed to finalize restore table: %s. "
+ "Exiting...",
+ metaData[i]->getTableName());
+ return -11;
+ }
+ }
+ }
}
}
clearConsumers();
diff --git a/ndb/src/mgmclient/CommandInterpreter.cpp b/ndb/src/mgmclient/CommandInterpreter.cpp
index 304c4e9b4dd..7560a59a1ef 100644
--- a/ndb/src/mgmclient/CommandInterpreter.cpp
+++ b/ndb/src/mgmclient/CommandInterpreter.cpp
@@ -598,10 +598,12 @@ CommandInterpreter::executeHelp(char* parameters)
<< endl;
ndbout << "<category> = ";
- for(int i = 0; i<CFG_MIN_LOGLEVEL; i++){
- ndbout << ndb_mgm_get_event_category_string((ndb_mgm_event_category)i);
- if (i < CFG_MIN_LOGLEVEL - 1) {
- ndbout << " | ";
+ for(int i = CFG_MIN_LOGLEVEL; i <= CFG_MAX_LOGLEVEL; i++){
+ const char *str= ndb_mgm_get_event_category_string((ndb_mgm_event_category)i);
+ if (str) {
+ if (i != CFG_MIN_LOGLEVEL)
+ ndbout << " | ";
+ ndbout << str;
}
}
ndbout << endl;