Commit f99d9807 authored by pekka@mysql.com's avatar pekka@mysql.com

Merge pnousiainen@bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/space/pekka/ndb/version/my41
parents 6de458c2 c273fda5
...@@ -94,13 +94,14 @@ public: ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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,7 +3202,11 @@ Qmgr::handleArbitCheck(Signal* signal) ...@@ -3190,7 +3202,11 @@ 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::WinNodes:
jam();
case ArbitCode::WinGroups: case ArbitCode::WinGroups:
jam(); jam();
if (arbitRec.state == ARBIT_RUN) { if (arbitRec.state == ARBIT_RUN) {
...@@ -3200,9 +3216,6 @@ Qmgr::handleArbitCheck(Signal* signal) ...@@ -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) ...@@ -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) ...@@ -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
......
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