From: Date: November 13 2008 2:16pm Subject: bzr commit into mysql-5.1 branch (jonas:2734) Bug#40697 List-Archive: http://lists.mysql.com/commits/58635 X-Bug: 40697 Message-Id: <20081113131606.AA994940292@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/jonas/src/telco-6.2/ 2734 Jonas Oreland 2008-11-13 ndb - bug#40697 - transaction can wait longer needed during node-failure-handling modified: storage/ndb/include/ndb_version.h.in storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp storage/ndb/src/mgmsrv/MgmtSrvr.cpp storage/ndb/src/ndbapi/Ndbif.cpp storage/ndb/src/ndbapi/TransporterFacade.cpp === modified file 'storage/ndb/include/ndb_version.h.in' --- a/storage/ndb/include/ndb_version.h.in 2008-05-16 13:08:36 +0000 +++ b/storage/ndb/include/ndb_version.h.in 2008-11-13 13:15:56 +0000 @@ -207,4 +207,28 @@ ndbd_LIST_TABLES_CONF_long_signal(Uint32 return x >= NDBD_LONG_LIST_TABLES_CONF_63; } +#define NDBD_API_TAKE_OVERTCCONF_60 NDB_MAKE_VERSION(5,2,4) +#define NDBD_API_TAKE_OVERTCCONF_62 NDB_MAKE_VERSION(6,2,17) +#define NDBD_API_TAKE_OVERTCCONF_63 NDB_MAKE_VERSION(6,3,19) + +static +inline +int +ndb_takeovertc(Uint32 x) +{ + if (x >= NDB_VERSION_D) + return 1; + + const Uint32 major = (x >> 16) & 0xFF; + const Uint32 minor = (x >> 8) & 0xFF; + + if (major >= 6) + { + if (minor == 2) + return x >= NDBD_API_TAKE_OVERTCCONF_62; + } + + return x >= NDBD_API_TAKE_OVERTCCONF_63; +} + #endif === modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-11-11 09:33:56 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-11-13 13:15:56 +0000 @@ -7354,6 +7354,9 @@ Dbtc::checkNodeFailComplete(Signal* sign nfRep->failedNodeId = hostptr.i; sendSignal(cdihblockref, GSN_NF_COMPLETEREP, signal, NFCompleteRep::SignalLength, JBB); + + sendSignal(QMGR_REF, GSN_NF_COMPLETEREP, signal, + NFCompleteRep::SignalLength, JBB); } CRASH_INSERTION(8058); === modified file 'storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp' --- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp 2008-08-11 10:41:11 +0000 +++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp 2008-11-13 13:15:56 +0000 @@ -243,6 +243,7 @@ private: void execDUMP_STATE_ORD(Signal* signal); void execCONNECT_REP(Signal* signal); void execNDB_FAILCONF(Signal* signal); + void execNF_COMPLETEREP(Signal*); void execREAD_CONFIG_REQ(Signal* signal); void execSTTOR(Signal* signal); void execCM_INFOCONF(Signal* signal); === modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp' --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp 2007-11-23 10:09:30 +0000 +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp 2008-11-13 13:15:56 +0000 @@ -100,6 +100,7 @@ Qmgr::Qmgr(Block_context& ctx) // Received signals addRecSignal(GSN_CONNECT_REP, &Qmgr::execCONNECT_REP); addRecSignal(GSN_NDB_FAILCONF, &Qmgr::execNDB_FAILCONF); + addRecSignal(GSN_NF_COMPLETEREP, &Qmgr::execNF_COMPLETEREP); addRecSignal(GSN_READ_CONFIG_REQ, &Qmgr::execREAD_CONFIG_REQ); addRecSignal(GSN_STTOR, &Qmgr::execSTTOR); addRecSignal(GSN_CLOSE_COMCONF, &Qmgr::execCLOSE_COMCONF); === modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp' --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp 2008-08-27 19:56:41 +0000 +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp 2008-11-13 13:15:56 +0000 @@ -2714,12 +2714,47 @@ void Qmgr::execNDB_FAILCONF(Signal* sign if (nodePtr.p->phase == ZAPI_ACTIVE){ jam(); sendSignal(nodePtr.p->blockRef, GSN_NF_COMPLETEREP, signal, - NFCompleteRep::SignalLength, JBA); + NFCompleteRep::SignalLength, JBB); }//if }//for return; }//Qmgr::execNDB_FAILCONF() +void +Qmgr::execNF_COMPLETEREP(Signal* signal) +{ + jamEntry(); + NFCompleteRep rep = *(NFCompleteRep*)signal->getDataPtr(); + if (rep.blockNo != DBTC) + { + jam(); + ndbassert(false); + return; + } + + /** + * This is a disgrace...but execNF_COMPLETEREP in ndbapi is a mess + * actually equally messy as it is in ndbd... + * this is therefore a simple way of having ndbapi to get + * earlier information that transactions can be aborted + */ + signal->theData[0] = rep.failedNodeId; + NodeRecPtr nodePtr; + for (nodePtr.i = 1; nodePtr.i < MAX_NODES; nodePtr.i++) + { + jam(); + ptrAss(nodePtr, nodeRec); + if (nodePtr.p->phase == ZAPI_ACTIVE && + ndb_takeovertc(getNodeInfo(nodePtr.i).m_version)) + { + jam(); + sendSignal(nodePtr.p->blockRef, GSN_TAKE_OVERTCCONF, signal, + NFCompleteRep::SignalLength, JBB); + }//if + }//for + return; +} + /*******************************/ /* DISCONNECT_REP */ /*******************************/ === modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp' --- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2008-09-02 09:27:09 +0000 +++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp 2008-11-13 13:15:56 +0000 @@ -855,6 +855,8 @@ MgmtSrvr::sendVersionReq(int v_nodeId, do_send = 1; // retry with other node continue; } + case GSN_TAKE_OVERTCCONF: + continue; default: report_unknown_signal(signal); return SEND_OR_RECEIVE_FAILED; @@ -1169,6 +1171,8 @@ int MgmtSrvr::sendSTOP_REQ(const Vector< stoppedNodes.bitOR(mask); break; } + case GSN_TAKE_OVERTCCONF: + continue; default: report_unknown_signal(signal); #ifdef VM_TRACE @@ -1729,6 +1733,8 @@ MgmtSrvr::setEventReportingLevelImpl(int nodes.clear(rep->failedNodeId); break; } + case GSN_TAKE_OVERTCCONF: + continue; default: report_unknown_signal(signal); return SEND_OR_RECEIVE_FAILED; @@ -2014,6 +2020,9 @@ MgmtSrvr::handleReceivedSignal(NdbApiSig ndbout << "TAMPER ORD" << endl; break; + case GSN_TAKE_OVERTCCONF: + break; + default: g_eventLogger->error("Unknown signal received. SignalNumber: " "%i from (%d, %x)", @@ -2208,6 +2217,8 @@ MgmtSrvr::alloc_node_id_req(NodeId free_ // ignore NF_COMPLETEREP will come continue; } + case GSN_TAKE_OVERTCCONF: + continue; default: report_unknown_signal(signal); return SEND_OR_RECEIVE_FAILED; @@ -2721,6 +2732,8 @@ MgmtSrvr::startBackup(Uint32& backupId, // master node will report aborted backup break; } + case GSN_TAKE_OVERTCCONF: + continue; default: report_unknown_signal(signal); return SEND_OR_RECEIVE_FAILED; === modified file 'storage/ndb/src/ndbapi/Ndbif.cpp' --- a/storage/ndb/src/ndbapi/Ndbif.cpp 2008-10-24 11:00:37 +0000 +++ b/storage/ndb/src/ndbapi/Ndbif.cpp 2008-11-13 13:15:56 +0000 @@ -905,6 +905,9 @@ Ndb::handleReceivedSignal(NdbApiSignal* goto InvalidSignal; return; } + case GSN_TAKE_OVERTCCONF: + abortTransactionsAfterNodeFailure(tFirstData); // theData[0] + break; default: goto InvalidSignal; }//swich === modified file 'storage/ndb/src/ndbapi/TransporterFacade.cpp' --- a/storage/ndb/src/ndbapi/TransporterFacade.cpp 2008-08-12 09:40:26 +0000 +++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp 2008-11-13 13:15:56 +0000 @@ -362,6 +362,16 @@ execute(void * callbackObj, SignalHeader } break; } + case GSN_TAKE_OVERTCCONF: + { + /** + * Report + */ + NdbApiSignal tSignal(* header); + tSignal.setDataPtr(theData); + theFacade->for_each(&tSignal, ptr); + return; + } default: break;