Commit 37b4b89e authored by unknown's avatar unknown
Browse files

bug8262 - ndb

  crash if scan is poped from queue before all attrinfo has arrived


ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
  only restart scan if all attrinfo has arrived
  otherwise just set remove from queue and set state
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
  new error insert - force send attrinfo
ndb/test/ndbapi/testScan.cpp:
  new test bug8262 many threads - scanning small tables
ndb/test/run-test/daily-basic-tests.txt:
  run new test case in autotest
parent 4d1441da
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -8719,13 +8719,14 @@ void Dblqh::finishScanrec(Signal* signal)
    return;
  }
  ndbrequire(restart.p->scanState == ScanRecord::IN_QUEUE);
  ScanRecordPtr tmpScan = scanptr;
  TcConnectionrecPtr tmpTc = tcConnectptr;
  
  tcConnectptr.i = restart.p->scanTcrec;
  ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  restart.p->scanNumber = scanNumber;
  restart.p->scanState = ScanRecord::WAIT_ACC_SCAN;
  queue.remove(restart);
  scans.add(restart);
@@ -8741,9 +8742,17 @@ void Dblqh::finishScanrec(Signal* signal)
#endif
  }
  restart.p->scanState = ScanRecord::SCAN_FREE; // set in initScanRec
  if(tcConnectptr.p->transactionState == TcConnectionrec::SCAN_STATE_USED)
  {
    jam();
    scanptr = restart;
    continueAfterReceivingAllAiLab(signal);  
  
  }
  else
  {
    ndbrequire(tcConnectptr.p->transactionState == TcConnectionrec::WAIT_SCAN_AI);
  }
  scanptr = tmpScan;
  tcConnectptr = tmpTc;
}//Dblqh::finishScanrec()
+4 −0
Original line number Diff line number Diff line
@@ -9028,6 +9028,8 @@ void Dbtc::execDIGETPRIMCONF(Signal* signal)
  scanFragptr.p->lqhBlockref = ref;
  scanFragptr.p->m_connectCount = getNodeInfo(tnodeid).m_connectCount;
  sendScanFragReq(signal, scanptr.p, scanFragptr.p);
  if(ERROR_INSERTED(8035))
    globalTransporterRegistry.performSend();
  attrbufptr.i = cachePtr.p->firstAttrbuf;
  while (attrbufptr.i != RNIL) {
    jam();
@@ -9037,6 +9039,8 @@ void Dbtc::execDIGETPRIMCONF(Signal* signal)
                 attrbufptr.p,
                 ref);
    attrbufptr.i = attrbufptr.p->attrbuf[ZINBUF_NEXT];
    if(ERROR_INSERTED(8035))
      globalTransporterRegistry.performSend();
  }//while
  scanFragptr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
  scanFragptr.p->startFragTimer(ctcTimer);
+27 −3
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ getTable(Ndb* pNdb, int i){

int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  
  int records = ctx->getNumRecords();
  int records = ctx->getProperty("Rows", ctx->getNumRecords());

  HugoTransactions hugoTrans(*ctx->getTab());
  if (hugoTrans.loadTable(GETNDB(step), records) != 0){
    return NDBT_FAILED;
@@ -264,7 +265,7 @@ int runVerifyTable(NDBT_Context* ctx, NDBT_Step* step){

int runScanRead(NDBT_Context* ctx, NDBT_Step* step){
  int loops = ctx->getNumLoops();
  int records = ctx->getNumRecords();
  int records = ctx->getProperty("Rows", ctx->getNumRecords());
  int parallelism = ctx->getProperty("Parallelism", 240);
  int abort = ctx->getProperty("AbortProb", 5);

@@ -376,6 +377,19 @@ int runScanReadError(NDBT_Context* ctx, NDBT_Step* step){
  return result;
}

int
runInsertError(NDBT_Context* ctx, NDBT_Step* step){
  int error = ctx->getProperty("ErrorCode");
  NdbRestarter restarter;

  ctx->setProperty("ErrorCode", (Uint32)0);
  if (restarter.insertErrorInAllNodes(error) != 0){
    ndbout << "Could not insert error in all nodes "<<endl;
    return NDBT_FAILED;
  }
  return NDBT_OK;
}     

int runScanReadErrorOneNode(NDBT_Context* ctx, NDBT_Step* step){
  int result = NDBT_OK;
  int loops = ctx->getNumLoops();
@@ -1221,6 +1235,16 @@ TESTCASE("ScanRead100",
  STEPS(runScanRead, 100);
  FINALIZER(runClearTable);
}
TESTCASE("Scan-bug8262", 
	 ""){
  TC_PROPERTY("Rows", 1);
  TC_PROPERTY("ErrorCode", 8035);
  INITIALIZER(runLoadTable);
  INITIALIZER(runInsertError); // Will reset error code
  STEPS(runScanRead, 25);
  FINALIZER(runInsertError);
  FINALIZER(runClearTable);
}
TESTCASE("ScanRead40RandomTable", 
	 "Verify scan requirement: Scan with 40 simultaneous threads. "\
	 "Use random table for the scan"){
+4 −0
Original line number Diff line number Diff line
@@ -378,6 +378,10 @@ max-time: 500
cmd: testScan
args: -n ScanRestart T1

max-time: 500
cmd: testScan
args: -l 100 -n Scan-bug8262 T7

# OLD FLEX
max-time: 500
cmd: flexBench