#At file:///home/jonas/src/telco-6.4/ based on revid:jonas@stripped
2907 Jonas Oreland 2009-04-16
ndb - bug#44291
Node-state is not propageded to all blocks in ndbmtd
This can cause
- inconsistent REDO when doing graceful shutdown
- crash in Dbtux, when restarting cluster, and some nodes
needs to perform node-recovery during system-restart
Possibly other problems...but they have not been identified
M storage/ndb/include/kernel/signaldata/NodeStateSignalData.hpp
M storage/ndb/src/kernel/blocks/LocalProxy.cpp
M storage/ndb/src/kernel/blocks/LocalProxy.hpp
=== modified file 'storage/ndb/include/kernel/signaldata/NodeStateSignalData.hpp'
--- a/storage/ndb/include/kernel/signaldata/NodeStateSignalData.hpp 2007-12-04 10:13:37 +0000
+++ b/storage/ndb/include/kernel/signaldata/NodeStateSignalData.hpp 2009-04-16 08:52:27 +0000
@@ -82,6 +82,7 @@ class ChangeNodeStateConf {
* Reciver
*/
friend class NdbCntr;
+ friend class LocalProxy;
public:
STATIC_CONST( SignalLength = 1 );
=== modified file 'storage/ndb/src/kernel/blocks/LocalProxy.cpp'
--- a/storage/ndb/src/kernel/blocks/LocalProxy.cpp 2009-03-16 17:05:07 +0000
+++ b/storage/ndb/src/kernel/blocks/LocalProxy.cpp 2009-04-16 08:52:27 +0000
@@ -58,6 +58,13 @@ LocalProxy::LocalProxy(BlockNumber block
addRecSignal(GSN_INCL_NODEREQ, &LocalProxy::execINCL_NODEREQ);
addRecSignal(GSN_INCL_NODECONF, &LocalProxy::execINCL_NODECONF);
+ // GSN_NODE_STATE_REP
+ addRecSignal(GSN_NODE_STATE_REP, &LocalProxy::execNODE_STATE_REP, true);
+
+ // GSN_CHANGE_NODE_STATE_REQ
+ addRecSignal(GSN_CHANGE_NODE_STATE_REQ, &LocalProxy::execCHANGE_NODE_STATE_REQ, true);
+ addRecSignal(GSN_CHANGE_NODE_STATE_CONF, &LocalProxy::execCHANGE_NODE_STATE_CONF);
+
// GSN_DUMP_STATE_ORD
addRecSignal(GSN_DUMP_STATE_ORD, &LocalProxy::execDUMP_STATE_ORD);
@@ -666,6 +673,78 @@ LocalProxy::sendINCL_NODECONF(Signal* si
ssRelease<Ss_INCL_NODEREQ>(ssId);
}
+// GSN_NODE_STATE_REP
+
+void
+LocalProxy::execNODE_STATE_REP(Signal* signal)
+{
+ Ss_NODE_STATE_REP& ss = ssSeize<Ss_NODE_STATE_REP>();
+ sendREQ(signal, ss);
+ SimulatedBlock::execNODE_STATE_REP(signal);
+ ssRelease<Ss_NODE_STATE_REP>(ss);
+}
+
+void
+LocalProxy::sendNODE_STATE_REP(Signal* signal, Uint32 ssId)
+{
+ Ss_NODE_STATE_REP& ss = ssFind<Ss_NODE_STATE_REP>(ssId);
+
+ sendSignal(workerRef(ss.m_worker), GSN_NODE_STATE_REP,
+ signal,NodeStateRep::SignalLength, JBB);
+}
+
+// GSN_CHANGE_NODE_STATE_REQ
+
+void
+LocalProxy::execCHANGE_NODE_STATE_REQ(Signal* signal)
+{
+ Ss_CHANGE_NODE_STATE_REQ& ss = ssSeize<Ss_CHANGE_NODE_STATE_REQ>(1);
+
+ ChangeNodeStateReq * req = (ChangeNodeStateReq*)signal->getDataPtrSend();
+ ss.m_req = *req;
+
+ sendREQ(signal, ss);
+}
+
+void
+LocalProxy::sendCHANGE_NODE_STATE_REQ(Signal* signal, Uint32 ssId)
+{
+ Ss_CHANGE_NODE_STATE_REQ& ss = ssFind<Ss_CHANGE_NODE_STATE_REQ>(ssId);
+
+ ChangeNodeStateReq * req = (ChangeNodeStateReq*)signal->getDataPtrSend();
+ req->senderRef = reference();
+
+ sendSignal(workerRef(ss.m_worker), GSN_CHANGE_NODE_STATE_REQ,
+ signal, ChangeNodeStateReq::SignalLength, JBB);
+}
+
+void
+LocalProxy::execCHANGE_NODE_STATE_CONF(Signal* signal)
+{
+ Ss_CHANGE_NODE_STATE_REQ& ss = ssFind<Ss_CHANGE_NODE_STATE_REQ>(1);
+
+ ChangeNodeStateConf * conf = (ChangeNodeStateConf*)signal->getDataPtrSend();
+ ndbrequire(conf->senderData == ss.m_req.senderData);
+ recvCONF(signal, ss);
+}
+
+void
+LocalProxy::sendCHANGE_NODE_STATE_CONF(Signal* signal, Uint32 ssId)
+{
+ Ss_CHANGE_NODE_STATE_REQ& ss = ssFind<Ss_CHANGE_NODE_STATE_REQ>(ssId);
+
+ if (!lastReply(ss))
+ return;
+
+ /**
+ * SimulatedBlock::execCHANGE_NODE_STATE_REQ will reply
+ */
+ ChangeNodeStateReq * req = (ChangeNodeStateReq*)signal->getDataPtrSend();
+ * req = ss.m_req;
+ SimulatedBlock::execCHANGE_NODE_STATE_REQ(signal);
+ ssRelease<Ss_CHANGE_NODE_STATE_REQ>(ssId);
+}
+
// GSN_DUMP_STATE_ORD
void
=== modified file 'storage/ndb/src/kernel/blocks/LocalProxy.hpp'
--- a/storage/ndb/src/kernel/blocks/LocalProxy.hpp 2009-03-16 17:05:07 +0000
+++ b/storage/ndb/src/kernel/blocks/LocalProxy.hpp 2009-04-16 08:52:27 +0000
@@ -24,6 +24,7 @@
#include <signaldata/NdbSttor.hpp>
#include <signaldata/ReadNodesConf.hpp>
#include <signaldata/NodeFailRep.hpp>
+#include <signaldata/NodeStateSignalData.hpp>
#include <signaldata/NFCompleteRep.hpp>
#include <signaldata/CreateTrigImpl.hpp>
#include <signaldata/DropTrigImpl.hpp>
@@ -434,6 +435,39 @@ protected:
void execINCL_NODECONF(Signal*);
void sendINCL_NODECONF(Signal*, Uint32 ssId);
+ // GSN_NODE_STATE_REP
+ struct Ss_NODE_STATE_REP : SsParallel {
+ Ss_NODE_STATE_REP() {
+ m_sendREQ = &LocalProxy::sendNODE_STATE_REP;
+ m_sendCONF = 0;
+ }
+ enum { poolSize = 1 };
+ static SsPool<Ss_NODE_STATE_REP>& pool(LocalProxy* proxy) {
+ return proxy->c_ss_NODE_STATE_REP;
+ }
+ };
+ SsPool<Ss_NODE_STATE_REP> c_ss_NODE_STATE_REP;
+ void execNODE_STATE_REP(Signal*);
+ void sendNODE_STATE_REP(Signal*, Uint32 ssId);
+
+ // GSN_CHANGE_NODE_STATE_REQ
+ struct Ss_CHANGE_NODE_STATE_REQ : SsParallel {
+ ChangeNodeStateReq m_req;
+ Ss_CHANGE_NODE_STATE_REQ() {
+ m_sendREQ = &LocalProxy::sendCHANGE_NODE_STATE_REQ;
+ m_sendCONF = &LocalProxy::sendCHANGE_NODE_STATE_CONF;
+ }
+ enum { poolSize = 1 };
+ static SsPool<Ss_CHANGE_NODE_STATE_REQ>& pool(LocalProxy* proxy) {
+ return proxy->c_ss_CHANGE_NODE_STATE_REQ;
+ }
+ };
+ SsPool<Ss_CHANGE_NODE_STATE_REQ> c_ss_CHANGE_NODE_STATE_REQ;
+ void execCHANGE_NODE_STATE_REQ(Signal*);
+ void sendCHANGE_NODE_STATE_REQ(Signal*, Uint32 ssId);
+ void execCHANGE_NODE_STATE_CONF(Signal*);
+ void sendCHANGE_NODE_STATE_CONF(Signal*, Uint32 ssId);
+
// GSN_DUMP_STATE_ORD
struct Ss_DUMP_STATE_ORD : SsParallel {
Uint32 m_reqlength;
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20090416085227-bua6o7t3id2j5aiw.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-7.0 branch (jonas:2907) Bug#44291 | Jonas Oreland | 16 Apr |