2669 Jonas Oreland 2008-09-19
ndb - bug#39549 - incorrectly handled resource shortage in TC::scanfragrec
modified:
storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp
storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
storage/ndb/src/ndbapi/ndberror.c
=== modified file 'storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp 2008-08-11 10:41:11 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp 2008-09-19 21:49:00 +0000
@@ -123,6 +123,7 @@
#define ZUNKNOWN_TABLE_ERROR 285
#define ZNODEFAIL_BEFORE_COMMIT 286
#define ZINDEX_CORRUPT_ERROR 287
+#define ZSCAN_FRAGREC_ERROR 291
// ----------------------------------------
// Seize error
@@ -1418,7 +1419,7 @@ private:
UintR anApiConnectPtr);
void handleScanStop(Signal* signal, UintR aFailedNode);
void initScanTcrec(Signal* signal);
- void initScanrec(ScanRecordPtr, const class ScanTabReq*,
+ Uint32 initScanrec(ScanRecordPtr, const class ScanTabReq*,
const UintR scanParallel,
const UintR noOprecPerFrag);
void initScanfragrec(Signal* signal);
=== modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-08-20 20:00:56 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-09-19 21:49:00 +0000
@@ -9227,7 +9227,12 @@ void Dbtc::execSCAN_TABREQ(Signal* signa
ndbrequire(transP->apiScanRec == RNIL);
ndbrequire(scanptr.p->scanApiRec == RNIL);
- initScanrec(scanptr, scanTabReq, scanParallel, noOprecPerFrag);
+ errCode = initScanrec(scanptr, scanTabReq, scanParallel, noOprecPerFrag);
+ if (unlikely(errCode))
+ {
+ jam();
+ goto SCAN_TAB_error;
+ }
transP->apiScanRec = scanptr.i;
transP->returncode = 0;
@@ -9317,10 +9322,11 @@ SCAN_TAB_error_no_state_change:
return;
}//Dbtc::execSCAN_TABREQ()
-void Dbtc::initScanrec(ScanRecordPtr scanptr,
- const ScanTabReq * scanTabReq,
- UintR scanParallel,
- UintR noOprecPerFrag)
+Uint32
+Dbtc::initScanrec(ScanRecordPtr scanptr,
+ const ScanTabReq * scanTabReq,
+ UintR scanParallel,
+ UintR noOprecPerFrag)
{
const UintR ri = scanTabReq->requestInfo;
scanptr.p->scanTcrec = tcConnectptr.i;
@@ -9355,7 +9361,11 @@ void Dbtc::initScanrec(ScanRecordPtr sca
for (Uint32 i = 0; i < scanParallel; i++) {
jam();
ScanFragRecPtr ptr;
- ndbrequire(list.seize(ptr));
+ if (unlikely(list.seize(ptr) == false))
+ {
+ jam();
+ goto errout;
+ }
ptr.p->scanFragState = ScanFragRec::IDLE;
ptr.p->scanRec = scanptr.i;
ptr.p->scanFragId = 0;
@@ -9365,6 +9375,10 @@ void Dbtc::initScanrec(ScanRecordPtr sca
(* (ScanTabReq::getRangeScanFlag(ri) ?
&c_counters.c_range_scan_count :
&c_counters.c_scan_count))++;
+ return 0;
+errout:
+ list.release();
+ return ZSCAN_FRAGREC_ERROR;
}//Dbtc::initScanrec()
void Dbtc::scanTabRefLab(Signal* signal, Uint32 errCode)
=== modified file 'storage/ndb/src/ndbapi/ndberror.c'
--- a/storage/ndb/src/ndbapi/ndberror.c 2008-04-25 15:12:47 +0000
+++ b/storage/ndb/src/ndbapi/ndberror.c 2008-09-19 21:49:00 +0000
@@ -191,6 +191,7 @@ ErrorBundle ErrorCodes[] = {
{ 1501, DMEC, TR, "Out of undo space" },
{ 288, DMEC, TR, "Out of index operations in transaction coordinator (increase
MaxNoOfConcurrentIndexOperations)" },
{ 289, DMEC, TR, "Out of transaction buffer memory in TC (increase
TransactionBufferMemory)" },
+ { 291, DMEC, TR, "Out of scanfrag records in TC (increase MaxNoOfLocalScans)" },
/**
* InsufficientSpace
| Thread |
|---|
| • bzr push into mysql-5.1 branch (jonas:2669) Bug#39549 | Jonas Oreland | 20 Sep |