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 <Bitmask.hpp>
/*
- * 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).
| Thread |
|---|
| • bzr push into mysql-5.1-telco-7.0 branch (jonas.oreland:4664 to 4665) | Jonas Oreland | 14 Nov |