Commit ad8dad86 authored by pekka@mysql.com's avatar pekka@mysql.com

ndb: do not crash on config mismatch if release compiled

parent 8bfa05f2
Next QMGR 1 Next QMGR 1
Next NDBCNTR 1000 Next NDBCNTR 1000
Next NDBFS 2000 Next NDBFS 2000
Next DBACC 3001 Next DBACC 3002
Next DBTUP 4013 Next DBTUP 4013
Next DBLQH 5042 Next DBLQH 5042
Next DBDICT 6006 Next DBDICT 6006
...@@ -393,6 +393,7 @@ Failed Create Table: ...@@ -393,6 +393,7 @@ Failed Create Table:
-------------------- --------------------
7173: Create table failed due to not sufficient number of fragment or 7173: Create table failed due to not sufficient number of fragment or
replica records. replica records.
3001: Fail create 1st fragment
4007 12001: Fail create 1st fragment 4007 12001: Fail create 1st fragment
4008 12002: Fail create 2nd fragment 4008 12002: Fail create 2nd fragment
4009 12003: Fail create 1st attribute in 1st fragment 4009 12003: Fail create 1st attribute in 1st fragment
......
...@@ -1062,7 +1062,21 @@ void Dbacc::execACCFRAGREQ(Signal* signal) ...@@ -1062,7 +1062,21 @@ void Dbacc::execACCFRAGREQ(Signal* signal)
{ {
const AccFragReq * const req = (AccFragReq*)&signal->theData[0]; const AccFragReq * const req = (AccFragReq*)&signal->theData[0];
jamEntry(); jamEntry();
if (ERROR_INSERTED(3001)) {
jam();
addFragRefuse(signal, 1);
CLEAR_ERROR_INSERT_VALUE;
return;
}
tabptr.i = req->tableId; tabptr.i = req->tableId;
#ifndef VM_TRACE
// config mismatch - do not crash if release compiled
if (tabptr.i >= ctablesize) {
jam();
addFragRefuse(signal, 800);
return;
}
#endif
ptrCheckGuard(tabptr, ctablesize, tabrec); ptrCheckGuard(tabptr, ctablesize, tabrec);
ndbrequire((req->reqInfo & 0xF) == ZADDFRAG); ndbrequire((req->reqInfo & 0xF) == ZADDFRAG);
ndbrequire(!getrootfragmentrec(signal, rootfragrecptr, req->fragId)); ndbrequire(!getrootfragmentrec(signal, rootfragrecptr, req->fragId));
......
...@@ -69,6 +69,17 @@ void Dbtup::execTUPFRAGREQ(Signal* signal) ...@@ -69,6 +69,17 @@ void Dbtup::execTUPFRAGREQ(Signal* signal)
Uint32 noOfAttributeGroups = signal->theData[12]; Uint32 noOfAttributeGroups = signal->theData[12];
Uint32 globalCheckpointIdIndicator = signal->theData[13]; Uint32 globalCheckpointIdIndicator = signal->theData[13];
#ifndef VM_TRACE
// config mismatch - do not crash if release compiled
if (regTabPtr.i >= cnoOfTablerec) {
ljam();
signal->theData[0] = userptr;
signal->theData[1] = 800;
sendSignal(userblockref, GSN_TUPFRAGREF, signal, 2, JBB);
return;
}
#endif
ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec); ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
if (cfirstfreeFragopr == RNIL) { if (cfirstfreeFragopr == RNIL) {
ljam(); ljam();
......
...@@ -1480,8 +1480,10 @@ runTestDictionaryPerf(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -1480,8 +1480,10 @@ runTestDictionaryPerf(NDBT_Context* ctx, NDBT_Step* step){
} }
int runFailAddFragment(NDBT_Context* ctx, NDBT_Step* step){ int runFailAddFragment(NDBT_Context* ctx, NDBT_Step* step){
static int acclst[] = { 3001 };
static int tuplst[] = { 4007, 4008, 4009, 4010, 4011, 4012 }; static int tuplst[] = { 4007, 4008, 4009, 4010, 4011, 4012 };
static int tuxlst[] = { 12001, 12002, 12003, 12004, 12005, 12006 }; static int tuxlst[] = { 12001, 12002, 12003, 12004, 12005, 12006 };
static unsigned acccnt = sizeof(acclst)/sizeof(acclst[0]);
static unsigned tupcnt = sizeof(tuplst)/sizeof(tuplst[0]); static unsigned tupcnt = sizeof(tuplst)/sizeof(tuplst[0]);
static unsigned tuxcnt = sizeof(tuxlst)/sizeof(tuxlst[0]); static unsigned tuxcnt = sizeof(tuxlst)/sizeof(tuxlst[0]);
...@@ -1509,6 +1511,19 @@ int runFailAddFragment(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -1509,6 +1511,19 @@ int runFailAddFragment(NDBT_Context* ctx, NDBT_Step* step){
(void)pDic->dropTable(tab.getName()); (void)pDic->dropTable(tab.getName());
for (int l = 0; l < loops; l++) { for (int l = 0; l < loops; l++) {
for (unsigned i0 = 0; i0 < acccnt; i0++) {
unsigned j = (l == 0 ? i0 : myRandom48(acccnt));
int errval = acclst[j];
g_info << "insert error node=" << nodeId << " value=" << errval << endl;
CHECK2(restarter.insertErrorInNode(nodeId, errval) == 0,
"failed to set error insert");
CHECK2(pDic->createTable(tab) != 0,
"failed to fail after error insert " << errval);
CHECK2(pDic->createTable(tab) == 0,
pDic->getNdbError());
CHECK2(pDic->dropTable(tab.getName()) == 0,
pDic->getNdbError());
}
for (unsigned i1 = 0; i1 < tupcnt; i1++) { for (unsigned i1 = 0; i1 < tupcnt; i1++) {
unsigned j = (l == 0 ? i1 : myRandom48(tupcnt)); unsigned j = (l == 0 ? i1 : myRandom48(tupcnt));
int errval = tuplst[j]; int errval = tuplst[j];
...@@ -1638,7 +1653,7 @@ TESTCASE("DictionaryPerf", ...@@ -1638,7 +1653,7 @@ TESTCASE("DictionaryPerf",
INITIALIZER(runTestDictionaryPerf); INITIALIZER(runTestDictionaryPerf);
} }
TESTCASE("FailAddFragment", TESTCASE("FailAddFragment",
"Fail add fragment or attribute in TUP or TUX\n"){ "Fail add fragment or attribute in ACC or TUP or TUX\n"){
INITIALIZER(runFailAddFragment); INITIALIZER(runFailAddFragment);
} }
NDBT_TESTSUITE_END(testDict); NDBT_TESTSUITE_END(testDict);
...@@ -1650,5 +1665,3 @@ int main(int argc, const char** argv){ ...@@ -1650,5 +1665,3 @@ int main(int argc, const char** argv){
myRandom48Init(NdbTick_CurrentMillisecond()); myRandom48Init(NdbTick_CurrentMillisecond());
return testDict.execute(argc, argv); return testDict.execute(argc, argv);
} }
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