List:Commits« Previous MessageNext Message »
From:tomas Date:April 26 2006 9:46am
Subject:bk commit into 5.1 tree (tomas:1.2012) BUG#18597
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of tomas. When tomas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2012 06/04/26 09:46:18 tomas@stripped +2 -0
  ndb - bug#18597
      Handle early abort of scan, so that resources are correctly freed

  storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
    1.98 06/04/26 09:46:00 tomas@stripped +25 -12
    ndb - bug#18597
        Handle early abort of scan, so that resources are correctly freed

  storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp
    1.35 06/04/26 09:46:00 tomas@stripped +3 -2
    ndb - bug#18597
        Handle early abort of scan, so that resources are correctly freed

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	tomas
# Host:	poseidon.ndb.mysql.com
# Root:	/home/tomas/wl2325-alcatel

--- 1.34/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp	2006-03-24 17:11:37 +01:00
+++ 1.35/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp	2006-04-26 09:46:00 +02:00
@@ -1414,7 +1414,7 @@
 		   const UintR scanParallel, 
 		   const UintR noOprecPerFrag);
   void initScanfragrec(Signal* signal);
-  void releaseScanResources(ScanRecordPtr);
+  void releaseScanResources(ScanRecordPtr, bool not_started = false);
   ScanRecordPtr seizeScanrec(Signal* signal);
   void sendScanFragReq(Signal*, ScanRecord*, ScanFragRec*);
   void sendScanTabConf(Signal* signal, ScanRecordPtr);
@@ -1561,7 +1561,8 @@
   void signalErrorRefuseLab(Signal* signal);
   void abort080Lab(Signal* signal);
   void packKeyData000Lab(Signal* signal, BlockReference TBRef, Uint32 len);
-  void abortScanLab(Signal* signal, ScanRecordPtr, Uint32 errCode);
+  void abortScanLab(Signal* signal, ScanRecordPtr, Uint32 errCode, 
+		    bool not_started = false);
   void sendAbortedAfterTimeout(Signal* signal, int Tcheck);
   void abort010Lab(Signal* signal);
   void abort015Lab(Signal* signal);

--- 1.97/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2006-03-24 17:11:37 +01:00
+++ 1.98/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2006-04-26 09:46:00 +02:00
@@ -8852,17 +8852,17 @@
 
 scanAttrinfo_attrbuf_error:
   jam();
-  abortScanLab(signal, scanptr, ZGET_ATTRBUF_ERROR);
+  abortScanLab(signal, scanptr, ZGET_ATTRBUF_ERROR, true);
   return;
 
 scanAttrinfo_attrbuf2_error:
   jam();
-  abortScanLab(signal, scanptr, ZGET_ATTRBUF_ERROR);
+  abortScanLab(signal, scanptr, ZGET_ATTRBUF_ERROR, true);
   return;
 
 scanAttrinfo_len_error:
   jam();
-  abortScanLab(signal, scanptr, ZLENGTH_ERROR);
+  abortScanLab(signal, scanptr, ZLENGTH_ERROR, true);
   return;
 }//Dbtc::scanAttrinfoLab()
 
@@ -8878,7 +8878,8 @@
     ;
   } else {
     abortScanLab(signal, scanptr, 
-		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion));
+		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion),
+		 true);
     return;
   }
 
@@ -8945,13 +8946,13 @@
   ndbrequire(scanptr.p->scanState == ScanRecord::WAIT_FRAGMENT_COUNT);
   if (apiConnectptr.p->apiFailState == ZTRUE) {
     jam();
-    releaseScanResources(scanptr);
+    releaseScanResources(scanptr, true);
     handleApiFailState(signal, apiConnectptr.i);
     return;
   }//if
   if (tfragCount == 0) {
     jam();
-    abortScanLab(signal, scanptr, ZNO_FRAGMENT_ERROR);
+    abortScanLab(signal, scanptr, ZNO_FRAGMENT_ERROR, true);
     return;
   }//if
   
@@ -8965,7 +8966,8 @@
     ;
   } else {
     abortScanLab(signal, scanptr,
-		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion));
+		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion),
+		 true);
     return;
   }
 
@@ -9029,20 +9031,22 @@
   ndbrequire(scanptr.p->scanState == ScanRecord::WAIT_FRAGMENT_COUNT);
   if (apiConnectptr.p->apiFailState == ZTRUE) {
     jam();
-    releaseScanResources(scanptr);
+    releaseScanResources(scanptr, true);
     handleApiFailState(signal, apiConnectptr.i);
     return;
   }//if
-  abortScanLab(signal, scanptr, errCode);
+  abortScanLab(signal, scanptr, errCode, true);
 }//Dbtc::execDI_FCOUNTREF()
 
-void Dbtc::abortScanLab(Signal* signal, ScanRecordPtr scanptr, Uint32 errCode) 
+void Dbtc::abortScanLab(Signal* signal, ScanRecordPtr scanptr, Uint32 errCode,
+			bool not_started) 
 {
   scanTabRefLab(signal, errCode);
-  releaseScanResources(scanptr);
+  releaseScanResources(scanptr, not_started);
 }//Dbtc::abortScanLab()
 
-void Dbtc::releaseScanResources(ScanRecordPtr scanPtr)
+void Dbtc::releaseScanResources(ScanRecordPtr scanPtr,
+				bool not_started)
 {
   if (apiConnectptr.p->cachePtr != RNIL) {
     cachePtr.i = apiConnectptr.p->cachePtr;
@@ -9054,6 +9058,15 @@
   ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord);
   releaseTcCon();
 
+  if (not_started)
+  {
+    jam();
+    ScanFragList run(c_scan_frag_pool, scanPtr.p->m_running_scan_frags);
+    ScanFragList queue(c_scan_frag_pool, scanPtr.p->m_queued_scan_frags);
+    run.release();
+    queue.release();
+  }
+  
   ndbrequire(scanPtr.p->m_running_scan_frags.isEmpty());
   ndbrequire(scanPtr.p->m_queued_scan_frags.isEmpty());
   ndbrequire(scanPtr.p->m_delivered_scan_frags.isEmpty());
Thread
bk commit into 5.1 tree (tomas:1.2012) BUG#18597tomas26 Apr