List:Internals« Previous MessageNext Message »
From:jonas.oreland Date:April 13 2005 1:43pm
Subject:bk commit into 5.1-ndb tree (joreland:1.1845)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1-ndb 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.1845 05/04/13 13:42:55 joreland@stripped +10 -0
  wl1870 - ndb diskdata
    start SR undo handling

  ndb/src/kernel/blocks/tsman.hpp
    1.20 05/04/13 13:42:51 joreland@stripped +2 -0
    Add scanning of extent header during SR

  ndb/src/kernel/blocks/tsman.cpp
    1.30 05/04/13 13:42:51 joreland@stripped +70 -0
    Add scanning of extent header during SR

  ndb/src/kernel/blocks/pgman.hpp
    1.17 05/04/13 13:42:51 joreland@stripped +2 -0
    Incorperate LCP into pgman :-(

  ndb/src/kernel/blocks/pgman.cpp
    1.15 05/04/13 13:42:51 joreland@stripped +21 -0
    Incorperate LCP into pgman :-(

  ndb/src/kernel/blocks/lgman.hpp
    1.22 05/04/13 13:42:51 joreland@stripped +1 -0
    Let Lgman run undo-log

  ndb/src/kernel/blocks/lgman.cpp
    1.28 05/04/13 13:42:51 joreland@stripped +19 -5
    Let Lgman run undo-log

  ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
    1.64 05/04/13 13:42:51 joreland@stripped +55 -34
    1) let Lgman run undo-log during SR
    2) let Pgman be part of LCP

  ndb/src/kernel/blocks/dblqh/Dblqh.hpp
    1.43 05/04/13 13:42:51 joreland@stripped +3 -3
    Let Lgman run undo-log

  ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.71 05/04/13 13:42:51 joreland@stripped +2 -0
    Recreate data/undo files during NR
      (until we fixed a better NR for DD)

  ndb/include/kernel/GlobalSignalNumbers.h
    1.12 05/04/13 13:42:51 joreland@stripped +6 -4
    removed some unused signals

# 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.ndb.mysql.com.ndb.mysql.com.ndb.mysql.com.ndb.mysql.com
# Root:	/home/jonas/src/mysql-5.1-ndb-dd

--- 1.27/ndb/src/kernel/blocks/lgman.cpp	Mon Apr 11 11:20:25 2005
+++ 1.28/ndb/src/kernel/blocks/lgman.cpp	Wed Apr 13 13:42:51 2005
@@ -67,6 +67,7 @@
 
   addRecSignal(GSN_LCP_FRAG_ORD, &Lgman::execLCP_FRAG_ORD);
   addRecSignal(GSN_SUB_GCP_COMPLETE_REP, &Lgman::execSUB_GCP_COMPLETE_REP);
+  addRecSignal(GSN_START_RECREQ, &Lgman::execSTART_RECREQ);
 
   m_logfile_group_pool.setSize(10);
   m_logfile_group_hash.setSize(10);
@@ -96,12 +97,17 @@
 }//Lgman::execNDB_STTOR()
 
 void
-Lgman::sendSTTORRY(Signal* signal){
+Lgman::sendSTTORRY(Signal* signal)
+{
   signal->theData[0] = 0;
   signal->theData[3] = 1;
-  signal->theData[4] = 3;
-  signal->theData[5] = 255; // No more start phases from missra
-  sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 6, JBB);
+  signal->theData[4] = 2;
+  signal->theData[5] = 3;
+  signal->theData[6] = 4;
+  signal->theData[7] = 5;
+  signal->theData[8] = 6;
+  signal->theData[9] = 255; // No more start phases from missra
+  sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 10, JBB);
 }
 
 void
@@ -278,7 +284,7 @@
   FsOpenReq::setVersion(req->fileNumber, 4); // Version 4 = specified filename
 
   req->fileFlags = 0;
-    req->fileFlags |= FsOpenReq::OM_READWRITE;
+  req->fileFlags |= FsOpenReq::OM_READWRITE;
   switch(requestInfo){
   case CreateFileImplReq::Create:
     req->fileFlags |= FsOpenReq::OM_CREATE_IF_NONE;
@@ -1201,3 +1207,11 @@
 }
 
 template Uint64 Logfile_client::add_entry<3>(const Change*);
+
+void
+Lgman::execSTART_RECREQ(Signal* signal)
+{
+  Uint32 lcpId= signal->theData[0];
+  ndbout_c("Lgman::execSTART_RECREQ %d", lcpId);
+  sendSignal(DBLQH_REF, GSN_START_RECCONF, signal, 1, JBB);
+}

--- 1.21/ndb/src/kernel/blocks/lgman.hpp	Mon Apr 11 11:20:25 2005
+++ 1.22/ndb/src/kernel/blocks/lgman.hpp	Wed Apr 13 13:42:51 2005
@@ -56,6 +56,7 @@
   void execLCP_FRAG_ORD(Signal*);
   void execSUB_GCP_COMPLETE_REP(Signal*);
 
+  void execSTART_RECREQ(Signal*);
 public:
   struct Log_buffer_waiter
   {

--- 1.14/ndb/src/kernel/blocks/pgman.cpp	Tue Mar 22 15:53:38 2005
+++ 1.15/ndb/src/kernel/blocks/pgman.cpp	Wed Apr 13 13:42:51 2005
@@ -19,6 +19,7 @@
 #include <signaldata/FsConf.hpp>
 #include <signaldata/FsReadWriteReq.hpp>
 #include <signaldata/PgmanContinueB.hpp>
+#include <signaldata/LCP.hpp>
 
 Pgman::Pgman(const Configuration & conf) :
   SimulatedBlock(PGMAN, conf),
@@ -34,6 +35,9 @@
   addRecSignal(GSN_FSREADREF, &Pgman::execFSREADREF);
   addRecSignal(GSN_FSREADCONF, &Pgman::execFSREADCONF);
 
+  addRecSignal(GSN_LCP_FRAG_ORD, &Pgman::execLCP_FRAG_ORD);
+  addRecSignal(GSN_END_LCP_REQ, &Pgman::execEND_LCP_REQ);
+  
   m_page_entry_pool.setSize(256);
   m_page_entry_hash.setSize(64);
   m_page_request_pool.setSize(10000);
@@ -159,6 +163,23 @@
 
   m_page_entry_pool.getPtr(ptr, conf->userPointer);
   process_callbacks(signal, ptr);
+}
+
+void
+Pgman::execLCP_FRAG_ORD(Signal* signal)
+{
+  ndbout_c("Pgman::execLCP_FRAG_ORD");
+}
+
+void
+Pgman::execEND_LCP_REQ(Signal* signal)
+{
+  ndbout_c("Pgman::execEND_LCP_REQ");
+  EndLcpReq* req= (EndLcpReq*)signal->getDataPtr();
+  Uint32 ref = req->senderRef;
+  Uint32 data= req->senderData;
+  signal->theData[0] = data;
+  sendSignal(ref, GSN_END_LCP_CONF, signal, 1, JBB);
 }
 
 void

--- 1.16/ndb/src/kernel/blocks/pgman.hpp	Tue Mar 22 15:53:38 2005
+++ 1.17/ndb/src/kernel/blocks/pgman.hpp	Wed Apr 13 13:42:51 2005
@@ -40,6 +40,8 @@
   void execFSREADREF(Signal*);
   void execFSREADCONF(Signal*);  
 
+  void execLCP_FRAG_ORD(Signal*);
+  void execEND_LCP_REQ(Signal*);
 private:
   friend class Page_cache_client;
   

--- 1.29/ndb/src/kernel/blocks/tsman.cpp	Wed Apr  6 15:42:07 2005
+++ 1.30/ndb/src/kernel/blocks/tsman.cpp	Wed Apr 13 13:42:51 2005
@@ -757,6 +757,7 @@
   Uint32 senderData = ptr.p->m_create.m_senderData;
   Uint32 extent_pages = ptr.p->m_create.m_extent_pages;
   Uint32 requestInfo = ptr.p->m_create.m_requestInfo;
+  Uint32 data_pages = ptr.p->m_create.m_data_pages;
 
   Uint32 eh= File_formats::Datafile::extent_header_words(ptr.p->m_extent_size);
   Uint32 per_page = File_formats::Datafile::EXTENT_PAGE_WORDS/eh;
@@ -772,6 +773,7 @@
      * first free is unknown, need to scan extent headers
      */
     ptr.p->m_online.m_first_free_free_extent = RNIL;
+    scan_extent_headers(signal, ptr, data_pages);
     break;
   default:
     ndbrequire(false);
@@ -782,6 +784,74 @@
   conf->senderRef = reference();
   sendSignal(senderRef, GSN_CREATE_FILE_CONF, signal, 
 	     CreateFileImplConf::SignalLength, JBB);
+}
+
+void
+Tsman::scan_extent_headers(Signal* signal, Ptr<Datafile> ptr, Uint32 datapages)
+{
+  Ptr<Tablespace> lg_ptr;
+  m_tablespace_pool.getPtr(lg_ptr, ptr.p->m_tablespace_ptr_i);
+
+  Uint32 firstFree= RNIL;
+  Uint32 size = lg_ptr.p->m_extent_size;
+  Uint32 eh_words = File_formats::Datafile::extent_header_words(size);
+  Uint32 per_page = File_formats::Datafile::EXTENT_PAGE_WORDS/eh_words;
+  
+  Uint32 pages= ptr.p->m_online.m_offset_data_pages - 1;
+  for(Uint32 i = 0; i < pages; i++)
+  {
+    Uint32 page_no = pages - i;
+    Page_cache_client::Request preq;
+    preq.m_page.m_page_no = page_no;
+    preq.m_page.m_file_no = ptr.p->m_file_no;
+    
+    int flags = 0;
+    int real_page_id = m_page_cache_client.get_page(signal, preq, flags);
+    ndbrequire(real_page_id > 0);
+
+    File_formats::Datafile::Extent_page* page = 
+      (File_formats::Datafile::Extent_page*)m_page_cache_client.m_ptr.p;
+    
+    Uint32 extents= per_page;
+    if(page_no == pages)
+    {
+      /**
+       * Last extent header page...
+       *   set correct no of extent headers
+       */
+      extents= datapages % per_page;
+    }
+    for(Uint32 j = 0; j<extents; j++)
+    {
+      Uint32 extent_no = extents - j - 1;
+      File_formats::Datafile::Extent_header* header= 
+	page->get_header(extent_no, size);
+      if(header->m_table == RNIL)
+      {
+	header->m_next_free_extent = firstFree;
+	firstFree = page_no * per_page + extent_no;
+      }
+      else
+      {
+	ndbrequire(false);
+      }
+    }
+  }
+  ptr.p->m_online.m_first_free_free_extent= firstFree;
+  
+  LocalDLList<Datafile> meta(m_file_pool, lg_ptr.p->m_meta_files);
+  if(firstFree != RNIL)
+  {
+    LocalDLList<Datafile> free(m_file_pool, lg_ptr.p->m_free_files);
+    meta.remove(ptr);
+    free.add(ptr);
+  }
+  else
+  {
+    LocalDLList<Datafile> full(m_file_pool, lg_ptr.p->m_full_files);
+    meta.remove(ptr);
+    full.add(ptr);
+  }
 }
 
 void

--- 1.19/ndb/src/kernel/blocks/tsman.hpp	Fri Mar 11 08:30:27 2005
+++ 1.20/ndb/src/kernel/blocks/tsman.hpp	Wed Apr 13 13:42:51 2005
@@ -164,6 +164,8 @@
 
   int alloc_extent(Signal* signal, Uint32 tablespace, Local_key* key);
   int alloc_page_from_extent(Signal*, Uint32, Local_key*, Uint32 bits);
+  
+  void scan_extent_headers(Signal*, Ptr<Datafile>, Uint32 datapages);
 };
 
 class Tablespace_client

--- 1.11/ndb/include/kernel/GlobalSignalNumbers.h	Tue Jan 18 15:29:46 2005
+++ 1.12/ndb/include/kernel/GlobalSignalNumbers.h	Wed Apr 13 13:42:51 2005
@@ -134,14 +134,14 @@
 /* 75 unused */
 /* 76 unused */
 
-#define GSN_ACC_LCPREQ                  79
-#define GSN_ACC_LCPREF                  78
-#define GSN_ACC_LCPCONF                 77
+/* 79 unused */
+/* 78 unused */
+/* 77 unused */
 
 /* 80 unused */
 #define GSN_ACC_OVER_REC                81
 
-#define GSN_ACC_SAVE_PAGES              83
+/* 83 unused */
 #define GSN_ACC_SCAN_INFO               84
 #define GSN_ACC_SCAN_INFO24             85
 #define GSN_ACC_SCANCONF                86
@@ -334,7 +334,9 @@
 #define GSN_DIVERIFYREQ                 241
 #define GSN_ENABLE_COMORD               242
 #define GSN_END_LCPCONF                 243
+#define GSN_END_LCP_CONF                243
 #define GSN_END_LCPREQ                  244
+#define GSN_END_LCP_REQ                 244
 #define GSN_END_TOCONF                  245
 #define GSN_END_TOREQ                   246
 #define GSN_EVENT_REP                   247

--- 1.70/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	Mon Apr 11 14:37:57 2005
+++ 1.71/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	Wed Apr 13 13:42:51 2005
@@ -13501,6 +13501,8 @@
     break;
   case 1:
     req->requestInfo = CreateFileImplReq::Open;
+    if(getNodeState().getNodeRestartInProgress())
+      req->requestInfo = CreateFileImplReq::CreateForce;      
     break;
   case 2:
     req->requestInfo = CreateFileImplReq::CreateForce;

--- 1.42/ndb/src/kernel/blocks/dblqh/Dblqh.hpp	Mon Apr 11 14:37:57 2005
+++ 1.43/ndb/src/kernel/blocks/dblqh/Dblqh.hpp	Wed Apr 13 13:42:51 2005
@@ -408,9 +408,7 @@
   enum ExecUndoLogState {
     EULS_IDLE = 0,
     EULS_STARTED = 1,
-    EULS_COMPLETED = 2,
-    EULS_ACC_COMPLETED = 3,
-    EULS_TUP_COMPLETED = 4
+    EULS_COMPLETED = 2
   };
 
   struct AddFragRecord {
@@ -1016,6 +1014,8 @@
     
     bool   reportEmpty;
     NdbNodeBitmask m_EMPTY_LCP_REQ;
+
+    Uint32 m_outstanding;
   }; // Size 76 bytes
   typedef Ptr<LcpRecord> LcpRecordPtr;
     

--- 1.63/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	Mon Apr 11 14:37:58 2005
+++ 1.64/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	Wed Apr 13 13:42:51 2005
@@ -10212,6 +10212,10 @@
     jamEntry();
     *lcpFragOrd= save;
 
+    EXECUTE_DIRECT(PGMAN, GSN_LCP_FRAG_ORD, signal, signal->length());
+    jamEntry();
+    *lcpFragOrd= save;
+    
     c_lcpId = lcpFragOrd->lcpId;
     ndbrequire(lcpPtr.p->lcpState == LcpRecord::LCP_IDLE);
     setLogTail(signal, lcpFragOrd->keepGci);
@@ -10525,19 +10529,34 @@
   req->senderRef= reference();
   req->backupPtr= m_backup_ptr;
   req->backupId= lcpId;
-  sendSignal(BACKUP_REF, GSN_END_LCPREQ, signal, 
+  sendSignal(BACKUP_REF, GSN_END_LCP_REQ, signal, 
+	     EndLcpReq::SignalLength, JBB);
+  
+  sendSignal(PGMAN_REF, GSN_END_LCP_REQ, signal, 
 	     EndLcpReq::SignalLength, JBB);
+  
+  lcpPtr.i = 0;
+  ptrAss(lcpPtr, lcpRecord);
+  lcpPtr.p->m_outstanding = 2;
   return;
 }//Dblqh::completeLcpRoundLab()
 
 void Dblqh::execEND_LCPCONF(Signal* signal) 
 {
   jamEntry();
-  clcpCompletedState = LCP_IDLE;
-  
   lcpPtr.i = 0;
   ptrAss(lcpPtr, lcpRecord);
-  sendLCP_COMPLETE_REP(signal, lcpPtr.p->currentFragment.lcpFragOrd.lcpId);
+
+  ndbrequire(clcpCompletedState == LCP_CLOSE_STARTED);
+  ndbrequire(lcpPtr.p->m_outstanding);
+  
+  lcpPtr.p->m_outstanding--;
+  if(lcpPtr.p->m_outstanding == 0)
+  {
+    jam();
+    clcpCompletedState = LCP_IDLE;
+    sendLCP_COMPLETE_REP(signal, lcpPtr.p->currentFragment.lcpFragOrd.lcpId);
+  }
 }//Dblqh::execEND_LCPCONF()
 
 void Dblqh::sendLCP_COMPLETE_REP(Signal* signal, Uint32 lcpId)
@@ -12839,7 +12858,9 @@
     c_lcp_complete_fragments.add(fragptr);
     return;
   }//if
-  
+
+  ndbrequire(c_lcpId == 0 || c_lcpId == lcpId);
+  c_lcpId = lcpId;
   c_lcp_waiting_fragments.add(fragptr);
   if(c_lcp_restoring_fragments.isEmpty())
     send_restore_lcp(signal);
@@ -12911,8 +12932,12 @@
      *  FRAGMENT LOGS CAN BE EXECUTED.
      * ---------------------------------------------------------------- */
     csrExecUndoLogState = EULS_STARTED;
-    signal->theData[0] = caccBlockref;
-    sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
+    lcpPtr.i = 0;
+    ptrAss(lcpPtr, lcpRecord);
+    lcpPtr.p->m_outstanding = 2;
+    
+    signal->theData[0] = c_lcpId;
+    sendSignal(LGMAN_REF, GSN_START_RECREQ, signal, 1, JBB);
     signal->theData[0] = ctupBlockref;
     sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
     return;
@@ -12969,8 +12994,13 @@
   {
     jam();
     csrExecUndoLogState = EULS_STARTED;
-    signal->theData[0] = caccBlockref;
-    sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
+
+    lcpPtr.i = 0;
+    ptrAss(lcpPtr, lcpRecord);
+    lcpPtr.p->m_outstanding = 2;
+    
+    signal->theData[0] = c_lcpId;
+    sendSignal(LGMAN_REF, GSN_START_RECREQ, signal, 1, JBB);
     signal->theData[0] = ctupBlockref;
     sendSignal(reference(), GSN_START_RECCONF, signal, 1, JBB);
   }//if
@@ -12982,31 +13012,19 @@
 void Dblqh::execSTART_RECCONF(Signal* signal) 
 {
   jamEntry();
-  BlockReference userRef = signal->theData[0];
-  if (userRef == caccBlockref) {
-    if (csrExecUndoLogState == EULS_STARTED) {
-      jam();
-      csrExecUndoLogState = EULS_ACC_COMPLETED;
-      return;
-    } else {
-      ndbrequire(csrExecUndoLogState == EULS_TUP_COMPLETED);
-      jam();
-      csrExecUndoLogState = EULS_COMPLETED;
-    }//if
-  } else {
-    ndbrequire(userRef == ctupBlockref);
-    if (csrExecUndoLogState == EULS_STARTED) {
-      jam();
-      csrExecUndoLogState = EULS_TUP_COMPLETED;
-      return;
-    } else {
-      ndbrequire(csrExecUndoLogState == EULS_ACC_COMPLETED);
-      jam();
-      csrExecUndoLogState = EULS_COMPLETED;
-    }//if
-  }//if
-  c_lcp_complete_fragments.first(fragptr);
-  build_acc(signal, fragptr.i);
+  lcpPtr.i = 0;
+  ptrAss(lcpPtr, lcpRecord);
+  ndbrequire(csrExecUndoLogState == EULS_STARTED);
+  ndbrequire(lcpPtr.p->m_outstanding);
+  
+  lcpPtr.p->m_outstanding--;
+  if(lcpPtr.p->m_outstanding == 0)
+  {
+    jam();
+    csrExecUndoLogState = EULS_COMPLETED;
+    c_lcp_complete_fragments.first(fragptr);
+    build_acc(signal, fragptr.i);
+  }
   return;
 }//Dblqh::execSTART_RECCONF()
 
@@ -14752,6 +14770,9 @@
   } else if ((cstartType == NodeState::ST_NODE_RESTART) ||
              (cstartType == NodeState::ST_SYSTEM_RESTART)) {
     jam();
+    
+    
+
     StartRecConf * conf = (StartRecConf*)signal->getDataPtrSend();
     conf->startingNodeId = getOwnNodeId();
     sendSignal(cmasterDihBlockref, GSN_START_RECCONF, signal, 
Thread
bk commit into 5.1-ndb tree (joreland:1.1845)jonas.oreland13 Apr