List:Commits« Previous MessageNext Message »
From:Frazer Clement Date:August 4 2009 10:37am
Subject:bzr commit into mysql-5.1-telco-6.2 branch (frazer:2960) Bug#46490
View as plain text  
#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#46490Frazer Clement4 Aug