4610 Frazer Clement 2011-10-20
Bug#13117187 NDB : BAD CONNECT_REP STATE ASSERTION
Initial patch to clean up existing code.
Reuse of nodePtr var for running and connecting node removed.
Running node in ZAPI_ states case branches turned into errors.
Further work required to handle case of connectedNode in ZPREPARE_FAIL
(Waiting for president to commit failure handling), and potentially other
connectedNode states.
modified:
storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
4609 Martin Skold 2011-10-20
Bug #11755904 47742: EXTRA-COLUMNS ON THE SLAVE DO NOT WORK WITH NDB AS EXPECTED: Added test rpl_ndb_not_null
added:
mysql-test/suite/rpl_ndb/r/rpl_ndb_not_null.result
mysql-test/suite/rpl_ndb/t/rpl_ndb_not_null.test
=== modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp 2011-10-17 13:54:09 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp 2011-10-20 12:35:16 +0000
@@ -470,31 +470,34 @@ void Qmgr::setCCDelay(UintR aCCDelay)
void Qmgr::execCONNECT_REP(Signal* signal)
{
jamEntry();
- const Uint32 nodeId = signal->theData[0];
+ const Uint32 connectedNodeId = signal->theData[0];
if (ERROR_INSERTED(931))
{
jam();
- ndbout_c("Discarding CONNECT_REP(%d)", nodeId);
- infoEvent("Discarding CONNECT_REP(%d)", nodeId);
+ ndbout_c("Discarding CONNECT_REP(%d)", connectedNodeId);
+ infoEvent("Discarding CONNECT_REP(%d)", connectedNodeId);
return;
}
- c_connectedNodes.set(nodeId);
+ c_connectedNodes.set(connectedNodeId);
- NodeRecPtr nodePtr;
- nodePtr.i = nodeId;
- ptrCheckGuard(nodePtr, MAX_NODES, nodeRec);
- nodePtr.p->m_secret = 0;
-
- nodePtr.i = getOwnNodeId();
- ptrCheckGuard(nodePtr, MAX_NODES, nodeRec);
- NodeInfo nodeInfo = getNodeInfo(nodeId);
- switch(nodePtr.p->phase){
+ {
+ NodeRecPtr connectedNodePtr;
+ connectedNodePtr.i = connectedNodeId;
+ ptrCheckGuard(connectedNodePtr, MAX_NODES, nodeRec);
+ connectedNodePtr.p->m_secret = 0;
+ }
+
+ NodeRecPtr myNodePtr;
+ myNodePtr.i = getOwnNodeId();
+ ptrCheckGuard(myNodePtr, MAX_NODES, nodeRec);
+ NodeInfo connectedNodeInfo = getNodeInfo(connectedNodeId);
+ switch(myNodePtr.p->phase){
case ZRUNNING:
- if (nodeInfo.getType() == NodeInfo::DB)
+ if (connectedNodeInfo.getType() == NodeInfo::DB)
{
- ndbrequire(!c_clusterNodes.get(nodeId));
+ ndbrequire(!c_clusterNodes.get(connectedNodeId));
}
case ZSTARTING:
jam();
@@ -504,16 +507,17 @@ void Qmgr::execCONNECT_REP(Signal* signa
jam();
return;
case ZAPI_ACTIVE:
+ ndbrequire(false);
case ZAPI_INACTIVE:
- return;
+ ndbrequire(false);
case ZINIT:
- ndbrequire(getNodeInfo(nodeId).m_type == NodeInfo::MGM);
+ ndbrequire(getNodeInfo(connectedNodeId).m_type == NodeInfo::MGM);
break;
default:
ndbrequire(false);
}
- if (nodeInfo.getType() != NodeInfo::DB)
+ if (connectedNodeInfo.getType() != NodeInfo::DB)
{
jam();
return;
@@ -522,24 +526,24 @@ void Qmgr::execCONNECT_REP(Signal* signa
switch(c_start.m_gsn){
case GSN_CM_REGREQ:
jam();
- sendCmRegReq(signal, nodeId);
+ sendCmRegReq(signal, connectedNodeId);
/**
* We're waiting for CM_REGCONF c_start.m_nodes contains all configured
* nodes
*/
- ndbrequire(nodePtr.p->phase == ZSTARTING);
- ndbrequire(c_start.m_nodes.isWaitingFor(nodeId));
+ ndbrequire(myNodePtr.p->phase == ZSTARTING);
+ ndbrequire(c_start.m_nodes.isWaitingFor(connectedNodeId));
return;
case GSN_CM_NODEINFOREQ:
jam();
- if (c_start.m_nodes.isWaitingFor(nodeId))
+ if (c_start.m_nodes.isWaitingFor(connectedNodeId))
{
jam();
ndbrequire(getOwnNodeId() != cpresident);
- ndbrequire(nodePtr.p->phase == ZSTARTING);
- sendCmNodeInfoReq(signal, nodeId, nodePtr.p);
+ ndbrequire(myNodePtr.p->phase == ZSTARTING);
+ sendCmNodeInfoReq(signal, connectedNodeId, myNodePtr.p);
return;
}
return;
@@ -547,17 +551,17 @@ void Qmgr::execCONNECT_REP(Signal* signa
jam();
ndbrequire(getOwnNodeId() != cpresident);
- ndbrequire(nodePtr.p->phase == ZRUNNING);
- if (c_start.m_nodes.isWaitingFor(nodeId))
+ ndbrequire(myNodePtr.p->phase == ZRUNNING);
+ if (c_start.m_nodes.isWaitingFor(connectedNodeId))
{
jam();
- c_start.m_nodes.clearWaitingFor(nodeId);
+ c_start.m_nodes.clearWaitingFor(connectedNodeId);
c_start.m_gsn = RNIL;
NodeRecPtr addNodePtr;
- addNodePtr.i = nodeId;
+ addNodePtr.i = connectedNodeId;
ptrCheckGuard(addNodePtr, MAX_NDB_NODES, nodeRec);
- cmAddPrepare(signal, addNodePtr, nodePtr.p);
+ cmAddPrepare(signal, addNodePtr, myNodePtr.p);
return;
}
}
@@ -565,11 +569,11 @@ void Qmgr::execCONNECT_REP(Signal* signa
(void)1;
}
- ndbrequire(!c_start.m_nodes.isWaitingFor(nodeId));
- ndbrequire(!c_readnodes_nodes.get(nodeId));
- c_readnodes_nodes.set(nodeId);
+ ndbrequire(!c_start.m_nodes.isWaitingFor(connectedNodeId));
+ ndbrequire(!c_readnodes_nodes.get(connectedNodeId));
+ c_readnodes_nodes.set(connectedNodeId);
signal->theData[0] = reference();
- sendSignal(calcQmgrBlockRef(nodeId), GSN_READ_NODESREQ, signal, 1, JBA);
+ sendSignal(calcQmgrBlockRef(connectedNodeId), GSN_READ_NODESREQ, signal, 1, JBA);
return;
}//Qmgr::execCONNECT_REP()
No bundle (reason: useless for push emails).
| Thread |
|---|
| • bzr push into mysql-5.1-telco-7.0 branch (frazer.clement:4609 to 4610)Bug#13117187 | Frazer Clement | 20 Oct |