List:Internals« Previous MessageNext Message »
From:jonas.oreland Date:July 11 2005 7:22pm
Subject:bk commit into 5.1 tree (joreland:1.1937)
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.1937 05/07/11 21:22:32 joreland@stripped +5 -0
  ndb diskdata
    fix undo wrt create/drop table

  storage/ndb/src/kernel/blocks/lgman.cpp
    1.45 05/07/11 21:22:28 joreland@stripped +37 -10
    Add undo of create table

  storage/ndb/src/kernel/blocks/diskpage.hpp
    1.21 05/07/11 21:22:28 joreland@stripped +3 -2
    Add undo of create table

  storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp
    1.36 05/07/11 21:22:28 joreland@stripped +63 -8
    Add undo of create table

  storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp
    1.24 05/07/11 21:22:28 joreland@stripped +16 -2
    Add undo of create table

  storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
    1.71 05/07/11 21:22:28 joreland@stripped +13 -7
    Add undo of create table

# 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:	joreland
# Host:	eel.(none)
# Root:	/home/jonas/src/mysql-5.1-ndb-dd

--- 1.23/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp	2005-07-11 14:47:50 +02:00
+++ 1.24/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp	2005-07-11 21:22:28 +02:00
@@ -907,6 +907,21 @@
     preq.m_page.m_page_idx = rec->m_file_no_page_idx & 0xFFFF;
     break;
   }
+  case File_formats::Undofile::UNDO_TUP_CREATE:
+    /**
+     * 
+     */
+  {
+    Disk_undo::Create* rec= (Disk_undo::Create*)ptr;
+    Ptr<Tablerec> tabPtr;
+    tabPtr.i= rec->m_table;
+    ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
+    for(Uint32 i = 0; i<MAX_FRAG_PER_NODE; i++)
+      if(tabPtr.p->fragrec[i] != RNIL)
+	disk_restart_undo_lcp(tabPtr.i, tabPtr.p->fragid[i]);
+    disk_restart_undo_next(signal);
+    return;
+  }
   default:
     ndbrequire(false);
   }
@@ -946,7 +961,6 @@
   FragrecordPtr fragPtr;
   getFragmentrec(fragPtr, fragId, tabPtr.p);
   
-  ndbrequire(!fragPtr.p->m_undo_complete);
   fragPtr.p->m_undo_complete = true;
 }
 
@@ -996,7 +1010,7 @@
       default:
 	ndbrequire(false);
       }
-      lsn =  f_undo.m_lsn;
+      lsn = f_undo.m_lsn;
     }
     else
     {

--- 1.20/storage/ndb/src/kernel/blocks/diskpage.hpp	2005-04-30 13:42:59 +02:00
+++ 1.21/storage/ndb/src/kernel/blocks/diskpage.hpp	2005-07-11 21:22:28 +02:00
@@ -144,8 +144,9 @@
       ,UNDO_TUP_ALLOC  = 3
       ,UNDO_TUP_UPDATE = 4
       ,UNDO_TUP_FREE   = 5
-      
-      ,UNDO_END        = 6 
+      ,UNDO_TUP_CREATE = 6
+
+      ,UNDO_END        = 0x7FFF 
       ,UNDO_NEXT_LSN   = 0x8000
     };
 

--- 1.44/storage/ndb/src/kernel/blocks/lgman.cpp	2005-07-11 14:47:50 +02:00
+++ 1.45/storage/ndb/src/kernel/blocks/lgman.cpp	2005-07-11 21:22:28 +02:00
@@ -210,6 +210,22 @@
 void
 Lgman::execDUMP_STATE_ORD(Signal* signal){
   jamEntry();
+  if(signal->theData[0] == 12001)
+  {
+    Ptr<Logfile_group> ptr;
+    m_logfile_group_list.first(ptr);
+    while(!ptr.isNull())
+    {
+      infoEvent("lfg %d state: %x fs: %d lsn "
+		"[ last: %lld sync_req: %lld synced: %lld lcp: %lld ] waiters: %d",
+		ptr.p->m_logfile_group_id, ptr.p->m_state, 
+		ptr.p->m_outstanding_fs,
+		ptr.p->m_last_lsn, ptr.p->m_last_sync_req_lsn,
+		ptr.p->m_last_synced_lsn, ptr.p->m_last_lcp_lsn,
+		!ptr.p->m_log_sync_waiters.isEmpty());
+      m_logfile_group_list.next(ptr);
+    }
+  }
 }
 
 void
@@ -1312,7 +1328,11 @@
 
     Uint64 last_lsn= m_last_lsn;
     
-    if(ptr.p->m_last_lsn == last_lsn)
+    if(ptr.p->m_last_lsn == last_lsn
+#ifdef VM_TRACE
+       && ((rand() % 100) > 50)
+#endif
+       )
     {
       undo[2] |= File_formats::Undofile::UNDO_NEXT_LSN << 16;
       Uint32 *dst= get_log_buffer(ptr, sizeof(undo) >> 2);
@@ -1528,7 +1548,11 @@
     if(m_lgman->m_logfile_group_hash.find(ptr, key))
     {
       Uint64 last_lsn_filegroup= ptr.p->m_last_lsn;
-      if(last_lsn_filegroup == last_lsn)
+      if(last_lsn_filegroup == last_lsn
+#ifdef VM_TRACE
+	 && ((rand() % 100) > 50)
+#endif
+	 )
       {
 	dst= m_lgman->get_log_buffer(ptr, tot);
 	for(i= 0; i<cnt; i++)
@@ -1541,7 +1565,6 @@
       }
       else
       {
-	assert(false);
 	dst= m_lgman->get_log_buffer(ptr, tot + 2);
 	* dst++ = last_lsn >> 32;
 	* dst++ = last_lsn & 0xFFFFFFFF;
@@ -1962,6 +1985,7 @@
       
       ptr.p->m_pos[CONSUMER].m_current_pos.m_idx = pageP->m_words_used;
       ptr.p->m_pos[PRODUCER].m_current_pos.m_idx = 1;
+      ptr.p->m_last_read_lsn++;
     }
     
     /**
@@ -2178,14 +2202,12 @@
     Uint32 mask= type & ~(Uint32)File_formats::Undofile::UNDO_NEXT_LSN;
     switch(mask){
     case File_formats::Undofile::UNDO_END:
-      ndbout_c("Found end of log");
       stop_run_undo_log(signal);
       return;
     case File_formats::Undofile::UNDO_LCP:
     case File_formats::Undofile::UNDO_LCP_FIRST:
     {
       Uint32 lcp = * (ptr - len + 1);
-      printf("Found LCP: %d looking for %d", lcp, m_latest_lcp);
       if(lcp > m_latest_lcp)
       {
 	// Just ignore
@@ -2196,7 +2218,6 @@
 	 (lcp == m_latest_lcp && 
 	  mask == File_formats::Undofile::UNDO_LCP_FIRST))
       {
-	ndbout_c(" -> end of log"); 
 	stop_run_undo_log(signal);
 	return;
       }
@@ -2205,6 +2226,7 @@
     case File_formats::Undofile::UNDO_TUP_ALLOC:
     case File_formats::Undofile::UNDO_TUP_UPDATE:
     case File_formats::Undofile::UNDO_TUP_FREE:
+    case File_formats::Undofile::UNDO_TUP_CREATE:
       tup->disk_restart_undo(signal, lsn, mask, ptr - len + 1, len);
       return;
     default:
@@ -2263,14 +2285,15 @@
   if(((* record) >> 16) & File_formats::Undofile::UNDO_NEXT_LSN)
   {
     lsn = ptr.p->m_last_read_lsn - 1;
+    ndbrequire((Int64)lsn >= 0);
   }
   else
   {
-    ndbassert(false);
     ndbassert(pos >= 3);
-    lsn += * (prev - 2); lsn <<= 32;
-    lsn += * (prev - 1);
+    lsn += * (prev - 1); lsn <<= 32;
+    lsn += * (prev - 0);
     len += 2;
+    ndbrequire((Int64)lsn >= 0);
   }
   
 
@@ -2502,7 +2525,11 @@
   ndbrequire(m_logfile_group_list.first(ptr));
 
   Uint64 last_lsn= m_last_lsn;
-  if(ptr.p->m_last_lsn == last_lsn)
+  if(ptr.p->m_last_lsn == last_lsn
+#ifdef VM_TRACE
+     && ((rand() % 100) > 50)
+#endif
+     )
   {
     undo[2] |= File_formats::Undofile::UNDO_NEXT_LSN << 16;
     Uint32 *dst= get_log_buffer(ptr, sizeof(undo) >> 2);

--- 1.70/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2005-07-11 14:47:50 +02:00
+++ 1.71/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp	2005-07-11 21:22:28 +02:00
@@ -852,9 +852,10 @@
   {
     enum 
     {
-      UNDO_ALLOC = File_formats::Undofile::UNDO_TUP_ALLOC,
-      UNDO_UPDATE = File_formats::Undofile::UNDO_TUP_UPDATE,
-      UNDO_FREE = File_formats::Undofile::UNDO_TUP_FREE
+      UNDO_ALLOC = File_formats::Undofile::UNDO_TUP_ALLOC
+      ,UNDO_UPDATE = File_formats::Undofile::UNDO_TUP_UPDATE
+      ,UNDO_FREE = File_formats::Undofile::UNDO_TUP_FREE
+      ,UNDO_CREATE = File_formats::Undofile::UNDO_TUP_CREATE
     };
     
     struct Alloc 
@@ -881,6 +882,12 @@
       Uint32 m_data[1];
       Uint32 m_type_length; // 16 bit type, 16 bit length
     };
+    
+    struct Create
+    {
+      Uint32 m_table;
+      Uint32 m_type_length; // 16 bit type, 16 bit length
+    };
   };
   
   ArrayPool<Extent_info> c_extent_pool;
@@ -2342,10 +2349,6 @@
 //------------------------------------------------------------------------------------------------------
 // Common stored variables. Variables that have a valid value always.
 //------------------------------------------------------------------------------------------------------
-  Uint32 cnoOfLcpRec;
-  Uint32 cnoOfParallellUndoFiles;
-  Uint32 cnoOfUndoPage;
-
   Attrbufrec *attrbufrec;
   Uint32 cfirstfreeAttrbufrec;
   Uint32 cnoOfAttrbufrec;
@@ -2471,6 +2474,9 @@
   void disk_page_undo_free(Page*, const Local_key*, const Uint32*, Uint32 sz,
 			   Uint32 gci, Uint32 logfile_group_id);
   
+
+  void undo_createtable_callback(Signal* signal, Uint32 opPtrI, Uint32 unused);
+
   /**
    * Disk restart code
    */

--- 1.35/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp	2005-07-07 16:56:39 +02:00
+++ 1.36/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp	2005-07-11 21:22:28 +02:00
@@ -64,8 +64,6 @@
   Uint32 tablespace= signal->theData[14];
 
   Uint32 checksumIndicator= signal->theData[11];
-  if(checksumIndicator)
-    printf("");
 
 #ifndef VM_TRACE
   // config mismatch - do not crash if release compiled
@@ -536,12 +534,6 @@
   }
 #endif
   
-  signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
-  signal->theData[1] = lastAttr;
-  sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF, 
-	     signal, 2, JBB);
-
-
   if(regTabPtr.p->m_no_of_disk_attributes)
   {
     CreateFilegroupImplReq rep;
@@ -552,11 +544,74 @@
     
     new (&regFragPtr.p->m_disk_alloc_info)
       Disk_alloc_info(regTabPtr.p, rep.tablespace.extent_size); 
+
+    if(!(getNodeState().getSystemRestartInProgress() && 
+	 getNodeState().startLevel == NodeState::SL_STARTING && 
+	 getNodeState().starting.startPhase <= 4))
+    {
+      Callback cb;
+      cb.m_callbackData= fragOperPtr.i;
+      cb.m_callbackFunction = 
+	safe_cast(&Dbtup::undo_createtable_callback);
+      Uint32 sz= sizeof(Disk_undo::Create) >> 2;
+      
+      Logfile_client lgman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
+      int res= lgman.get_log_buffer(signal, sz, &cb);
+      switch(res){
+      case 0:
+	signal->theData[0] = 1;
+	return;
+      case -1:
+	ndbrequire("NOT YET IMPLEMENTED" == 0);
+	break;
+      }
+      execute(signal, cb, 0);
+      return;
+    }
   }
   
+  signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
+  signal->theData[1] = lastAttr;
+  sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF, 
+	     signal, 2, JBB);
+
   releaseFragoperrec(fragOperPtr);
 
   return;
+}
+
+void
+Dbtup::undo_createtable_callback(Signal* signal, Uint32 opPtrI, Uint32 unused)
+{
+  FragrecordPtr regFragPtr;
+  FragoperrecPtr fragOperPtr;
+  TablerecPtr regTabPtr;
+
+  fragOperPtr.i= opPtrI;
+  ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
+
+  regTabPtr.i= fragOperPtr.p->tableidFrag;
+  ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
+
+  getFragmentrec(regFragPtr, fragOperPtr.p->fragidFrag, regTabPtr.p);
+  ndbrequire(regFragPtr.i != RNIL);
+  
+  Logfile_client lsman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
+
+  Disk_undo::Create create;
+  create.m_type_length= Disk_undo::UNDO_CREATE << 16 | (sizeof(create) >> 2);
+  create.m_table = regTabPtr.i;
+  
+  Logfile_client::Change c[1] = {{ &create, sizeof(create) >> 2 } };
+  
+  Uint64 lsn= lsman.add_entry<1>(c);
+  
+  signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
+  signal->theData[1] = 1;
+  sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF, 
+	     signal, 2, JBB);
+
+  releaseFragoperrec(fragOperPtr);
 }
 
 /*
Thread
bk commit into 5.1 tree (joreland:1.1937)jonas.oreland11 Jul