mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
ndb - bug#24447
api disconnect just after SCAN_TABREQ ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: 1) add error insert for faking DISCONNECT of API just after SCAN_TABREQ 2) handle error :-) ndb/test/ndbapi/testScan.cpp: Add etstcase for bug 24447 ndb/test/run-test/daily-basic-tests.txt: Add etstcase for bug 24447
This commit is contained in:
@ -8619,6 +8619,20 @@ void Dbtc::execSCAN_TABREQ(Signal* signal)
|
|||||||
* IF ANY TO RECEIVE.
|
* IF ANY TO RECEIVE.
|
||||||
**********************************************************/
|
**********************************************************/
|
||||||
scanptr.p->scanState = ScanRecord::WAIT_AI;
|
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;
|
return;
|
||||||
|
|
||||||
SCAN_error_check:
|
SCAN_error_check:
|
||||||
@ -8706,6 +8720,7 @@ void Dbtc::initScanrec(ScanRecordPtr scanptr,
|
|||||||
jam();
|
jam();
|
||||||
ScanFragRecPtr ptr;
|
ScanFragRecPtr ptr;
|
||||||
ndbrequire(list.seize(ptr));
|
ndbrequire(list.seize(ptr));
|
||||||
|
ptr.p->scanFragState = ScanFragRec::IDLE;
|
||||||
ptr.p->scanRec = scanptr.i;
|
ptr.p->scanRec = scanptr.i;
|
||||||
ptr.p->scanFragId = 0;
|
ptr.p->scanFragId = 0;
|
||||||
ptr.p->m_apiPtr = cdata[i];
|
ptr.p->m_apiPtr = cdata[i];
|
||||||
@ -9457,9 +9472,17 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){
|
|||||||
|
|
||||||
ScanRecord* scanP = scanPtr.p;
|
ScanRecord* scanP = scanPtr.p;
|
||||||
ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE);
|
ndbrequire(scanPtr.p->scanState != ScanRecord::IDLE);
|
||||||
|
ScanRecord::ScanState old = scanPtr.p->scanState;
|
||||||
scanPtr.p->scanState = ScanRecord::CLOSING_SCAN;
|
scanPtr.p->scanState = ScanRecord::CLOSING_SCAN;
|
||||||
scanPtr.p->m_close_scan_req = req_received;
|
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
|
* Queue : Action
|
||||||
* ============= : =================
|
* ============= : =================
|
||||||
@ -9487,11 +9510,22 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){
|
|||||||
ScanFragRecPtr curr = ptr; // Remove while iterating...
|
ScanFragRecPtr curr = ptr; // Remove while iterating...
|
||||||
running.next(ptr);
|
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();
|
jam();
|
||||||
continue;
|
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->startFragTimer(ctcTimer);
|
||||||
curr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
|
curr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
|
||||||
|
@ -622,7 +622,7 @@ int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
|
|||||||
|
|
||||||
int nodeId = restarter.getDbNodeId(lastId);
|
int nodeId = restarter.getDbNodeId(lastId);
|
||||||
lastId = (lastId + 1) % restarter.getNumDbNodes();
|
lastId = (lastId + 1) % restarter.getNumDbNodes();
|
||||||
if(restarter.restartOneDbNode(nodeId) != 0){
|
if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){
|
||||||
g_err << "Failed to restartNextDbNode" << endl;
|
g_err << "Failed to restartNextDbNode" << endl;
|
||||||
result = NDBT_FAILED;
|
result = NDBT_FAILED;
|
||||||
break;
|
break;
|
||||||
@ -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);
|
NDBT_TESTSUITE(testScan);
|
||||||
TESTCASE("ScanRead",
|
TESTCASE("ScanRead",
|
||||||
"Verify scan requirement: It should be possible "\
|
"Verify scan requirement: It should be possible "\
|
||||||
@ -1540,6 +1573,12 @@ TESTCASE("ScanRestart",
|
|||||||
STEP(runScanRestart);
|
STEP(runScanRestart);
|
||||||
FINALIZER(runClearTable);
|
FINALIZER(runClearTable);
|
||||||
}
|
}
|
||||||
|
TESTCASE("Bug24447",
|
||||||
|
""){
|
||||||
|
INITIALIZER(runLoadTable);
|
||||||
|
STEP(runBug24447);
|
||||||
|
FINALIZER(runClearTable);
|
||||||
|
}
|
||||||
NDBT_TESTSUITE_END(testScan);
|
NDBT_TESTSUITE_END(testScan);
|
||||||
|
|
||||||
int main(int argc, const char** argv){
|
int main(int argc, const char** argv){
|
||||||
|
@ -438,6 +438,10 @@ max-time: 500
|
|||||||
cmd: testScan
|
cmd: testScan
|
||||||
args: -l 100 -n Scan-bug8262 T7
|
args: -l 100 -n Scan-bug8262 T7
|
||||||
|
|
||||||
|
max-time: 500
|
||||||
|
cmd: testScan
|
||||||
|
args: -n Bug24447 T1
|
||||||
|
|
||||||
max-time: 500
|
max-time: 500
|
||||||
cmd: testNodeRestart
|
cmd: testNodeRestart
|
||||||
args: -n Bug15587 T1
|
args: -n Bug15587 T1
|
||||||
|
Reference in New Issue
Block a user