List:Internals« Previous MessageNext Message »
From:jonas Date:December 6 2005 8:25am
Subject:bk commit into 5.1 tree (jonas:1.1980)
View as plain text  
Below is the list of changes that have just been committed into a local
5.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.1980 05/12/06 09:24:58 jonas@stripped +7 -0
  ndb -
    Fix init of GCI on page init
    Make COPY_FRAG use scanBlockRef
    Add GCI to copy_frag_req
    Add NR flag to AccScanReq

  storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp
    1.12 05/12/06 09:24:56 jonas@stripped +101 -21
    Fix init of page wrt to ROW_GCI

  storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp
    1.7 05/12/06 09:24:56 jonas@stripped +15 -7
    Fix init of page wrt to ROW_GCI

  storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp
    1.5 05/12/06 09:24:56 jonas@stripped +1 -2
    Fix init of page wrt to ROW_GCI

  storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
    1.35 05/12/06 09:24:55 jonas@stripped +6 -3
    Fix init of page wrt to ROW_GCI

  storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
    1.91 05/12/06 09:24:55 jonas@stripped +12 -8
    Make COPY_FRAG use scanBlockRef

  storage/ndb/include/kernel/signaldata/CopyFrag.hpp
    1.3 05/12/06 09:24:55 jonas@stripped +2 -1
    Add GCI to copy_frag_req

  storage/ndb/include/kernel/signaldata/AccScan.hpp
    1.8 05/12/06 09:24:55 jonas@stripped +23 -2
    Add NR flag to AccScanReq

# 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/51-ndb

--- 1.4/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp	2005-11-24 16:11:31 +01:00
+++ 1.5/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp	2005-12-06 09:24:56 +01:00
@@ -530,8 +530,7 @@
   
   if (tabPtr.p->m_attributes[DD].m_no_of_varsize == 0)
   {
-    convertThPage(tabPtr.p->m_offsets[DD].m_fix_header_size, 
-		  (Fix_page*)gpage.p);
+    convertThPage((Fix_page*)gpage.p, tabPtr.p, DD);
   }
   else
   {

--- 1.7/storage/ndb/include/kernel/signaldata/AccScan.hpp	2005-11-24 16:11:31 +01:00
+++ 1.8/storage/ndb/include/kernel/signaldata/AccScan.hpp	2005-12-06 09:24:55 +01:00
@@ -46,7 +46,10 @@
   Uint32 requestInfo;
   Uint32 transId1;
   Uint32 transId2;
-  Uint32 savePointId;
+  union {
+    Uint32 savePointId;
+    Uint32 gci;
+  };
 
   /**
    * Previously there where also a scan type
@@ -61,6 +64,9 @@
 
   static Uint32 getNoDiskScanFlag(const Uint32 & requestInfo);
   static void setNoDiskScanFlag(Uint32 & requestInfo, Uint32 nodisk);
+
+  static Uint32 getNRScanFlag(const Uint32 & requestInfo);
+  static void setNRScanFlag(Uint32 & requestInfo, Uint32 nr);
 };
 
 /**
@@ -70,16 +76,18 @@
  * h = Read Committed        - 1  Bit 5
  * z = Descending (TUX)      - 1  Bit 6
  * d = No disk scan          - 1  Bit 7
+ * n = Node recovery scan    - 1  Bit 8
  *
  *           1111111111222222222233
  * 01234567890123456789012345678901
- *   l  hzd   
+ *   l  hzdn   
  */
 #define AS_LOCK_MODE_SHIFT       (2)
 #define AS_LOCK_MODE_MASK        (1)
 #define AS_READ_COMMITTED_SHIFT  (5)
 #define AS_DESCENDING_SHIFT      (6)
 #define AS_NO_DISK_SCAN          (7)
+#define AS_NR_SCAN               (8)
 
 inline 
 Uint32
@@ -131,6 +139,19 @@
 AccScanReq::setNoDiskScanFlag(UintR & requestInfo, UintR val){
   ASSERT_BOOL(val, "AccScanReq::setNoDiskScanFlag");
   requestInfo |= (val << AS_NO_DISK_SCAN);
+}
+
+inline
+Uint32
+AccScanReq::getNRScanFlag(const Uint32 & requestInfo){
+  return (requestInfo >> AS_NR_SCAN) & 1;
+}
+
+inline
+void
+AccScanReq::setNRScanFlag(UintR & requestInfo, UintR val){
+  ASSERT_BOOL(val, "AccScanReq::setNoDiskScanFlag");
+  requestInfo |= (val << AS_NR_SCAN);
 }
 
 class AccScanConf {

--- 1.2/storage/ndb/include/kernel/signaldata/CopyFrag.hpp	2005-04-08 02:43:50 +02:00
+++ 1.3/storage/ndb/include/kernel/signaldata/CopyFrag.hpp	2005-12-06 09:24:55 +01:00
@@ -30,7 +30,7 @@
    */
   friend class Dblqh;
 public:
-  STATIC_CONST( SignalLength = 7 );
+  STATIC_CONST( SignalLength = 8 );
 
 private:
   Uint32 userPtr;
@@ -40,6 +40,7 @@
   Uint32 nodeId;
   Uint32 schemaVersion;
   Uint32 distributionKey;
+  Uint32 gci;
 };
 
 class CopyFragConf {

--- 1.90/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2005-12-05 16:54:20 +01:00
+++ 1.91/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2005-12-06 09:24:55 +01:00
@@ -9249,7 +9249,8 @@
   const Uint32 copyPtr = copyFragReq->userPtr;
   const Uint32 userRef = copyFragReq->userRef;
   const Uint32 nodeId = copyFragReq->nodeId;
-
+  const Uint32 gci = 0; //copyFragReq->gci = cnewestGci;
+  
   ndbrequire(cnoActiveCopy < 3);
   ndbrequire(getFragmentrec(signal, fragId));
   ndbrequire(fragptr.p->copyFragState == ZIDLE);
@@ -9306,7 +9307,7 @@
   scanptr.p->scanApiOpPtr = tcConnectptr.i;
   scanptr.p->scanApiBlockref = reference();
   fragptr.p->m_scanNumberMask.clear(NR_ScanNo);
-  scanptr.p->scanBlockref = DBACC_REF;
+  scanptr.p->scanBlockref = DBTUP_REF;
   scanptr.p->scanLockHold = ZFALSE;
   
   initScanTc(0,
@@ -9320,6 +9321,7 @@
   tcConnectptr.p->copyCountWords = 0;
   tcConnectptr.p->tcOprec = tcConnectptr.i;
   tcConnectptr.p->schemaVersion = scanptr.p->scanSchemaVersion;
+  tcConnectptr.p->savePointId = gci;
   scanptr.p->scanState = ScanRecord::WAIT_ACC_COPY;
   AccScanReq * req = (AccScanReq*)&signal->theData[0];
   req->senderData = scanptr.i;
@@ -9329,10 +9331,12 @@
   req->requestInfo = 0;
   AccScanReq::setLockMode(req->requestInfo, 0);
   AccScanReq::setReadCommittedFlag(req->requestInfo, 0);
+  AccScanReq::setNRScanFlag(req->requestInfo, gci ? 1 : 0);
+
   req->transId1 = tcConnectptr.p->transid[0];
   req->transId2 = tcConnectptr.p->transid[1];
   req->savePointId = tcConnectptr.p->savePointId;
-  sendSignal(tcConnectptr.p->tcAccBlockref, GSN_ACC_SCANREQ, signal, 
+  sendSignal(scanptr.p->scanBlockref, GSN_ACC_SCANREQ, signal, 
 	     AccScanReq::SignalLength, JBB);
   return;
 }//Dblqh::execCOPY_FRAGREQ()
@@ -9361,7 +9365,7 @@
   signal->theData[2] = scanptr.p->scanSchemaVersion;
   signal->theData[3] = ZSTORED_PROC_COPY;
 // theData[4] is not used in TUP with ZSTORED_PROC_COPY
-  sendSignal(tcConnectptr.p->tcTupBlockref, GSN_STORED_PROCREQ, signal, 5, JBB);
+  sendSignal(scanptr.p->scanBlockref, GSN_STORED_PROCREQ, signal, 5, JBB);
   return;
 }//Dblqh::accScanConfCopyLab()
 
@@ -9425,7 +9429,7 @@
   signal->theData[0] = scanptr.p->scanAccPtr;
   signal->theData[1] = RNIL;
   signal->theData[2] = NextScanReq::ZSCAN_NEXT;
-  sendSignal(tcConnectptr.p->tcAccBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
+  sendSignal(scanptr.p->scanBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
   return;
 }//Dblqh::continueFirstCopyAfterBlockedLab()
 
@@ -9472,7 +9476,7 @@
     jam();
     signal->theData[0] = scanptr.p->scanAccPtr;
     signal->theData[1] = AccCheckScan::ZCHECK_LCP_STOP;
-    sendSignal(tcConnectptr.p->tcAccBlockref, GSN_ACC_CHECK_SCAN, signal, 2, JBB);
+    sendSignal(scanptr.p->scanBlockref, GSN_ACC_CHECK_SCAN, signal, 2, JBB);
     return;      
   }
 
@@ -9738,7 +9742,7 @@
   signal->theData[0] = scanptr.p->scanAccPtr;
   signal->theData[1] = acc_op_ptr;
   signal->theData[2] = NextScanReq::ZSCAN_NEXT_COMMIT;
-  sendSignal(tcConnectptr.p->tcAccBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
+  sendSignal(scanptr.p->scanBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
   return;
 }//Dblqh::continueCopyAfterBlockedLab()
 
@@ -9809,7 +9813,7 @@
   signal->theData[0] = scanptr.p->scanAccPtr;
   signal->theData[1] = RNIL;
   signal->theData[2] = ZCOPY_CLOSE;
-  sendSignal(tcConnectptr.p->tcAccBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
+  sendSignal(scanptr.p->scanBlockref, GSN_NEXT_SCANREQ, signal, 3, JBB);
   return;
 }//Dblqh::continueCloseCopyAfterBlockedLab()
 

--- 1.34/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2005-12-05 10:38:32 +01:00
+++ 1.35/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2005-12-06 09:24:55 +01:00
@@ -401,7 +401,9 @@
       Next = 5,                 // looking for next extry
       Last = 6,                 // after last entry
       Aborting = 7,             // lock wait at scan close
-      Invalid = 9               // cannot return REF to LQH currently
+      Invalid = 9,              // cannot return REF to LQH currently
+
+      CurrentDeleted = 10       // Found deleted ROWID (used for NR)
     };
     Uint16 m_state;
 
@@ -2451,8 +2453,9 @@
   Uint32* alloc_fix_rowid(Fragrecord*, Tablerec*, Local_key*, Uint32 *);
   Uint32* alloc_var_rowid(Fragrecord*, Tablerec*, Uint32, Local_key*, Uint32*);
 // Private methods
-  void convertThPage(Uint32 Tupheadsize,
-                     Fix_page* regPagePtr);
+  void convertThPage(Fix_page* regPagePtr,
+		     Tablerec*,
+		     Uint32 mm);
 
   /**
    * Return offset

--- 1.6/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp	2005-11-30 14:58:56 +01:00
+++ 1.7/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp	2005-12-06 09:24:56 +01:00
@@ -89,8 +89,7 @@
 
       ndbassert(pagePtr.p->page_state == ZEMPTY_MM);
       
-      convertThPage(regTabPtr->m_offsets[MM].m_fix_header_size, 
-		    (Fix_page*)pagePtr.p);
+      convertThPage((Fix_page*)pagePtr.p, regTabPtr, MM);
       
       pagePtr.p->page_state = ZTH_MM_FREE;
       
@@ -120,10 +119,11 @@
   return pagePtr.p->m_data + page_offset;
 }
 
-void Dbtup::convertThPage(Uint32 Tupheadsize,
-                          Fix_page*  const regPagePtr) 
+void Dbtup::convertThPage(Fix_page* regPagePtr,
+			  Tablerec* regTabPtr,
+			  Uint32 mm) 
 {
-  Uint32 nextTuple = Tupheadsize;
+  Uint32 nextTuple = regTabPtr->m_offsets[mm].m_fix_header_size;
   Uint32 endOfList;
   /*
   ASSUMES AT LEAST ONE TUPLE HEADER FITS AND THEREFORE NO HANDLING
@@ -135,10 +135,19 @@
 #ifdef VM_TRACE
   memset(regPagePtr->m_data, 0xF1, 4*Fix_page::DATA_WORDS);
 #endif
+  Uint32 gci_pos = 2;
+  Uint32 gci_val = 0xF1F1F1F1;
+  if (regTabPtr->m_bits & Tablerec::TR_RowGCI)
+  {
+    Tuple_header* ptr = 0;
+    gci_pos = ptr->get_mm_gci(regTabPtr) - (Uint32*)ptr;
+    gci_val = 0;
+  }
   while (pos + nextTuple <= Fix_page::DATA_WORDS)
   {
     regPagePtr->m_data[pos] = (prev << 16) | (pos + nextTuple);
     regPagePtr->m_data[pos + 1] = Tuple_header::FREE;
+    regPagePtr->m_data[pos + gci_pos] = gci_val;
     prev = pos;
     pos += nextTuple;
     cnt ++;
@@ -227,8 +236,7 @@
   LocalDLList<Page> alloc_pages(c_page_pool, regFragPtr->emptyPrimPage);
   switch(state){
   case ZEMPTY_MM:
-    convertThPage(regTabPtr->m_offsets[MM].m_fix_header_size, 
-		  (Fix_page*)pagePtr.p);
+    convertThPage((Fix_page*)pagePtr.p, regTabPtr, MM);
     
     pagePtr.p->page_state = ZTH_MM_FREE;
     alloc_pages.remove(pagePtr);

--- 1.11/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp	2005-11-24 16:11:31 +01:00
+++ 1.12/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp	2005-12-06 09:24:56 +01:00
@@ -87,6 +87,9 @@
         bits |= ScanOp::SCAN_VS;
       }
     }
+
+    bits |= AccScanReq::getNRScanFlag(req->requestInfo) ? ScanOp::SCAN_NR : 0;
+    
     // set up scan op
     new (scanPtr.p) ScanOp();
     ScanOp& scan = *scanPtr.p;
@@ -100,6 +103,7 @@
     scan.m_transId1 = req->transId1;
     scan.m_transId2 = req->transId2;
     scan.m_savePointId = req->savePointId;
+
     // conf
     AccScanConf* const conf = (AccScanConf*)signal->getDataPtrSend();
     conf->scanPtr = req->senderData;
@@ -348,6 +352,10 @@
     } else {
       scan.m_state = ScanOp::Locked;
     }
+  } 
+  else if (scan.m_state == ScanOp::CurrentDeleted)
+  {
+    
   }
   if (scan.m_state == ScanOp::Locked) {
     // we have lock or do not need one
@@ -566,6 +574,8 @@
   // tuple found
   Tuple_header* th = 0;
   Uint32 loop_count = 0;
+  Uint32 scanGCI = scanPtr.p->m_scanGCI;
+  Uint32 foundGCI;
  
   bool mm = (bits & ScanOp::SCAN_DD);
   Uint32 size = table.m_offsets[mm].m_fix_header_size +
@@ -669,17 +679,22 @@
       jam();
       {
         // check if page is un-allocated or empty
-        Tablespace_client tsman(signal, c_tsman,
-            frag.fragTableId, frag.fragmentId, frag.m_tablespace_id);
-        unsigned bits = ~(unsigned)0;
-        int ret = tsman.get_page_free_bits(&key, &bits);
-        ndbrequire(ret == 0);
-        if (bits == 0) {
-          // skip empty page
-          jam();
-          pos.m_get = ScanPos::Get_next_page_dd;
-          break; // incr loop count
-        }
+	if (likely(! (bits & ScanOp::SCAN_NR)))
+	{
+	  Tablespace_client tsman(signal, c_tsman,
+				  frag.fragTableId, 
+				  frag.fragmentId, 
+				  frag.m_tablespace_id);
+	  unsigned bits = ~(unsigned)0;
+	  int ret = tsman.get_page_free_bits(&key, &bits);
+	  ndbrequire(ret == 0);
+	  if (bits == 0) {
+	    // skip empty page
+	    jam();
+	    pos.m_get = ScanPos::Get_next_page_dd;
+	    break; // incr loop count
+	  }
+	}
         // page request to PGMAN
         Page_cache_client::Request preq;
         preq.m_page = pos.m_key;
@@ -716,16 +731,46 @@
       jam();
       {
         Fix_page* page = (Fix_page*)pos.m_page;
-        if (key.m_page_idx + size <= Fix_page::DATA_WORDS) {
+        if (key.m_page_idx + size <= Fix_page::DATA_WORDS) 
+	{
+	  pos.m_get = ScanPos::Get_next_tuple_fs;
           th = (Tuple_header*)&page->m_data[key.m_page_idx];
-          if (! (th->m_header_bits & Tuple_header::FREE)) {
-            pos.m_get = ScanPos::Get_next_tuple_fs;
-            goto found_tuple;
-          } else {
-            jam();
-            // skip free tuple
-            pos.m_get = ScanPos::Get_next_tuple_fs;
-          }
+	  if (likely(! (bits & ScanOp::SCAN_NR)))
+	  {
+	    if (! (th->m_header_bits & Tuple_header::FREE)) {
+	      goto found_tuple;
+	    } 
+	    else 
+	    {
+	      jam();
+	      // skip free tuple
+	    }
+	  }
+	  else
+	  {
+	    if ((foundGCI = *th->get_mm_gci(tablePtr.p)) > scanGCI)
+	    {
+	      if (! (th->m_header_bits & Tuple_header::FREE))
+	      {
+		jam();
+		goto found_tuple;
+	      }
+	      else
+	      {
+		ndbout << "found deleted tuple" << pos.m_key 
+		       << " " << foundGCI << endl;
+		goto found_deleted_rowid;
+	      }
+	    }
+	    else
+	    {
+	      jam();
+	      // skip free tuple
+	      ndbout << "Skipping " << pos.m_key << " gci: " 
+		     << *th->get_mm_gci(tablePtr.p)
+		     << " scanGCI: " << scanGCI << endl;
+	    }
+	  }
         } else {
           jam();
           // no more tuples on this page
@@ -733,7 +778,7 @@
         }
       }
       break; // incr loop count
-    found_tuple:
+  found_tuple:
       // found possible tuple to return
       jam();
       {
@@ -757,6 +802,41 @@
           // clear it so that it will show up in next LCP
           th->m_header_bits &= ~(Uint32)Tuple_header::LCP_SKIP;
         }
+      }
+      break;
+  found_deleted_rowid:
+      jam();
+      {
+	ndbassert(bits & ScanOp::SCAN_NR);
+	Local_key& key_mm = pos.m_key_mm;
+        Fix_page* page = (Fix_page*)pos.m_page;
+	if (! (bits & ScanOp::SCAN_DD)) {
+	  key_mm = pos.m_key;
+	  ndbrequire(page->alloc_record(key.m_page_idx)==key.m_page_idx);
+	  th->m_header_bits |= Tuple_header::FREE; // Not foundable...
+	
+        // caller has already set pos.m_get to next tuple
+	  // real page id is already set
+	} else {
+	  key_mm.assref(th->m_base_record_ref);
+	  // recompute for each disk tuple
+	  pos.m_realpid_mm = getRealpid(fragPtr.p, key_mm.m_page_no);
+
+	  Fix_page *mmpage = (Fix_page*)c_page_pool.getPtr(pos.m_realpid_mm);
+	  th = (Tuple_header*)(mmpage->m_data + key_mm.m_page_idx);
+	  if ((foundGCI = *th->get_mm_gci(tablePtr.p)) > scanGCI)
+	  {
+	    if (! (th->m_header_bits & Tuple_header::FREE))
+	      break;
+	    
+	    ndbrequire(mmpage->alloc_record(key_mm.m_page_idx) ==
+		       key_mm.m_page_idx);
+	    th->m_header_bits |= Tuple_header::FREE; // Not foundable...
+	  }
+	}
+	// TUPKEYREQ handles savepoint stuff
+	scan.m_state = ScanOp::CurrentDeleted;
+	return true;
       }
       break; // incr loop count
     default:
Thread
bk commit into 5.1 tree (jonas:1.1980)jonas6 Dec