List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:November 19 2008 10:10am
Subject:bzr commit into mysql-5.1 branch (jonas:2753) Bug#40847
View as plain text  
#At file:///home/jonas/src/telco-6.3/

 2753 Jonas Oreland	2008-11-19
      ndb - bug#40847 - Add config for full initialization of fragment logfiles
modified:
  mysql-test/ndb/ndb_config_2_node.ini
  storage/ndb/include/kernel/signaldata/FsReadWriteReq.hpp
  storage/ndb/include/mgmapi/mgmapi_config_parameters.h
  storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
  storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp
  storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
  storage/ndb/src/kernel/vm/SimulatedBlock.cpp
  storage/ndb/src/kernel/vm/SimulatedBlock.hpp
  storage/ndb/src/mgmsrv/ConfigInfo.cpp

=== modified file 'mysql-test/ndb/ndb_config_2_node.ini'
--- a/mysql-test/ndb/ndb_config_2_node.ini	2007-11-15 00:29:37 +0000
+++ b/mysql-test/ndb/ndb_config_2_node.ini	2008-11-19 10:10:43 +0000
@@ -35,6 +35,7 @@ HostName= CHOOSE_HOSTNAME_1   # hostname
 
 [ndbd]
 HostName= CHOOSE_HOSTNAME_2   # hostname is a valid network adress
+InitFragmentLogFiles=full
 
 [ndb_mgmd]
 HostName= CHOOSE_HOSTNAME_1   # hostname is a valid network adress

=== modified file 'storage/ndb/include/kernel/signaldata/FsReadWriteReq.hpp'
--- a/storage/ndb/include/kernel/signaldata/FsReadWriteReq.hpp	2007-11-15 00:30:00 +0000
+++ b/storage/ndb/include/kernel/signaldata/FsReadWriteReq.hpp	2008-11-19 10:10:43 +0000
@@ -45,6 +45,7 @@ class FsReadWriteReq {
   friend class Tsman;
   friend class Pgman;
   friend class Restore;
+  friend class Dblqh;
 
   /**
    * For printing

=== modified file 'storage/ndb/include/mgmapi/mgmapi_config_parameters.h'
--- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h	2008-05-29 13:24:03 +0000
+++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h	2008-11-19 10:10:43 +0000
@@ -139,6 +139,8 @@
 #define CFG_DB_MAX_BUFFERED_EPOCHS    182
 #define CFG_DB_SUMA_HANDOVER_TIMEOUT  183
 
+#define CFG_DB_INIT_REDO              189
+
 #define CFG_DB_SGA                    198 /* super pool mem */
 #define CFG_DB_DATA_MEM_2             199 /* used in special build in 5.1 */
 

=== modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp	2008-11-14 11:19:35 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp	2008-11-19 10:10:43 +0000
@@ -2158,6 +2158,7 @@ private:
   void execFSWRITEREF(Signal* signal);
   void execFSREADCONF(Signal* signal);
   void execFSREADREF(Signal* signal);
+  void execFSWRITEREQ(Signal*);
   void execSCAN_HBREP(Signal* signal);
   void execTIME_SIGNAL(Signal* signal);
   void execFSSYNCCONF(Signal* signal);
@@ -2904,6 +2905,7 @@ private:
   
   Uint32 c_diskless;
   Uint32 c_o_direct;
+  Uint32 m_use_om_init;
   Uint32 c_error_insert_table_id;
   
 public:

=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp	2007-11-19 10:04:24 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp	2008-11-19 10:10:43 +0000
@@ -309,6 +309,10 @@ Dblqh::Dblqh(Block_context& ctx):
   addRecSignal(GSN_PREPARE_COPY_FRAG_REQ,
 	       &Dblqh::execPREPARE_COPY_FRAG_REQ);
   
+
+  addRecSignal(GSN_FSWRITEREQ,
+               &Dblqh::execFSWRITEREQ);
+
   initData();
 
 #ifdef VM_TRACE

=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2008-11-14 11:19:35 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2008-11-19 10:10:43 +0000
@@ -63,6 +63,7 @@
 #include <KeyDescriptor.hpp>
 #include <signaldata/RouteOrd.hpp>
 #include <signaldata/FsRef.hpp>
+#include <signaldata/FsReadWriteReq.hpp>
 
 #include "../suma/Suma.hpp"
 
@@ -840,7 +841,8 @@ void Dblqh::startphase3Lab(Signal* signa
       initLogfile(signal, fileNo);
       if ((cstartType == NodeState::ST_INITIAL_START) ||
 	  (cstartType == NodeState::ST_INITIAL_NODE_RESTART)) {
-        if (logFilePtr.i == zeroLogFilePtr.i) {
+        if (logFilePtr.i == zeroLogFilePtr.i)
+        {
           jam();
 /* ------------------------------------------------------------------------- */
 /*IN AN INITIAL START WE START BY CREATING ALL LOG FILES AND SETTING THEIR   */
@@ -848,7 +850,26 @@ void Dblqh::startphase3Lab(Signal* signa
 /*WE START BY CREATING FILE ZERO IN EACH LOG PART AND THEN PROCEED           */
 /*SEQUENTIALLY THROUGH ALL LOG FILES IN THE LOG PART.                        */
 /* ------------------------------------------------------------------------- */
-          openLogfileInit(signal);
+          if (m_use_om_init == 0 || logPartPtr.i == 0)
+          {
+            /**
+             * initialize one file at a time if using OM_INIT
+             */
+            jam();
+#ifdef VM_TRACE
+            if (m_use_om_init)
+            {
+              jam();
+              /**
+               * FSWRITEREQ does cross-thread execute-direct
+               *   which makes the clear_global_variables "unsafe"
+               *   disable it until we're finished with init log-files
+               */
+              disable_global_variables();
+            }
+#endif
+            openLogfileInit(signal);
+          }
         }//if
       }//if
     }//for
@@ -1046,6 +1067,25 @@ void Dblqh::execREAD_CONFIG_REQ(Signal* 
   c_o_direct = true;
   ndb_mgm_get_int_parameter(p, CFG_DB_O_DIRECT, &c_o_direct);
   
+  m_use_om_init = 0;
+  {
+    const char * conf = 0;
+    if (!ndb_mgm_get_string_parameter(p, CFG_DB_INIT_REDO, &conf) && conf)
+    {
+      jam();
+      if (strcmp(conf, "sparse") == 0)
+      {
+        jam();
+        m_use_om_init = 0;
+      }
+      else if (strcmp(conf, "full") == 0)
+      {
+        jam();
+        m_use_om_init = 1;
+      }
+    }
+  }
+
   Uint32 tmp= 0;
   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_LQH_FRAG, &tmp));
   c_fragment_pool.setSize(tmp);
@@ -13417,9 +13457,20 @@ void Dblqh::openFileInitLab(Signal* sign
 {
   logFilePtr.p->logFileStatus = LogFileRecord::OPEN_INIT;
   seizeLogpage(signal);
-  writeSinglePage(signal, (clogFileSize * ZPAGES_IN_MBYTE) - 1,
-                  ZPAGE_SIZE - 1, __LINE__, false);
-  lfoPtr.p->lfoState = LogFileOperationRecord::INIT_WRITE_AT_END;
+  if (m_use_om_init == 0)
+  {
+    jam();
+    initLogpage(signal);
+    writeSinglePage(signal, (clogFileSize * ZPAGES_IN_MBYTE) - 1,
+                    ZPAGE_SIZE - 1, __LINE__, false);
+    lfoPtr.p->lfoState = LogFileOperationRecord::INIT_WRITE_AT_END;
+  }
+  else
+  {
+    jam();
+    seizeLfo(signal);
+    initWriteEndLab(signal);
+  }
   return;
 }//Dblqh::openFileInitLab()
 
@@ -13518,6 +13569,18 @@ void Dblqh::checkInitCompletedLab(Signal
 /* MEANS THIS PART OF THE LOG IS NOT WRITTEN YET.                            */
 /*---------------------------------------------------------------------------*/
   logPartPtr.p->logLap = 1;
+
+  if (m_use_om_init && logPartPtr.i != 3)
+  {
+    jam();
+    logPartPtr.i++;
+    ptrAss(logPartPtr, logPartRecord);
+    logFilePtr.i = logPartPtr.p->firstLogfile;
+    ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
+    openLogfileInit(signal);
+    return;
+  }
+
   logPartPtr.i = 0;
 CHECK_LOG_PARTS_LOOP:
   ptrAss(logPartPtr, logPartRecord);
@@ -13536,6 +13599,9 @@ CHECK_LOG_PARTS_LOOP:
 /* NEED TO INITIALISE ALL NEEDED DATA AND TO OPEN FILE ZERO AND THE NEXT AND */
 /* TO SET THE CURRENT LOG PAGE TO BE PAGE 1 IN FILE ZERO.                    */
 /*---------------------------------------------------------------------------*/
+#ifdef VM_TRACE
+    enable_global_variables();
+#endif
     for (logPartPtr.i = 0; logPartPtr.i <= 3; logPartPtr.i++) {
       ptrAss(logPartPtr, logPartRecord);
       signal->theData[0] = ZINIT_FOURTH;
@@ -13680,10 +13746,76 @@ void Dblqh::openLogfileInit(Signal* sign
   signal->theData[6] = FsOpenReq::OM_READWRITE | FsOpenReq::OM_TRUNCATE | FsOpenReq::OM_CREATE | FsOpenReq::OM_AUTOSYNC;
   if (c_o_direct)
     signal->theData[6] |= FsOpenReq::OM_DIRECT;
+
+  Uint64 sz = Uint64(clogFileSize) * 1024 * 1024;
+  req->file_size_hi = Uint32(sz >> 32);
+  req->file_size_lo = Uint32(sz);
+  req->page_size = File_formats::NDB_PAGE_SIZE;
+  if (m_use_om_init)
+  {
+    jam();
+    signal->theData[6] |= FsOpenReq::OM_INIT;
+  }
+
   req->auto_sync_size = MAX_REDO_PAGES_WITHOUT_SYNCH * sizeof(LogPageRecord);
   sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, FsOpenReq::SignalLength, JBA);
 }//Dblqh::openLogfileInit()
 
+void
+Dblqh::execFSWRITEREQ(Signal* signal)
+{
+  /**
+   * This is currently run in other thread -> no jam
+   *   and no global variables
+   */
+  Ptr<GlobalPage> page_ptr;
+  FsReadWriteReq* req= (FsReadWriteReq*)signal->getDataPtr();
+  m_shared_page_pool.getPtr(page_ptr, req->data.pageData[0]);
+
+  LogFileRecordPtr currLogFilePtr;
+  currLogFilePtr.i = req->userPointer;
+  ptrCheckGuard(currLogFilePtr, clogFileFileSize, logFileRecord);
+
+  LogPartRecordPtr currLogPartPtr;
+  currLogPartPtr.i = currLogFilePtr.p->logPartRec;
+  ptrCheckGuard(currLogPartPtr, clogPartFileSize, logPartRecord);
+
+  Uint32 page_no = req->varIndex;
+  LogPageRecordPtr currLogPagePtr;
+  currLogPagePtr.p = (LogPageRecord*)page_ptr.p;
+
+  bzero(page_ptr.p, sizeof(LogPageRecord));
+  if (page_no == 0)
+  {
+    // keep writing these afterwards
+  }
+  else if (((page_no % ZPAGES_IN_MBYTE) == 0) ||
+           (page_no == ((clogFileSize * ZPAGES_IN_MBYTE) - 1)))
+  {
+    currLogPagePtr.p->logPageWord[ZPOS_LOG_LAP] = currLogPartPtr.p->logLap;
+    currLogPagePtr.p->logPageWord[ZPOS_MAX_GCI_COMPLETED] =
+      currLogPartPtr.p->logPartNewestCompletedGCI;
+    currLogPagePtr.p->logPageWord[ZPOS_MAX_GCI_STARTED] = cnewestGci;
+    currLogPagePtr.p->logPageWord[ZPOS_VERSION] = NDB_VERSION;
+    currLogPagePtr.p->logPageWord[ZPOS_NO_LOG_FILES] =
+      currLogPartPtr.p->noLogFiles;
+    currLogPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = ZPAGE_HEADER_SIZE;
+    currLogPagePtr.p->logPageWord[ZLAST_LOG_PREP_REF] =
+      (currLogFilePtr.p->fileNo << 16) +
+      (currLogFilePtr.p->currentFilepage >> ZTWOLOG_NO_PAGES_IN_MBYTE);
+
+    currLogPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
+    currLogPagePtr.p->logPageWord[ZPOS_CHECKSUM] =
+      calcPageCheckSum(currLogPagePtr);
+  }
+  else if (0)
+  {
+    currLogPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
+    currLogPagePtr.p->logPageWord[ZPOS_CHECKSUM] =
+      calcPageCheckSum(currLogPagePtr);
+  }
+}
+
 /* OPEN FOR READ/WRITE, DO CREATE AND DO TRUNCATE FILE */
 /* ------------------------------------------------------------------------- */
 /* -------               OPEN NEXT LOG FILE                          ------- */
@@ -13832,6 +13964,9 @@ void Dblqh::seizeLogpage(Signal* signal)
 /*IF LIST IS EMPTY THEN A SYSTEM CRASH IS INVOKED SINCE LOG_PAGE_PTR = RNIL  */
 /* ------------------------------------------------------------------------- */
   cfirstfreeLogPage = logPagePtr.p->logPageWord[ZNEXT_PAGE];
+#ifdef VM_TRACE
+  bzero(logPagePtr.p, sizeof(LogPageRecord));
+#endif
   logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
   logPagePtr.p->logPageWord[ZPOS_IN_FREE_LIST] = 0;
 }//Dblqh::seizeLogpage()
@@ -13964,10 +14099,21 @@ void Dblqh::writeFileHeaderOpen(Signal* 
 /* ------------------------------------------------------------------------- */
 void Dblqh::writeInitMbyte(Signal* signal) 
 {
-  initLogpage(signal);
-  writeSinglePage(signal, logFilePtr.p->currentMbyte * ZPAGES_IN_MBYTE,
-                  ZPAGE_SIZE - 1, __LINE__, false);
-  lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_INIT_MBYTE;
+  if (m_use_om_init == 0)
+  {
+    jam();
+    initLogpage(signal);
+    writeSinglePage(signal, logFilePtr.p->currentMbyte * ZPAGES_IN_MBYTE,
+                    ZPAGE_SIZE - 1, __LINE__, false);
+    lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_INIT_MBYTE;
+  }
+  else
+  {
+    jam();
+    seizeLfo(signal);
+    logFilePtr.p->currentMbyte = clogFileSize - 1;
+    writeInitMbyteLab(signal);
+  }
 }//Dblqh::writeInitMbyte()
 
 /* ------------------------------------------------------------------------- */

=== modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.cpp'
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp	2008-08-11 11:24:12 +0000
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp	2008-11-19 10:10:43 +0000
@@ -83,6 +83,7 @@ SimulatedBlock::SimulatedBlock(BlockNumb
 #ifdef VM_TRACE
   m_global_variables = new Ptr<void> * [1];
   m_global_variables[0] = 0;
+  m_global_variables_save = 0;
 #endif
 }
 
@@ -2166,6 +2167,23 @@ SimulatedBlock::execFSAPPENDREF(Signal* 
 }
 
 #ifdef VM_TRACE
+static Ptr<void> * m_empty_global_variables[] = { 0 };
+void
+SimulatedBlock::disable_global_variables()
+{
+  m_global_variables_save = m_global_variables;
+  m_global_variables = m_empty_global_variables;
+}
+
+void
+SimulatedBlock::enable_global_variables()
+{
+  if (m_global_variables == m_empty_global_variables)
+  {
+    m_global_variables = m_global_variables_save;
+  }
+}
+
 void
 SimulatedBlock::clear_global_variables(){
   Ptr<void> ** tmp = m_global_variables;

=== modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.hpp'
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.hpp	2008-11-06 16:46:27 +0000
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.hpp	2008-11-19 10:10:43 +0000
@@ -598,9 +598,11 @@ public:
 #endif
 
 #ifdef VM_TRACE
-  Ptr<void> **m_global_variables;
+  Ptr<void> **m_global_variables, **m_global_variables_save;
   void clear_global_variables();
   void init_globals_list(void ** tmp, size_t cnt);
+  void disable_global_variables();
+  void enable_global_variables();
 #endif
 };
 

=== modified file 'storage/ndb/src/mgmsrv/ConfigInfo.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp	2008-11-03 08:33:52 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp	2008-11-19 10:10:43 +0000
@@ -1049,6 +1049,17 @@ const ConfigInfo::ParamInfo ConfigInfo::
     "1G" },
 
   {
+    CFG_DB_INIT_REDO,
+    "InitFragmentLogFiles",
+    DB_TOKEN,
+    "Initialize fragment logfiles (sparse/full)",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_STRING,
+    UNDEFINED,
+    0, 0 },
+
+  {
     CFG_DB_MAX_OPEN_FILES,
     "MaxNoOfOpenFiles",
     DB_TOKEN,

Thread
bzr commit into mysql-5.1 branch (jonas:2753) Bug#40847Jonas Oreland19 Nov