mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
Moved NdbSchemaCon and NdbSchemaOp out of the public NdbApi, it can however still be used by old test programs. Added print oof indexes to desc. ndb/BinDist.sh: Removed AttrType.hpp from BinDist.sh ndb/include/ndbapi/Ndb.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp ndb/include/ndbapi/NdbApi.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp ndb/include/ndbapi/NdbConnection.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp Moved internal types to the class where they are used ndb/include/ndbapi/NdbIndexOperation.hpp: Use limit from ndbapi_limit.h ndb/include/ndbapi/NdbOperation.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp Remove faulty comment about how many attributes a key is allowed to consist of Removed unused member variables ndb/include/ndbapi/NdbRecAttr.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp ndb/include/ndbapi/NdbSchemaCon.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp ndb/include/ndbapi/NdbSchemaOp.hpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp Moved all "old" datatypes here, so if a test program is still using old type, include NdbSchemaCon.hpp ndb/include/ndbapi/ndbapi_limits.h: Corrected limitations, added some from AttrTyp.hpp ndb/src/Makefile: Remove newtonapi from Makefile ndb/src/kernel/blocks/backup/restore/Restore.hpp: Removed AttrType Include NdbSchemaCon since restore uses old types ndb/src/kernel/blocks/backup/restore/main.cpp: Include NdbOut ndb/src/mgmsrv/MgmtSrvr.cpp: Remov AttrType.hpp ndb/src/ndbapi/ClusterMgr.cpp: Remov AttrType.hpp ndb/src/ndbapi/Ndb.cpp: Removed NdbSchemaCon and NdbSchemaOp includes from public NdbApi Removed AttrType.hpp Moved internal types to the class where they are used ndb/src/ndbapi/NdbApiSignal.cpp: Removed AttrType.hpp ndb/src/ndbapi/NdbApiSignal.hpp: Removed AttrType.hpp ndb/src/ndbapi/NdbConnection.cpp: Moved internal type s to the class where they belong ndb/src/ndbapi/NdbDictionaryImpl.cpp: RemovedAttrType.hpp Use limits from ndbapi_limits.h ndb/src/ndbapi/NdbEventOperationImpl.cpp: Removed AttrType.hpp Moved printRecAttr to end since it depends on old types and need to include "NdbSchemaCon", function will be rewritten and moved to NdbRecAttr. It's also useful from other places where an attribute has been read into an NdbRecAttr. ndb/src/ndbapi/NdbIndexOperation.cpp: Use limitations from ndbapi_limits.h Moved internal tyeps to the class where they belongs ndb/src/ndbapi/NdbOperation.cpp: Use limits from ndbapi_limits.h ndb/src/ndbapi/NdbOperationDefine.cpp: Remove AttrType.hpp ndb/src/ndbapi/NdbOperationExec.cpp: Moved internal tyeps to the class where they belongs ndb/src/ndbapi/NdbOperationInt.cpp: RemovedAttrType.hpp Use limits from ndbapi_limits.h ndb/src/ndbapi/NdbOperationScan.cpp: RemovedAttrType.hpp Use limits from ndbapi_limits.h ndb/src/ndbapi/NdbOperationSearch.cpp: Removed AttrType.hpp Use limits from ndbapi_limits.h ndb/src/ndbapi/NdbResultSet.cpp: Moved the "internal" types to corresponding class ndb/src/ndbapi/NdbSchemaCon.cpp: Updated not to be included in public NdbApi ndb/src/ndbapi/NdbSchemaOp.cpp: Updated not to be included in public NdbApi ndb/src/ndbapi/NdbUtil.hpp: Removed AttrType.hpp ndb/src/ndbapi/Ndbif.cpp: Removed AttrType.hpp Removed NdbSchemaCon and NdbSchemaOp from public NdbApi Moved "interal" types to their corresponding class ndb/src/ndbapi/Ndbinit.cpp: Removed NdbSchemaCon and NdbSchemaOp from public NdbApi ndb/src/ndbapi/Ndblist.cpp: Removed NdbSchemaCon and NdbSchemaOp from public NdbApi Moved "internal" types to their corresponding class ndb/src/ndbapi/TransporterFacade.cpp: Removed AttrType.hpp ndb/src/ndbapi/TransporterFacade.hpp: Removed AttrType.hpp Moved internal definition of how many Ndb objects to create to here ndb/test/include/NDBT_Table.hpp: Removed old NdbSchema* Added function to print information about an index ndb/test/ndbapi/acid/acid.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/flexAsynch/flexAsynch.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/flexScan/flexScan.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/interpreterInTup/interpreterInTup.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/lmc-bench/src/user/userInterface.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/ronja/initronja/initronja.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/telco/msa.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/testDataBuffers/testDataBuffers.cpp: This test program uses old NdbScheaCon.hpp ndb/test/ndbapi/testNdbApi/testNdbApi.cpp: Remove AttrType.hpp Define max number of Ndb objects test should "try" to create. ndb/test/ndbapi/testRestartGci/testRestartGci.cpp: Moved "internal" datatypes to corresponding class, in this case Ndb class ndb/test/src/NDBT_ResultRow.cpp: This test program uses old NdbScheaCon.hpp But should soon use "printer" from NdbRecAttr ndb/test/src/NDBT_Table.cpp: Print table info more SQL like ndb/test/src/UtilTransactions.cpp: When AttrType.hpp, this hidden bug was discovered. Using wrong enum types in switch. ndb/tools/desc/desc.cpp: Alos print info about indexes for a table
218 lines
5.9 KiB
C++
218 lines
5.9 KiB
C++
/* Copyright (C) 2003 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#include "NDBT_Test.hpp"
|
|
#include "NDBT_ReturnCodes.h"
|
|
#include "HugoTransactions.hpp"
|
|
#include "UtilTransactions.hpp"
|
|
#include "NdbRestarter.hpp"
|
|
|
|
|
|
/**
|
|
* Global vector to keep track of
|
|
* records stored in db
|
|
*/
|
|
|
|
struct SavedRecord {
|
|
int m_gci;
|
|
BaseString m_str;
|
|
SavedRecord(int _gci, BaseString _str){
|
|
m_gci = _gci;
|
|
m_str.assign(_str);
|
|
}
|
|
SavedRecord(){
|
|
m_gci = 0;
|
|
m_str = "";
|
|
};
|
|
};
|
|
Vector<SavedRecord> savedRecords;
|
|
|
|
|
|
#define CHECK(b) if (!(b)) { \
|
|
ndbout << "ERR: "<< step->getName() \
|
|
<< " failed on line " << __LINE__ << endl; \
|
|
result = NDBT_FAILED; \
|
|
break; }
|
|
|
|
int runInsertRememberGci(NDBT_Context* ctx, NDBT_Step* step){
|
|
int result = NDBT_OK;
|
|
int records = ctx->getNumRecords();
|
|
HugoOperations hugoOps(*ctx->getTab());
|
|
Ndb* pNdb = GETNDB(step);
|
|
int i = 0;
|
|
|
|
while(ctx->isTestStopped() == false && i < records){
|
|
// Insert record and read it in same transaction
|
|
CHECK(hugoOps.startTransaction(pNdb) == 0);
|
|
CHECK(hugoOps.pkInsertRecord(pNdb, i) == 0);
|
|
if (hugoOps.execute_NoCommit(pNdb) != 0){
|
|
ndbout << "Could not insert record " << i << endl;
|
|
result = NDBT_FAILED;
|
|
break;
|
|
}
|
|
CHECK(hugoOps.pkReadRecord(pNdb, i, false) == 0);
|
|
if (hugoOps.execute_Commit(pNdb) != 0){
|
|
ndbout << "Did not find record in DB " << i << endl;
|
|
result = NDBT_FAILED;
|
|
break;
|
|
}
|
|
savedRecords.push_back(SavedRecord(hugoOps.getRecordGci(0),
|
|
hugoOps.getRecordStr(0)));
|
|
|
|
CHECK(hugoOps.closeTransaction(pNdb) == 0);
|
|
i++;
|
|
};
|
|
|
|
return result;
|
|
}
|
|
|
|
int runRestartGciControl(NDBT_Context* ctx, NDBT_Step* step){
|
|
int records = ctx->getNumRecords();
|
|
Ndb* pNdb = GETNDB(step);
|
|
UtilTransactions utilTrans(*ctx->getTab());
|
|
NdbRestarter restarter;
|
|
|
|
// Wait until we have enough records in db
|
|
int count = 0;
|
|
while (count < records){
|
|
if (utilTrans.selectCount(pNdb, 64, &count) != 0){
|
|
ctx->stopTest();
|
|
return NDBT_FAILED;
|
|
}
|
|
}
|
|
|
|
// Restart cluster with abort
|
|
if (restarter.restartAll(false, false, true) != 0){
|
|
ctx->stopTest();
|
|
return NDBT_FAILED;
|
|
}
|
|
|
|
// Stop the other thread
|
|
ctx->stopTest();
|
|
|
|
if (restarter.waitClusterStarted(300) != 0){
|
|
return NDBT_FAILED;
|
|
}
|
|
|
|
if (pNdb->waitUntilReady() != 0){
|
|
return NDBT_FAILED;
|
|
}
|
|
|
|
return NDBT_OK;
|
|
}
|
|
|
|
int runVerifyInserts(NDBT_Context* ctx, NDBT_Step* step){
|
|
int result = NDBT_OK;
|
|
Ndb* pNdb = GETNDB(step);
|
|
UtilTransactions utilTrans(*ctx->getTab());
|
|
HugoOperations hugoOps(*ctx->getTab());
|
|
NdbRestarter restarter;
|
|
|
|
int restartGCI = pNdb->NdbTamper(Ndb::ReadRestartGCI, 0);
|
|
|
|
ndbout << "restartGCI = " << restartGCI << endl;
|
|
int count = 0;
|
|
if (utilTrans.selectCount(pNdb, 64, &count) != 0){
|
|
return NDBT_FAILED;
|
|
}
|
|
|
|
// RULE1: The vector with saved records should have exactly as many
|
|
// records with lower or same gci as there are in DB
|
|
int recordsWithLowerOrSameGci = 0;
|
|
for (unsigned i = 0; i < savedRecords.size(); i++){
|
|
if (savedRecords[i].m_gci <= restartGCI)
|
|
recordsWithLowerOrSameGci++;
|
|
}
|
|
if (recordsWithLowerOrSameGci != count){
|
|
ndbout << "ERR: Wrong number of expected records" << endl;
|
|
result = NDBT_FAILED;
|
|
}
|
|
|
|
|
|
// RULE2: The records found in db should have same or lower
|
|
// gci as in the vector
|
|
for (unsigned i = 0; i < savedRecords.size(); i++){
|
|
CHECK(hugoOps.startTransaction(pNdb) == 0);
|
|
CHECK(hugoOps.pkReadRecord(pNdb, i, false) == 0);
|
|
if (hugoOps.execute_Commit(pNdb) != 0){
|
|
// Record was not found in db'
|
|
|
|
// Check record gci
|
|
if (savedRecords[i].m_gci <= restartGCI){
|
|
ndbout << "ERR: Record "<<i<<" should have existed" << endl;
|
|
result = NDBT_FAILED;
|
|
}
|
|
} else {
|
|
// Record was found in db
|
|
BaseString str = hugoOps.getRecordStr(0);
|
|
// Check record string
|
|
if (!(savedRecords[i].m_str == str)){
|
|
ndbout << "ERR: Record "<<i<<" str did not match "<< endl;
|
|
result = NDBT_FAILED;
|
|
}
|
|
// Check record gci
|
|
if (savedRecords[i].m_gci > restartGCI){
|
|
ndbout << "ERR: Record "<<i<<" should not have existed" << endl;
|
|
result = NDBT_FAILED;
|
|
}
|
|
}
|
|
|
|
CHECK(hugoOps.closeTransaction(pNdb) == 0);
|
|
}
|
|
|
|
|
|
ndbout << "There are " << count << " records in db" << endl;
|
|
ndbout << "There are " << savedRecords.size()
|
|
<< " records in vector" << endl;
|
|
|
|
ndbout << "There are " << recordsWithLowerOrSameGci
|
|
<< " records with lower or same gci than " << restartGCI << endl;
|
|
|
|
return result;
|
|
}
|
|
|
|
int runClearGlobals(NDBT_Context* ctx, NDBT_Step* step){
|
|
savedRecords.clear();
|
|
return NDBT_OK;
|
|
}
|
|
|
|
int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
|
|
int records = ctx->getNumRecords();
|
|
|
|
UtilTransactions utilTrans(*ctx->getTab());
|
|
if (utilTrans.clearTable2(GETNDB(step), records, 240) != 0){
|
|
return NDBT_FAILED;
|
|
}
|
|
return NDBT_OK;
|
|
}
|
|
|
|
|
|
NDBT_TESTSUITE(testRestartGci);
|
|
TESTCASE("InsertRestartGci",
|
|
"Verify that only expected records are still in NDB\n"
|
|
"after a restart" ){
|
|
INITIALIZER(runClearTable);
|
|
INITIALIZER(runClearGlobals);
|
|
STEP(runInsertRememberGci);
|
|
STEP(runRestartGciControl);
|
|
VERIFIER(runVerifyInserts);
|
|
FINALIZER(runClearTable);
|
|
}
|
|
NDBT_TESTSUITE_END(testRestartGci);
|
|
|
|
int main(int argc, const char** argv){
|
|
return testRestartGci.execute(argc, argv);
|
|
}
|