From: Date: September 19 2008 11:49pm Subject: bzr commit into mysql-5.1 branch (jonas:2669) Bug#39549 List-Archive: http://lists.mysql.com/commits/54376 X-Bug: 39549 Message-Id: <20080919214905.3FA6823B93@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/jonas/src/telco-6.2/ 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