Commit 83e24e72 authored by unknown's avatar unknown

Fix for Bug #20395 Cluster datanodes always assigned to nodegroup 0 during single user mode.

Data node is not allowed to get added in the cluster when it is in single user mode.


ndb/include/kernel/signaldata/CmRegSignalData.hpp:
  Data node is not allowed to get added in the cluster when it is in single user mode.
ndb/include/mgmapi/ndbd_exit_codes.h:
  Data node is not allowed to get added in the cluster when it is in single user mode.
ndb/include/ndb_version.h.in:
  added version macro for version 5.0.25.
ndb/src/kernel/blocks/qmgr/QmgrMain.cpp:
  Data node is not allowed to get added in the cluster when it is in single user mode.
ndb/src/kernel/error/ndbd_exit_codes.c:
  Data node is not allowed to get added in the cluster when it is in single user mode.
parent 89ba8448
......@@ -90,7 +90,11 @@ public:
ZNOT_PRESIDENT = 5, /* We are not president */
ZNOT_DEAD = 6, /* We are not dead when we are starting */
ZINCOMPATIBLE_VERSION = 7,
ZINCOMPATIBLE_START_TYPE = 8
ZINCOMPATIBLE_START_TYPE = 8,
ZSINGLE_USER_MODE = 9, /* The cluster is in single user mode,
* data node is not allowed to get added
* in the cluster while in single user mode */
ZGENERIC = 100 /* The generic error code */
};
private:
......
......@@ -65,6 +65,7 @@ typedef ndbd_exit_status_enum ndbd_exit_status;
typedef ndbd_exit_classification_enum ndbd_exit_classification;
/* Errorcodes before block division was used */
#define NDBD_EXIT_GENERIC 2300
#define NDBD_EXIT_PRGERR 2301
#define NDBD_EXIT_NODE_NOT_IN_CONFIG 2302
#define NDBD_EXIT_SYSTEM_ERROR 2303
......@@ -78,6 +79,7 @@ typedef ndbd_exit_classification_enum ndbd_exit_classification;
#define NDBD_EXIT_SR_RESTARTCONFLICT 2311
#define NDBD_EXIT_NO_MORE_UNDOLOG 2312
#define NDBD_EXIT_SR_UNDOLOG 2313
#define NDBD_EXIT_SINGLE_USER_MODE 2314
#define NDBD_EXIT_MEMALLOC 2327
#define NDBD_EXIT_BLOCK_JBUFCONGESTION 2334
#define NDBD_EXIT_TIME_QUEUE_SHORT 2335
......
......@@ -62,5 +62,6 @@ char ndb_version_string_buf[NDB_VERSION_STRING_BUF_SZ];
#define NDBD_DICT_LOCK_VERSION_5 MAKE_VERSION(5,0,23)
#define NDBD_QMGR_SINGLEUSER_VERSION_5 MAKE_VERSION(5,0,25)
#endif
......@@ -153,6 +153,7 @@ void Qmgr::execCONTINUEB(Signal* signal)
return;
}
Uint64 now = NdbTick_CurrentMillisecond();
if (now > (c_start_election_time + c_restartFailureTimeout))
{
jam();
......@@ -698,7 +699,40 @@ void Qmgr::execCM_REGREQ(Signal* signal)
sendCmRegrefLab(signal, Tblockref, CmRegRef::ZNOT_IN_CFG);
return;
}
if (getNodeState().getSingleUserMode())
{
/**
* The cluster is in single user mode.
* Data node is not allowed to get added in the cluster
* while in single user mode.
*/
// handle rolling upgrade
{
unsigned int get_major = getMajor(startingVersion);
unsigned int get_minor = getMinor(startingVersion);
unsigned int get_build = getBuild(startingVersion);
if (startingVersion < NDBD_QMGR_SINGLEUSER_VERSION_5) {
jam();
infoEvent("QMGR: detect upgrade: new node %u old version %u.%u.%u",
(unsigned int)addNodePtr.i, get_major, get_minor, get_build);
/**
* The new node is old version, send ZINCOMPATIBLE_VERSION instead
* of ZSINGLE_USER_MODE.
*/
sendCmRegrefLab(signal, Tblockref, CmRegRef::ZINCOMPATIBLE_VERSION);
} else {
jam();
sendCmRegrefLab(signal, Tblockref, CmRegRef::ZSINGLE_USER_MODE);
}//if
}
return;
}//if
ptrCheckGuard(addNodePtr, MAX_NDB_NODES, nodeRec);
Phase phase = addNodePtr.p->phase;
if (phase != ZINIT)
......@@ -1093,6 +1127,19 @@ void Qmgr::execCM_REGREF(Signal* signal)
jam();
progError(__LINE__, NDBD_EXIT_NODE_NOT_DEAD);
break;
case CmRegRef::ZSINGLE_USER_MODE:
jam();
progError(__LINE__, NDBD_EXIT_SINGLE_USER_MODE);
break;
/**
* For generic refuse error.
* e.g. in online upgrade, we can use this error code instead
* of the incompatible error code.
*/
case CmRegRef::ZGENERIC:
jam();
progError(__LINE__, NDBD_EXIT_GENERIC);
break;
case CmRegRef::ZELECTION:
jam();
if (candidate_gci > c_start.m_president_candidate_gci ||
......@@ -2025,7 +2072,7 @@ void Qmgr::initData(Signal* signal)
&c_restartPartionedTimeout);
ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT,
&c_restartFailureTimeout);
if(c_restartPartialTimeout == 0)
{
c_restartPartialTimeout = ~0;
......
......@@ -45,6 +45,7 @@ typedef struct ErrStruct {
static const ErrStruct errArray[] =
{
{NDBD_EXIT_GENERIC, XRE, "Generic error"},
{NDBD_EXIT_PRGERR, XIE, "Assertion"},
{NDBD_EXIT_NODE_NOT_IN_CONFIG, XCE,
"node id in the configuration has the wrong type, (i.e. not an NDB node)"},
......@@ -68,6 +69,8 @@ static const ErrStruct errArray[] =
"No more free UNDO log, increase UndoIndexBuffer"},
{NDBD_EXIT_SR_UNDOLOG, XFI,
"Error while reading the datapages and UNDO log"},
{NDBD_EXIT_SINGLE_USER_MODE, XRE, "Data node is not allowed to get added "
"to the cluster while it is in single user mode"},
{NDBD_EXIT_MEMALLOC, XCE, "Memory allocation failure, "
"please decrease some configuration parameters"},
{NDBD_EXIT_BLOCK_JBUFCONGESTION, XIE, "Job buffer congestion"},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment