Commit 9e26c327 authored by unknown's avatar unknown

wl2077 - ndb close scan - fix introduced bugs wrt premature close of scan


ndb/src/common/debugger/signaldata/ScanTab.cpp:
  Fix printout
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
  Handle already closed fragments
ndb/src/ndbapi/NdbConnectionScan.cpp:
  Better handling of SCAN_TABREF
ndb/src/ndbapi/NdbScanOperation.cpp:
  Removed some special cases by setting up them instead
ndb/test/src/NDBT_Test.cpp:
  Fix createTable(false)
ndb/tools/select_all.cpp:
  Use full scan as default
parent eed2b972
...@@ -30,13 +30,14 @@ printSCANTABREQ(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiv ...@@ -30,13 +30,14 @@ printSCANTABREQ(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiv
fprintf(output, " apiConnectPtr: H\'%.8x", fprintf(output, " apiConnectPtr: H\'%.8x",
sig->apiConnectPtr); sig->apiConnectPtr);
fprintf(output, " requestInfo: H\'%.8x:\n", requestInfo); fprintf(output, " requestInfo: H\'%.8x:\n", requestInfo);
fprintf(output, " Parallellism: %u, Batch: %u LockMode: %u, Keyinfo: %u Holdlock: %u, RangeScan: %u\n", fprintf(output, " Parallellism: %u, Batch: %u LockMode: %u, Keyinfo: %u Holdlock: %u, RangeScan: %u ReadCommitted: %u\n",
sig->getParallelism(requestInfo), sig->getParallelism(requestInfo),
sig->getScanBatch(requestInfo), sig->getScanBatch(requestInfo),
sig->getLockMode(requestInfo), sig->getLockMode(requestInfo),
sig->getKeyinfoFlag(requestInfo),
sig->getHoldLockFlag(requestInfo), sig->getHoldLockFlag(requestInfo),
sig->getRangeScanFlag(requestInfo), sig->getRangeScanFlag(requestInfo),
sig->getKeyinfoFlag(requestInfo)); sig->getReadCommittedFlag(requestInfo));
Uint32 keyLen = (sig->attrLenKeyLen >> 16); Uint32 keyLen = (sig->attrLenKeyLen >> 16);
Uint32 attrLen = (sig->attrLenKeyLen & 0xFFFF); Uint32 attrLen = (sig->attrLenKeyLen & 0xFFFF);
......
...@@ -9329,7 +9329,6 @@ void Dbtc::execSCAN_NEXTREQ(Signal* signal) ...@@ -9329,7 +9329,6 @@ void Dbtc::execSCAN_NEXTREQ(Signal* signal)
/********************************************************************* /*********************************************************************
* APPLICATION IS CLOSING THE SCAN. * APPLICATION IS CLOSING THE SCAN.
**********************************************************************/ **********************************************************************/
ndbrequire(len == 0);
close_scan_req(signal, scanptr, true); close_scan_req(signal, scanptr, true);
return; return;
}//if }//if
...@@ -9457,7 +9456,7 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){ ...@@ -9457,7 +9456,7 @@ Dbtc::close_scan_req(Signal* signal, ScanRecordPtr scanPtr, bool req_received){
ndbrequire(curr.p->scanFragState == ScanFragRec::DELIVERED); ndbrequire(curr.p->scanFragState == ScanFragRec::DELIVERED);
delivered.remove(curr); delivered.remove(curr);
if(curr.p->m_ops > 0){ if(curr.p->m_ops > 0 && curr.p->m_scan_frag_conf_status == 0){
jam(); jam();
running.add(curr); running.add(curr);
curr.p->scanFragState = ScanFragRec::LQH_ACTIVE; curr.p->scanFragState = ScanFragRec::LQH_ACTIVE;
......
...@@ -57,12 +57,18 @@ NdbConnection::receiveSCAN_TABREF(NdbApiSignal* aSignal){ ...@@ -57,12 +57,18 @@ NdbConnection::receiveSCAN_TABREF(NdbApiSignal* aSignal){
if(checkState_TransId(&ref->transId1)){ if(checkState_TransId(&ref->transId1)){
theScanningOp->theError.code = ref->errorCode; theScanningOp->theError.code = ref->errorCode;
if(!ref->closeNeeded){
theScanningOp->execCLOSE_SCAN_REP(); theScanningOp->execCLOSE_SCAN_REP();
if(!ref->closeNeeded){
return 0; return 0;
} }
assert(theScanningOp->m_sent_receivers_count);
/**
* Setup so that close_impl will actually perform a close
* and not "close scan"-optimze it away
*/
theScanningOp->m_conf_receivers_count++; theScanningOp->m_conf_receivers_count++;
theScanningOp->m_conf_receivers[0] = theScanningOp->m_receivers[0];
theScanningOp->m_conf_receivers[0]->m_tcPtrI = ~0;
return 0; return 0;
} else { } else {
#ifdef NDB_NO_DROPPED_SIGNAL #ifdef NDB_NO_DROPPED_SIGNAL
......
...@@ -613,21 +613,22 @@ NdbScanOperation::send_next_scan(Uint32 cnt, bool stopScanFlag){ ...@@ -613,21 +613,22 @@ NdbScanOperation::send_next_scan(Uint32 cnt, bool stopScanFlag){
sent++; sent++;
} }
} }
memcpy(&m_api_receivers[0], &m_api_receivers[cnt], cnt * sizeof(char*)); memmove(m_api_receivers, m_api_receivers+cnt,
(theParallelism-cnt) * sizeof(char*));
int ret = 0; int ret = 0;
if(sent) if(sent)
{ {
Uint32 nodeId = theNdbCon->theDBnode; Uint32 nodeId = theNdbCon->theDBnode;
TransporterFacade * tp = TransporterFacade::instance(); TransporterFacade * tp = TransporterFacade::instance();
if(cnt > 21 && !stopScanFlag){ if(cnt > 21){
tSignal.setLength(4); tSignal.setLength(4);
LinearSectionPtr ptr[3]; LinearSectionPtr ptr[3];
ptr[0].p = prep_array; ptr[0].p = prep_array;
ptr[0].sz = sent; ptr[0].sz = sent;
ret = tp->sendSignal(&tSignal, nodeId, ptr, 1); ret = tp->sendSignal(&tSignal, nodeId, ptr, 1);
} else { } else {
tSignal.setLength(4+(stopScanFlag ? 0 : sent)); tSignal.setLength(4+sent);
ret = tp->sendSignal(&tSignal, nodeId); ret = tp->sendSignal(&tSignal, nodeId);
} }
} }
...@@ -687,6 +688,7 @@ NdbScanOperation::execCLOSE_SCAN_REP(){ ...@@ -687,6 +688,7 @@ NdbScanOperation::execCLOSE_SCAN_REP(){
m_api_receivers_count = 0; m_api_receivers_count = 0;
m_conf_receivers_count = 0; m_conf_receivers_count = 0;
m_sent_receivers_count = 0; m_sent_receivers_count = 0;
m_current_api_receiver = theParallelism;
} }
void NdbScanOperation::release() void NdbScanOperation::release()
......
...@@ -839,8 +839,6 @@ void NDBT_TestSuite::execute(Ndb* ndb, const NdbDictionary::Table* pTab, ...@@ -839,8 +839,6 @@ void NDBT_TestSuite::execute(Ndb* ndb, const NdbDictionary::Table* pTab,
continue; continue;
} }
pTab2 = pDict->getTable(pTab->getName()); pTab2 = pDict->getTable(pTab->getName());
} else {
pTab2 = pTab;
} }
ctx = new NDBT_Context(); ctx = new NDBT_Context();
......
...@@ -50,7 +50,7 @@ static struct my_option my_long_options[] = ...@@ -50,7 +50,7 @@ static struct my_option my_long_options[] =
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{ "parallelism", 'p', "parallelism", { "parallelism", 'p', "parallelism",
(gptr*) &_parallelism, (gptr*) &_parallelism, 0, (gptr*) &_parallelism, (gptr*) &_parallelism, 0,
GET_INT, REQUIRED_ARG, 240, 0, 0, 0, 0, 0 }, GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{ "lock", 'l', "Read(0), Read-hold(1), Exclusive(2)", { "lock", 'l', "Read(0), Read-hold(1), Exclusive(2)",
(gptr*) &_lock, (gptr*) &_lock, 0, (gptr*) &_lock, (gptr*) &_lock, 0,
GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
......
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