#At file:///home/frazer/bzr/mysql-5.1-telco-6.2/
2960 Frazer Clement 2009-08-04
Bug#46490 : Full table scan hangs with more than 21 fragments
modified:
storage/ndb/include/kernel/signaldata/ScanTab.hpp
storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
=== modified file 'storage/ndb/include/kernel/signaldata/ScanTab.hpp'
--- a/storage/ndb/include/kernel/signaldata/ScanTab.hpp 2009-05-26 18:53:34 +0000
+++ b/storage/ndb/include/kernel/signaldata/ScanTab.hpp 2009-08-04 10:37:19 +0000
@@ -488,6 +488,11 @@ public:
* Length of signal
*/
STATIC_CONST( SignalLength = 4 );
+
+ /**
+ * Section carrying receiverIds if num receivers > 21
+ */
+ STATIC_CONST( ReceiverIdsSectionNum = 0);
private:
=== modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2009-08-04 10:37:19 +0000
@@ -10071,6 +10071,7 @@ void Dbtc::execSCAN_NEXTREQ(Signal* sign
apiConnectptr.i = req->apiConnectPtr;
if (apiConnectptr.i >= capiConnectFilesize) {
jam();
+ releaseSections(signal);
warningHandlerLab(signal, __LINE__);
return;
}//if
@@ -10082,6 +10083,7 @@ void Dbtc::execSCAN_NEXTREQ(Signal* sign
const UintR ctransid1 = apiConnectptr.p->transid[0] ^ transid1;
const UintR ctransid2 = apiConnectptr.p->transid[1] ^ transid2;
if ((ctransid1 | ctransid2) != 0){
+ releaseSections(signal);
ScanTabRef * ref = (ScanTabRef*)&signal->theData[0];
ref->apiConnectPtr = apiConnectptr.p->ndbapiConnect;
ref->transId1 = transid1;
@@ -10099,6 +10101,7 @@ void Dbtc::execSCAN_NEXTREQ(Signal* sign
*/
if (apiConnectptr.p->apiConnectstate != CS_START_SCAN) {
jam();
+ releaseSections(signal);
if (apiConnectptr.p->apiConnectstate == CS_CONNECTED) {
jam();
/*********************************************************************
@@ -10128,7 +10131,31 @@ void Dbtc::execSCAN_NEXTREQ(Signal* sign
ptrCheckGuard(scanptr, cscanrecFileSize, scanRecord);
ScanRecord* scanP = scanptr.p;
- const Uint32 len = signal->getLength() - 4;
+ /* Copy ReceiverIds to working space past end of signal
+ * so that we don't overwrite them when sending signals
+ */
+ Uint32 len = 0;
+ if (signal->header.m_noOfSections > 0)
+ {
+ /* Receiver ids are in a long section */
+ ndbrequire(signal->getLength() == ScanNextReq::SignalLength);
+ ndbrequire(signal->header.m_noOfSections == 1);
+ SegmentedSectionPtr receiverIdsSection;
+ ndbrequire(signal->getSection(receiverIdsSection,
+ ScanNextReq::ReceiverIdsSectionNum));
+ len= receiverIdsSection.p->m_sz;
+ ndbassert(len < (8192 - 25));
+
+ copy(signal->getDataPtrSend()+25, receiverIdsSection);
+ releaseSections(signal);
+ }
+ else
+ {
+ len= signal->getLength() - ScanNextReq::SignalLength;
+ memcpy(signal->getDataPtrSend()+25,
+ signal->getDataPtr()+ ScanNextReq::SignalLength,
+ 4 * len);
+ }
if (stopScan == ZTRUE) {
jam();
@@ -10150,9 +10177,6 @@ void Dbtc::execSCAN_NEXTREQ(Signal* sign
return;
}
- // Copy op ptrs so I dont overwrite them when sending...
- memcpy(signal->getDataPtrSend()+25, signal->getDataPtr()+4, 4 * len);
-
ScanFragNextReq tmp;
tmp.closeFlag = ZFALSE;
tmp.transId1 = apiConnectptr.p->transid[0];
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-6.2 branch (frazer:2960) Bug#46490 | Frazer Clement | 4 Aug |