From: Date: November 19 2008 11:10am Subject: bzr commit into mysql-5.1 branch (jonas:2753) Bug#40847 List-Archive: http://lists.mysql.com/commits/59178 X-Bug: 40847 Message-Id: <20081119101054.904CB7CA03@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #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 #include #include +#include #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 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 * [1]; m_global_variables[0] = 0; + m_global_variables_save = 0; #endif } @@ -2166,6 +2167,23 @@ SimulatedBlock::execFSAPPENDREF(Signal* } #ifdef VM_TRACE +static Ptr * 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 ** 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 **m_global_variables; + Ptr **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,