#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;
| Thread |
|---|
| • bzr commit into mysql-5.1 branch (jonas:2734) Bug#40697 | Jonas Oreland | 13 Nov |