From: Jonas Oreland Date: November 14 2011 12:03pm Subject: bzr push into mysql-5.1-telco-7.0 branch (jonas.oreland:4664 to 4665) List-Archive: http://lists.mysql.com/commits/141926 Message-Id: <20111114120329.B0BE01391F@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 4665 Jonas Oreland 2011-11-14 ndb - lqh++ - this patch takes parts of mikaels patch to allow more then 4 lqh threads. Namely adds infrastructure to make redo-log-parts configurable modified: storage/ndb/include/kernel/ndb_limits.h storage/ndb/include/mgmapi/mgmapi_config_parameters.h storage/ndb/include/ndb_version.h.in storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.cpp storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/kernel/vm/GlobalData.hpp 4664 Jonas Oreland 2011-11-14 ndb - rename MAX_FRAG_PER_NODE to MAX_FRAG_PER_LQH...and remove the hard-coded usage of it modified: storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupIndex.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp storage/ndb/src/kernel/vm/pc.hpp === modified file 'storage/ndb/include/kernel/ndb_limits.h' --- a/storage/ndb/include/kernel/ndb_limits.h 2011-10-07 13:15:08 +0000 +++ b/storage/ndb/include/kernel/ndb_limits.h 2011-11-14 12:02:56 +0000 @@ -194,8 +194,9 @@ #define NDBMT_BLOCK_MASK ((1 << NDBMT_BLOCK_BITS) - 1) #define NDBMT_BLOCK_INSTANCE_BITS 7 -#define MAX_NDBMT_LQH_WORKERS 4 -#define MAX_NDBMT_LQH_THREADS 4 +#define NDB_MAX_LOG_PARTS 4 +#define MAX_NDBMT_LQH_WORKERS NDB_MAX_LOG_PARTS +#define MAX_NDBMT_LQH_THREADS NDB_MAX_LOG_PARTS #define MAX_NDBMT_TC_THREADS 2 #define NDB_FILE_BUFFER_SIZE (256*1024) === modified file 'storage/ndb/include/mgmapi/mgmapi_config_parameters.h' --- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2011-10-07 16:12:13 +0000 +++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2011-11-14 12:02:56 +0000 @@ -68,6 +68,7 @@ #define CFG_DB_FILESYSTEM_PATH 125 #define CFG_DB_NO_REDOLOG_FILES 126 +#define CFG_DB_NO_REDOLOG_PARTS 632 #define CFG_DB_REDOLOG_FILE_SIZE 140 #define CFG_DB_LCP_DISC_PAGES_TUP 127 @@ -198,6 +199,7 @@ #define CFG_DB_MT_THREAD_CONFIG 628 #define CFG_DB_CRASH_ON_CORRUPTED_TUPLE 629 +/* 632 used for CFG_DB_NO_REDOLOG_PARTS */ #define CFG_NODE_ARBIT_RANK 200 #define CFG_NODE_ARBIT_DELAY 201 === modified file 'storage/ndb/include/ndb_version.h.in' --- a/storage/ndb/include/ndb_version.h.in 2011-07-04 13:37:56 +0000 +++ b/storage/ndb/include/ndb_version.h.in 2011-11-14 12:02:56 +0000 @@ -693,4 +693,25 @@ ndbd_get_config_supported(Uint32 x) return x >= NDBD_GET_CONFIG_SUPPORT_71; } +#define NDBD_CONFIGURABLE_LOG_PARTS_70 NDB_MAKE_VERSION(7,0,29) +#define NDBD_CONFIGURABLE_LOG_PARTS_71 NDB_MAKE_VERSION(7,1,18) +#define NDBD_CONFIGURABLE_LOG_PARTS_72 NDB_MAKE_VERSION(7,2,3) + +static +inline +int +ndb_configurable_log_parts(Uint32 x) +{ + const Uint32 major = (x >> 16) & 0xFF; + const Uint32 minor = (x >> 8) & 0xFF; + + if (major == 7 && minor < 2) + { + if (minor == 0) + return x >= NDBD_CONFIGURABLE_LOG_PARTS_70; + else if (minor == 1) + return x >= NDBD_CONFIGURABLE_LOG_PARTS_71; + } + return x >= NDBD_CONFIGURABLE_LOG_PARTS_72; +} #endif === modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2011-11-14 09:18:48 +0000 +++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp 2011-11-14 12:02:56 +0000 @@ -7485,6 +7485,8 @@ void Dbdih::execCREATE_FRAGMENTATION_REQ Uint32 err = 0; const Uint32 defaultFragments = c_fragments_per_node * cnoOfNodeGroups * cnoReplicas; + const Uint32 maxFragments = + MAX_FRAG_PER_LQH * getLqhWorkers() * cnoOfNodeGroups * cnoReplicas; do { NodeGroupRecordPtr NGPtr; @@ -7506,11 +7508,15 @@ void Dbdih::execCREATE_FRAGMENTATION_REQ case DictTabInfo::AllNodesMediumTable: jam(); noOfFragments = 2 * defaultFragments; + if (noOfFragments > maxFragments) + noOfFragments = maxFragments; set_default_node_groups(signal, noOfFragments); break; case DictTabInfo::AllNodesLargeTable: jam(); noOfFragments = 4 * defaultFragments; + if (noOfFragments > maxFragments) + noOfFragments = maxFragments; set_default_node_groups(signal, noOfFragments); break; case DictTabInfo::SingleFragment: === modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp' --- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2011-11-14 09:18:48 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2011-11-14 12:02:56 +0000 @@ -111,6 +111,9 @@ class Lgman; #define ZPOS_PREV_PAGE_NO 19 #define ZPOS_IN_FREE_LIST 20 +/* Specify number of log parts used to enable use of more LQH threads */ +#define ZPOS_NO_LOG_PARTS 21 + /* ------------------------------------------------------------------------- */ /* CONSTANTS FOR THE VARIOUS REPLICA AND NODE TYPES. */ /* ------------------------------------------------------------------------- */ @@ -2834,7 +2837,6 @@ private: UintR cfirstfreeLcpLoc; UintR clcpFileSize; -#define ZLOG_PART_FILE_SIZE 4 LogPartRecord *logPartRecord; LogPartRecordPtr logPartPtr; UintR clogPartFileSize; === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.cpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.cpp 2011-06-30 15:59:25 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.cpp 2011-11-14 12:02:56 +0000 @@ -20,6 +20,7 @@ NdbLogPartInfo::NdbLogPartInfo(Uint32 instanceNo) { + LogParts = globalData.ndbLogParts; lqhWorkers = globalData.ndbMtLqhWorkers; partCount = 0; partMask.clear(); === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.hpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.hpp 2011-06-30 15:59:25 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhCommon.hpp 2011-11-14 12:02:56 +0000 @@ -22,7 +22,10 @@ #include /* - * Log part id is from DBDIH. Number of log parts is fixed as 4. + * Log part id is from DBDIH. Number of log parts is configurable with a + * maximum setting and minimum of 4 parts. The below description assumes + * 4 parts. + * * A log part is identified by log part number (0-3) * * log part number = log part id % 4 @@ -38,12 +41,12 @@ * instance (main instance 0 or worker instances 1-4). */ struct NdbLogPartInfo { - enum { LogParts = 4 }; + Uint32 LogParts; NdbLogPartInfo(Uint32 instanceNo); Uint32 lqhWorkers; Uint32 partCount; - Uint16 partNo[LogParts]; - Bitmask<(LogParts+31)/32> partMask; + Uint16 partNo[NDB_MAX_LOG_PARTS]; + Bitmask<(NDB_MAX_LOG_PARTS+31)/32> partMask; Uint32 partNoFromId(Uint32 lpid) const; bool partNoOwner(Uint32 lpno) const; bool partNoOwner(Uint32 tabId, Uint32 fragId); === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp 2011-06-30 15:59:25 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp 2011-11-14 12:02:56 +0000 @@ -36,9 +36,7 @@ void Dblqh::initData() clcpFileSize = ZNO_CONCURRENT_LCP; clfoFileSize = 0; clogFileFileSize = 0; - - NdbLogPartInfo lpinfo(instance()); - clogPartFileSize = lpinfo.partCount; + clogPartFileSize = 0; // Not valid until READ_CONFIG cpageRefFileSize = ZPAGE_REF_FILE_SIZE; cscanrecFileSize = 0; @@ -117,7 +115,7 @@ void Dblqh::initRecords() logPartRecord = (LogPartRecord*)allocRecord("LogPartRecord", sizeof(LogPartRecord), - clogPartFileSize); + NDB_MAX_LOG_PARTS); logFileRecord = (LogFileRecord*)allocRecord("LogFileRecord", sizeof(LogFileRecord), === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2011-11-14 09:18:48 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2011-11-14 12:02:56 +0000 @@ -1219,7 +1219,34 @@ void Dblqh::execREAD_CONFIG_REQ(Signal* const ndb_mgm_configuration_iterator * p = m_ctx.m_config.getOwnConfigIterator(); ndbrequire(p != 0); - + + clogPartFileSize = 4; + ndb_mgm_get_int_parameter(p, CFG_DB_NO_REDOLOG_PARTS, + &clogPartFileSize); + globalData.ndbLogParts = clogPartFileSize; + ndbrequire(clogPartFileSize <= NDB_MAX_LOG_PARTS); + + if (globalData.ndbMtLqhWorkers > clogPartFileSize) + { + char buf[255]; + BaseString::snprintf(buf, sizeof(buf), + "Trying to start %d LQH workers with only %d log parts, try initial" + " node restart to be able to use more LQH workers.", + globalData.ndbMtLqhWorkers, clogPartFileSize); + progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); + } + if (clogPartFileSize != 4 && + clogPartFileSize != 8 && + clogPartFileSize != 16) + { + char buf[255]; + BaseString::snprintf(buf, sizeof(buf), + "Trying to start with %d log parts, number of log parts can" + " only be set to 4, 8 or 16.", + clogPartFileSize); + progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); + } + cnoLogFiles = 8; ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_NO_REDOLOG_FILES, &cnoLogFiles)); @@ -14644,7 +14671,7 @@ void Dblqh::initGcpRecLab(Signal* signal }//for // initialize un-used part Uint32 Ti; - for (Ti = clogPartFileSize; Ti < ZLOG_PART_FILE_SIZE; Ti++) { + for (Ti = clogPartFileSize; Ti < NDB_MAX_LOG_PARTS; Ti++) { gcpPtr.p->gcpFilePtr[Ti] = ZNIL; gcpPtr.p->gcpPageNo[Ti] = ZNIL; gcpPtr.p->gcpSyncReady[Ti] = FALSE; @@ -15698,7 +15725,10 @@ void Dblqh::initWriteEndLab(Signal* sign /*---------------------------------------------------------------------------*/ /* PAGE ZERO IN FILE ZERO MUST SET LOG LAP TO ONE SINCE IT HAS STARTED */ /* WRITING TO THE LOG, ALSO GLOBAL CHECKPOINTS ARE SET TO ZERO. */ +/* Set number of log parts used to ensure we use correct number of log parts */ +/* at system restart. Was previously hardcoded to 4. */ /*---------------------------------------------------------------------------*/ + logPagePtr.p->logPageWord[ZPOS_NO_LOG_PARTS]= clogPartFileSize; logPagePtr.p->logPageWord[ZPOS_LOG_LAP] = 1; logPagePtr.p->logPageWord[ZPOS_MAX_GCI_STARTED] = 0; logPagePtr.p->logPageWord[ZPOS_MAX_GCI_COMPLETED] = 0; @@ -15881,6 +15911,8 @@ void Dblqh::initLogpage(Signal* signal) { TcConnectionrecPtr ilpTcConnectptr; + /* Ensure all non-used header words are zero */ + bzero(logPagePtr.p, sizeof(Uint32) * ZPAGE_HEADER_SIZE); logPagePtr.p->logPageWord[ZPOS_LOG_LAP] = logPartPtr.p->logLap; logPagePtr.p->logPageWord[ZPOS_MAX_GCI_COMPLETED] = logPartPtr.p->logPartNewestCompletedGCI; @@ -16423,6 +16455,35 @@ void Dblqh::openSrFrontpageLab(Signal* s * -------------------------------------------------------------------------- */ void Dblqh::readSrFrontpageLab(Signal* signal) { + Uint32 num_parts_used; + if (!ndb_configurable_log_parts(logPagePtr.p->logPageWord[ZPOS_VERSION])) { + jam(); + num_parts_used= 4; + } + else + { + jam(); + num_parts_used = logPagePtr.p->logPageWord[ZPOS_NO_LOG_PARTS]; + } + /* Verify that number of log parts >= number of LQH workers */ + if (globalData.ndbMtLqhWorkers > num_parts_used) { + char buf[255]; + BaseString::snprintf(buf, sizeof(buf), + "Trying to start %d LQH workers with only %d log parts, try initial" + " node restart to be able to use more LQH workers.", + globalData.ndbMtLqhWorkers, num_parts_used); + progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); + } + if (num_parts_used != clogPartFileSize) + { + char buf[255]; + BaseString::snprintf(buf, sizeof(buf), + "Can only change NoOfLogParts through initial node restart, old" + " value of NoOfLogParts = %d, tried using %d", + num_parts_used, clogPartFileSize); + progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); + } + Uint32 fileNo = logPagePtr.p->logPageWord[ZPAGE_HEADER_SIZE + ZPOS_FILE_NO]; if (fileNo == 0) { jam(); @@ -20328,7 +20389,7 @@ void Dblqh::initialiseGcprec(Signal* sig if (cgcprecFileSize != 0) { for (gcpPtr.i = 0; gcpPtr.i < cgcprecFileSize; gcpPtr.i++) { ptrAss(gcpPtr, gcpRecord); - for (tigpIndex = 0; tigpIndex < ZLOG_PART_FILE_SIZE; tigpIndex++) { + for (tigpIndex = 0; tigpIndex < NDB_MAX_LOG_PARTS; tigpIndex++) { gcpPtr.p->gcpLogPartState[tigpIndex] = ZIDLE; gcpPtr.p->gcpSyncReady[tigpIndex] = ZFALSE; }//for === modified file 'storage/ndb/src/kernel/vm/GlobalData.hpp' --- a/storage/ndb/src/kernel/vm/GlobalData.hpp 2011-09-15 20:21:59 +0000 +++ b/storage/ndb/src/kernel/vm/GlobalData.hpp 2011-11-14 12:02:56 +0000 @@ -75,6 +75,7 @@ struct GlobalData { Uint32 ndbMtLqhWorkers; Uint32 ndbMtLqhThreads; Uint32 ndbMtTcThreads; + Uint32 ndbLogParts; GlobalData(){ theSignalId = 0; @@ -85,6 +86,7 @@ struct GlobalData { ndbMtLqhWorkers = 0; ndbMtLqhThreads = 0; ndbMtTcThreads = 0; + ndbLogParts = 0; #ifdef GCP_TIMER_HACK gcp_timer_limit = 0; #endif No bundle (reason: useless for push emails).