Loading ndb/src/kernel/blocks/ERROR_codes.txt +6 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ Next DBTUP 4014 Next DBLQH 5043 Next DBDICT 6006 Next DBDIH 7178 Next DBTC 8038 Next DBTC 8039 Next CMVMI 9000 Next BACKUP 10022 Next DBUTIL 11002 Loading Loading @@ -285,6 +285,11 @@ ABORT OF TCKEYREQ 8037 : Invalid schema version in TCINDXREQ ------ 8038 : Simulate API disconnect just after SCAN_TAB_REQ CMVMI ----- 9000 Set RestartOnErrorInsert to restart -n Loading ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -311,6 +311,16 @@ void Cmvmi::execSTTOR(Signal* signal) jamEntry(); if (theStartPhase == 1){ jam(); if(theConfig.lockPagesInMainMemory()) { int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); return; } else if (theStartPhase == 3) { Loading @@ -330,18 +340,6 @@ void Cmvmi::execSTTOR(Signal* signal) signal->theData[2] = NodeInfo::REP; execOPEN_COMREQ(signal); globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); } else { jam(); if(theConfig.lockPagesInMainMemory()){ int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); } } Loading ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +36 −2 Original line number Diff line number Diff line Loading @@ -8619,6 +8619,20 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) * IF ANY TO RECEIVE. **********************************************************/ scanptr.p->scanState = ScanRecord::WAIT_AI; if (ERROR_INSERTED(8038)) { /** * Force API_FAILREQ */ DisconnectRep * const rep = (DisconnectRep *)signal->getDataPtrSend(); rep->nodeId = refToNode(apiConnectptr.p->ndbapiBlockref); rep->err = 8038; EXECUTE_DIRECT(CMVMI, GSN_DISCONNECT_REP, signal, 2); CLEAR_ERROR_INSERT_VALUE; } return; SCAN_error_check: Loading Loading @@ -8706,6 +8720,7 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr, jam(); ScanFragRecPtr ptr; ndbrequire(list.seize(ptr)); ptr.p->scanFragState = ScanFragRec::IDLE; ptr.p->scanRec = scanptr.i; ptr.p->scanFragId = 0; ptr.p->m_apiPtr = cdata[i]; Loading Loading @@ -9457,9 +9472,17 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanRecord* scanP = scanPtr.p; ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE); ScanRecord::ScanState old = scanPtr.p->scanState; scanPtr.p->scanState = ScanRecord::CLOSING_SCAN; scanPtr.p->m_close_scan_req = req_received; if (old == ScanRecord::WAIT_FRAGMENT_COUNT) { jam(); scanPtr.p->scanState = old; return; // Will continue on execDI_FCOUNTCONF } /** * Queue : Action * ============= : ================= Loading Loading @@ -9487,11 +9510,22 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanFragRecPtr curr = ptr; // Remove while iterating... running.next(ptr); if(curr.p->scanFragState == ScanFragRec::WAIT_GET_PRIMCONF){ switch(curr.p->scanFragState){ case ScanFragRec::IDLE: jam(); // real early abort ndbrequire(old == ScanRecord::WAIT_AI); running.release(curr); continue; case ScanFragRec::WAIT_GET_PRIMCONF: jam(); continue; case ScanFragRec::LQH_ACTIVE: jam(); break; default: jamLine(curr.p->scanFragState); ndbrequire(false); } ndbrequire(curr.p->scanFragState == ScanFragRec::LQH_ACTIVE); curr.p->startFragTimer(ctcTimer); curr.p->scanFragState = ScanFragRec::LQH_ACTIVE; Loading ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -390,6 +390,7 @@ Dbtup::commitRecord(Signal* signal, fragptr.p = regFragPtr; tabptr.p = regTabPtr; Uint32 hashValue = firstOpPtr.p->hashValue; if (opType == ZINSERT_DELETE) { ljam(); Loading @@ -412,6 +413,7 @@ Dbtup::commitRecord(Signal* signal, //-------------------------------------------------------------------- Uint32 saveOpType = regOperPtr->optype; regOperPtr->optype = ZINSERT; regOperPtr->hashValue = hashValue; operPtr.p = regOperPtr; checkDetachedTriggers(signal, Loading Loading @@ -444,6 +446,8 @@ Dbtup::commitRecord(Signal* signal, befOpPtr.p->changeMask.clear(); befOpPtr.p->changeMask.bitOR(attributeMask); befOpPtr.p->gci = regOperPtr->gci; befOpPtr.p->optype = ZUPDATE; befOpPtr.p->hashValue = hashValue; befOpPtr.p->optype = opType; operPtr.p = befOpPtr.p; Loading Loading @@ -478,11 +482,13 @@ Dbtup::commitRecord(Signal* signal, Uint32 fragPageId = befOpPtr.p->fragPageId; Uint32 pageIndex = befOpPtr.p->pageIndex; befOpPtr.p->optype = ZDELETE; befOpPtr.p->realPageId = befOpPtr.p->realPageIdC; befOpPtr.p->pageOffset = befOpPtr.p->pageOffsetC; befOpPtr.p->fragPageId = befOpPtr.p->fragPageIdC; befOpPtr.p->pageIndex = befOpPtr.p->pageIndexC; befOpPtr.p->gci = regOperPtr->gci; befOpPtr.p->hashValue = hashValue; befOpPtr.p->optype = opType; operPtr.p = befOpPtr.p; Loading ndb/test/ndbapi/testScan.cpp +40 −1 Original line number Diff line number Diff line Loading @@ -622,7 +622,7 @@ int runRestarter(NDBT_Context* ctx, NDBT_Step* step){ int nodeId = restarter.getDbNodeId(lastId); lastId = (lastId + 1) % restarter.getNumDbNodes(); if(restarter.restartOneDbNode(nodeId) != 0){ if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){ g_err << "Failed to restartNextDbNode" << endl; result = NDBT_FAILED; break; Loading Loading @@ -1080,6 +1080,39 @@ int runScanRestart(NDBT_Context* ctx, NDBT_Step* step){ } int runBug24447(NDBT_Context* ctx, NDBT_Step* step){ int loops = 1; //ctx->getNumLoops(); int records = ctx->getNumRecords(); int abort = ctx->getProperty("AbortProb", 15); NdbRestarter restarter; HugoTransactions hugoTrans(*ctx->getTab()); int i = 0; while (i<loops && !ctx->isTestStopped()) { g_info << i++ << ": "; int nodeId = restarter.getRandomNotMasterNodeId(rand()); if (nodeId == -1) nodeId = restarter.getMasterNodeId(); if (restarter.insertErrorInNode(nodeId, 8038) != 0) { ndbout << "Could not insert error in node="<<nodeId<<endl; return NDBT_FAILED; } for (Uint32 j = 0; i<10; i++) { hugoTrans.scanReadRecords(GETNDB(step), records, abort, 0, NdbOperation::LM_CommittedRead); } } restarter.insertErrorInAllNodes(0); return NDBT_OK; } NDBT_TESTSUITE(testScan); TESTCASE("ScanRead", "Verify scan requirement: It should be possible "\ Loading Loading @@ -1540,6 +1573,12 @@ TESTCASE("ScanRestart", STEP(runScanRestart); FINALIZER(runClearTable); } TESTCASE("Bug24447", ""){ INITIALIZER(runLoadTable); STEP(runBug24447); FINALIZER(runClearTable); } NDBT_TESTSUITE_END(testScan); int main(int argc, const char** argv){ Loading Loading
ndb/src/kernel/blocks/ERROR_codes.txt +6 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ Next DBTUP 4014 Next DBLQH 5043 Next DBDICT 6006 Next DBDIH 7178 Next DBTC 8038 Next DBTC 8039 Next CMVMI 9000 Next BACKUP 10022 Next DBUTIL 11002 Loading Loading @@ -285,6 +285,11 @@ ABORT OF TCKEYREQ 8037 : Invalid schema version in TCINDXREQ ------ 8038 : Simulate API disconnect just after SCAN_TAB_REQ CMVMI ----- 9000 Set RestartOnErrorInsert to restart -n Loading
ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -311,6 +311,16 @@ void Cmvmi::execSTTOR(Signal* signal) jamEntry(); if (theStartPhase == 1){ jam(); if(theConfig.lockPagesInMainMemory()) { int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); return; } else if (theStartPhase == 3) { Loading @@ -330,18 +340,6 @@ void Cmvmi::execSTTOR(Signal* signal) signal->theData[2] = NodeInfo::REP; execOPEN_COMREQ(signal); globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); } else { jam(); if(theConfig.lockPagesInMainMemory()){ int res = NdbMem_MemLockAll(); if(res != 0){ g_eventLogger.warning("Failed to memlock pages"); warningEvent("Failed to memlock pages"); } } sendSTTORRY(signal); } } Loading
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +36 −2 Original line number Diff line number Diff line Loading @@ -8619,6 +8619,20 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) * IF ANY TO RECEIVE. **********************************************************/ scanptr.p->scanState = ScanRecord::WAIT_AI; if (ERROR_INSERTED(8038)) { /** * Force API_FAILREQ */ DisconnectRep * const rep = (DisconnectRep *)signal->getDataPtrSend(); rep->nodeId = refToNode(apiConnectptr.p->ndbapiBlockref); rep->err = 8038; EXECUTE_DIRECT(CMVMI, GSN_DISCONNECT_REP, signal, 2); CLEAR_ERROR_INSERT_VALUE; } return; SCAN_error_check: Loading Loading @@ -8706,6 +8720,7 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr, jam(); ScanFragRecPtr ptr; ndbrequire(list.seize(ptr)); ptr.p->scanFragState = ScanFragRec::IDLE; ptr.p->scanRec = scanptr.i; ptr.p->scanFragId = 0; ptr.p->m_apiPtr = cdata[i]; Loading Loading @@ -9457,9 +9472,17 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanRecord* scanP = scanPtr.p; ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE); ScanRecord::ScanState old = scanPtr.p->scanState; scanPtr.p->scanState = ScanRecord::CLOSING_SCAN; scanPtr.p->m_close_scan_req = req_received; if (old == ScanRecord::WAIT_FRAGMENT_COUNT) { jam(); scanPtr.p->scanState = old; return; // Will continue on execDI_FCOUNTCONF } /** * Queue : Action * ============= : ================= Loading Loading @@ -9487,11 +9510,22 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ScanFragRecPtr curr = ptr; // Remove while iterating... running.next(ptr); if(curr.p->scanFragState == ScanFragRec::WAIT_GET_PRIMCONF){ switch(curr.p->scanFragState){ case ScanFragRec::IDLE: jam(); // real early abort ndbrequire(old == ScanRecord::WAIT_AI); running.release(curr); continue; case ScanFragRec::WAIT_GET_PRIMCONF: jam(); continue; case ScanFragRec::LQH_ACTIVE: jam(); break; default: jamLine(curr.p->scanFragState); ndbrequire(false); } ndbrequire(curr.p->scanFragState == ScanFragRec::LQH_ACTIVE); curr.p->startFragTimer(ctcTimer); curr.p->scanFragState = ScanFragRec::LQH_ACTIVE; Loading
ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -390,6 +390,7 @@ Dbtup::commitRecord(Signal* signal, fragptr.p = regFragPtr; tabptr.p = regTabPtr; Uint32 hashValue = firstOpPtr.p->hashValue; if (opType == ZINSERT_DELETE) { ljam(); Loading @@ -412,6 +413,7 @@ Dbtup::commitRecord(Signal* signal, //-------------------------------------------------------------------- Uint32 saveOpType = regOperPtr->optype; regOperPtr->optype = ZINSERT; regOperPtr->hashValue = hashValue; operPtr.p = regOperPtr; checkDetachedTriggers(signal, Loading Loading @@ -444,6 +446,8 @@ Dbtup::commitRecord(Signal* signal, befOpPtr.p->changeMask.clear(); befOpPtr.p->changeMask.bitOR(attributeMask); befOpPtr.p->gci = regOperPtr->gci; befOpPtr.p->optype = ZUPDATE; befOpPtr.p->hashValue = hashValue; befOpPtr.p->optype = opType; operPtr.p = befOpPtr.p; Loading Loading @@ -478,11 +482,13 @@ Dbtup::commitRecord(Signal* signal, Uint32 fragPageId = befOpPtr.p->fragPageId; Uint32 pageIndex = befOpPtr.p->pageIndex; befOpPtr.p->optype = ZDELETE; befOpPtr.p->realPageId = befOpPtr.p->realPageIdC; befOpPtr.p->pageOffset = befOpPtr.p->pageOffsetC; befOpPtr.p->fragPageId = befOpPtr.p->fragPageIdC; befOpPtr.p->pageIndex = befOpPtr.p->pageIndexC; befOpPtr.p->gci = regOperPtr->gci; befOpPtr.p->hashValue = hashValue; befOpPtr.p->optype = opType; operPtr.p = befOpPtr.p; Loading
ndb/test/ndbapi/testScan.cpp +40 −1 Original line number Diff line number Diff line Loading @@ -622,7 +622,7 @@ int runRestarter(NDBT_Context* ctx, NDBT_Step* step){ int nodeId = restarter.getDbNodeId(lastId); lastId = (lastId + 1) % restarter.getNumDbNodes(); if(restarter.restartOneDbNode(nodeId) != 0){ if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){ g_err << "Failed to restartNextDbNode" << endl; result = NDBT_FAILED; break; Loading Loading @@ -1080,6 +1080,39 @@ int runScanRestart(NDBT_Context* ctx, NDBT_Step* step){ } int runBug24447(NDBT_Context* ctx, NDBT_Step* step){ int loops = 1; //ctx->getNumLoops(); int records = ctx->getNumRecords(); int abort = ctx->getProperty("AbortProb", 15); NdbRestarter restarter; HugoTransactions hugoTrans(*ctx->getTab()); int i = 0; while (i<loops && !ctx->isTestStopped()) { g_info << i++ << ": "; int nodeId = restarter.getRandomNotMasterNodeId(rand()); if (nodeId == -1) nodeId = restarter.getMasterNodeId(); if (restarter.insertErrorInNode(nodeId, 8038) != 0) { ndbout << "Could not insert error in node="<<nodeId<<endl; return NDBT_FAILED; } for (Uint32 j = 0; i<10; i++) { hugoTrans.scanReadRecords(GETNDB(step), records, abort, 0, NdbOperation::LM_CommittedRead); } } restarter.insertErrorInAllNodes(0); return NDBT_OK; } NDBT_TESTSUITE(testScan); TESTCASE("ScanRead", "Verify scan requirement: It should be possible "\ Loading Loading @@ -1540,6 +1573,12 @@ TESTCASE("ScanRestart", STEP(runScanRestart); FINALIZER(runClearTable); } TESTCASE("Bug24447", ""){ INITIALIZER(runLoadTable); STEP(runBug24447); FINALIZER(runClearTable); } NDBT_TESTSUITE_END(testScan); int main(int argc, const char** argv){ Loading