mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
ndb: new arbitrator behaviour for >=3-way: < 1/2 nodes can survive
ndb/include/kernel/signaldata/ArbitSignalData.hpp: new arbitrator behaviour for >=3-way: < 1/2 nodes can survive ndb/src/common/debugger/EventLogger.cpp: new arbitrator behaviour for >=3-way: < 1/2 nodes can survive ndb/src/kernel/blocks/qmgr/QmgrMain.cpp: new arbitrator behaviour for >=3-way: < 1/2 nodes can survive
This commit is contained in:
@ -94,13 +94,14 @@ public:
|
|||||||
|
|
||||||
// arbitration result
|
// arbitration result
|
||||||
LoseNodes = 41, // lose on ndb node count
|
LoseNodes = 41, // lose on ndb node count
|
||||||
WinGroups = 42, // we win, no need for arbitration
|
WinNodes = 42, // win on ndb node count
|
||||||
LoseGroups = 43, // we lose, missing node group
|
WinGroups = 43, // we win, no need for arbitration
|
||||||
Partitioning = 44, // possible network partitioning
|
LoseGroups = 44, // we lose, missing node group
|
||||||
WinChoose = 45, // positive reply
|
Partitioning = 45, // possible network partitioning
|
||||||
LoseChoose = 46, // negative reply
|
WinChoose = 46, // positive reply
|
||||||
LoseNorun = 47, // arbitrator required but not running
|
LoseChoose = 47, // negative reply
|
||||||
LoseNocfg = 48, // arbitrator required but none configured
|
LoseNorun = 48, // arbitrator required but not running
|
||||||
|
LoseNocfg = 49, // arbitrator required but none configured
|
||||||
|
|
||||||
// general error codes
|
// general error codes
|
||||||
ErrTicket = 91, // invalid arbitrator-ticket
|
ErrTicket = 91, // invalid arbitrator-ticket
|
||||||
|
@ -421,6 +421,11 @@ EventLogger::getText(char * m_text, size_t m_text_len,
|
|||||||
"%sArbitration check lost - less than 1/2 nodes left",
|
"%sArbitration check lost - less than 1/2 nodes left",
|
||||||
theNodeId);
|
theNodeId);
|
||||||
break;
|
break;
|
||||||
|
case ArbitCode::WinNodes:
|
||||||
|
BaseString::snprintf(m_text, m_text_len,
|
||||||
|
"%sArbitration check won - all node groups and more than 1/2 nodes left",
|
||||||
|
theNodeId);
|
||||||
|
break;
|
||||||
case ArbitCode::WinGroups:
|
case ArbitCode::WinGroups:
|
||||||
BaseString::snprintf(m_text, m_text_len,
|
BaseString::snprintf(m_text, m_text_len,
|
||||||
"%sArbitration check won - node group majority",
|
"%sArbitration check won - node group majority",
|
||||||
|
@ -2946,6 +2946,12 @@ void Qmgr::sendPrepFailReq(Signal* signal, Uint16 aNode)
|
|||||||
* the "handle" routines.
|
* the "handle" routines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should < 1/2 nodes die unconditionally. Affects only >= 3-way
|
||||||
|
* replication.
|
||||||
|
*/
|
||||||
|
static const bool g_ndb_arbit_one_half_rule = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Config signals are logically part of CM_INIT.
|
* Config signals are logically part of CM_INIT.
|
||||||
*/
|
*/
|
||||||
@ -3157,7 +3163,8 @@ Qmgr::handleArbitCheck(Signal* signal)
|
|||||||
ndbrequire(cpresident == getOwnNodeId());
|
ndbrequire(cpresident == getOwnNodeId());
|
||||||
NodeBitmask ndbMask;
|
NodeBitmask ndbMask;
|
||||||
computeArbitNdbMask(ndbMask);
|
computeArbitNdbMask(ndbMask);
|
||||||
if (2 * ndbMask.count() < cnoOfNodes) {
|
if (g_ndb_arbit_one_half_rule &&
|
||||||
|
2 * ndbMask.count() < cnoOfNodes) {
|
||||||
jam();
|
jam();
|
||||||
arbitRec.code = ArbitCode::LoseNodes;
|
arbitRec.code = ArbitCode::LoseNodes;
|
||||||
} else {
|
} else {
|
||||||
@ -3181,6 +3188,11 @@ Qmgr::handleArbitCheck(Signal* signal)
|
|||||||
case CheckNodeGroups::Partitioning:
|
case CheckNodeGroups::Partitioning:
|
||||||
jam();
|
jam();
|
||||||
arbitRec.code = ArbitCode::Partitioning;
|
arbitRec.code = ArbitCode::Partitioning;
|
||||||
|
if (g_ndb_arbit_one_half_rule &&
|
||||||
|
2 * ndbMask.count() > cnoOfNodes) {
|
||||||
|
jam();
|
||||||
|
arbitRec.code = ArbitCode::WinNodes;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ndbrequire(false);
|
ndbrequire(false);
|
||||||
@ -3190,8 +3202,12 @@ Qmgr::handleArbitCheck(Signal* signal)
|
|||||||
switch (arbitRec.code) {
|
switch (arbitRec.code) {
|
||||||
case ArbitCode::LoseNodes:
|
case ArbitCode::LoseNodes:
|
||||||
jam();
|
jam();
|
||||||
|
case ArbitCode::LoseGroups:
|
||||||
|
jam();
|
||||||
goto crashme;
|
goto crashme;
|
||||||
case ArbitCode::WinGroups:
|
case ArbitCode::WinNodes:
|
||||||
|
jam();
|
||||||
|
case ArbitCode::WinGroups:
|
||||||
jam();
|
jam();
|
||||||
if (arbitRec.state == ARBIT_RUN) {
|
if (arbitRec.state == ARBIT_RUN) {
|
||||||
jam();
|
jam();
|
||||||
@ -3200,9 +3216,6 @@ Qmgr::handleArbitCheck(Signal* signal)
|
|||||||
arbitRec.state = ARBIT_INIT;
|
arbitRec.state = ARBIT_INIT;
|
||||||
arbitRec.newstate = true;
|
arbitRec.newstate = true;
|
||||||
break;
|
break;
|
||||||
case ArbitCode::LoseGroups:
|
|
||||||
jam();
|
|
||||||
goto crashme;
|
|
||||||
case ArbitCode::Partitioning:
|
case ArbitCode::Partitioning:
|
||||||
if (arbitRec.state == ARBIT_RUN) {
|
if (arbitRec.state == ARBIT_RUN) {
|
||||||
jam();
|
jam();
|
||||||
@ -3762,8 +3775,7 @@ Qmgr::execARBIT_CHOOSEREF(Signal* signal)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle CRASH state. We must crash immediately. But it
|
* Handle CRASH state. We must crash immediately.
|
||||||
* would be nice to wait until event reports have been sent.
|
|
||||||
* XXX tell other nodes in our party to crash too.
|
* XXX tell other nodes in our party to crash too.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@ -3773,12 +3785,11 @@ Qmgr::stateArbitCrash(Signal* signal)
|
|||||||
if (arbitRec.newstate) {
|
if (arbitRec.newstate) {
|
||||||
jam();
|
jam();
|
||||||
CRASH_INSERTION((Uint32)910 + arbitRec.state);
|
CRASH_INSERTION((Uint32)910 + arbitRec.state);
|
||||||
|
|
||||||
arbitRec.setTimestamp();
|
arbitRec.setTimestamp();
|
||||||
arbitRec.code = 0;
|
arbitRec.code = 0;
|
||||||
arbitRec.newstate = false;
|
arbitRec.newstate = false;
|
||||||
}
|
}
|
||||||
#if 0
|
#ifdef ndb_arbit_crash_wait_for_event_report_to_get_out
|
||||||
if (! (arbitRec.getTimediff() > getArbitTimeout()))
|
if (! (arbitRec.getTimediff() > getArbitTimeout()))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user