From: Frazer Clement Date: October 20 2011 12:39pm Subject: bzr push into mysql-5.1-telco-7.0 branch (frazer.clement:4609 to 4610) Bug#13117187 List-Archive: http://lists.mysql.com/commits/141517 X-Bug: 13117187 Message-Id: <201110201239.p9KCddLF004868@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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).