List:Commits« Previous MessageNext Message »
From:jonas Date:April 25 2006 4:01pm
Subject:bk commit into 4.1 tree (jonas:1.2502) BUG#18597
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of jonas. When jonas 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.2502 06/04/25 16:01:08 jonas@stripped +2 -0
  ndb - bug#18597
    Handle early abort of scan, so that resources are correctly freed

  ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
    1.65 06/04/25 16:01:06 jonas@stripped +25 -12
    Handle early abort so that require on running.empty() does not fire

  ndb/src/kernel/blocks/dbtc/Dbtc.hpp
    1.24 06/04/25 16:01:06 jonas@stripped +3 -2
    Handle early abort

# 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:	jonas
# Host:	perch.ndb.mysql.com
# Root:	/home/jonas/src/41-work

--- 1.23/ndb/src/kernel/blocks/dbtc/Dbtc.hpp	2006-03-20 14:53:27 +01:00
+++ 1.24/ndb/src/kernel/blocks/dbtc/Dbtc.hpp	2006-04-25 16:01:06 +02:00
@@ -1400,7 +1400,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);
@@ -1543,7 +1543,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.64/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2006-03-22 11:44:29 +01:00
+++ 1.65/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2006-04-25 16:01:06 +02:00
@@ -8767,17 +8767,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()
 
@@ -8793,7 +8793,8 @@
     ;
   } else {
     abortScanLab(signal, scanptr, 
-		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion));
+		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion),
+		 true);
     return;
   }
 
@@ -8831,13 +8832,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
   
@@ -8851,7 +8852,8 @@
     ;
   } else {
     abortScanLab(signal, scanptr,
-		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion));
+		 tabPtr.p->getErrorCode(scanptr.p->scanSchemaVersion),
+		 true);
     return;
   }
 
@@ -8906,20 +8908,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;
@@ -8931,6 +8935,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 4.1 tree (jonas:1.2502) BUG#18597jonas25 Apr