summaryrefslogtreecommitdiff
path: root/storage/ndb
diff options
context:
space:
mode:
authorunknown <jonas@perch.ndb.mysql.com>2006-12-01 14:06:15 +0100
committerunknown <jonas@perch.ndb.mysql.com>2006-12-01 14:06:15 +0100
commit10a497a623f9b5b7176e9edad8b077597471e284 (patch)
tree0511f02a52c41e90cbfbfbc6235d99209b09c403 /storage/ndb
parent2b1df53702f63789b9ddd5e51b4a392ae9ecfd5e (diff)
parent3a7bb77df5593f69aca1e1893d3afc73207dcffe (diff)
downloadmariadb-git-10a497a623f9b5b7176e9edad8b077597471e284.tar.gz
Merge perch.ndb.mysql.com:/home/jonas/src/51-work
into perch.ndb.mysql.com:/home/jonas/src/mysql-5.1-new-ndb storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp: Auto merged
Diffstat (limited to 'storage/ndb')
-rw-r--r--storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp24
-rw-r--r--storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp8
-rw-r--r--storage/ndb/src/kernel/vm/KeyTable2.hpp72
3 files changed, 99 insertions, 5 deletions
diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
index 8d0c427d488..2098c196f2b 100644
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
@@ -3624,7 +3624,11 @@ void Dbdict::execNODE_FAILREP(Signal* signal)
case BS_IDLE:
jam();
ok = true;
- if(c_opRecordPool.getSize() != c_opRecordPool.getNoOfFree()){
+ if(c_opRecordPool.getSize() !=
+ (c_opRecordPool.getNoOfFree() +
+ c_opSubEvent.get_count() + c_opCreateEvent.get_count() +
+ c_opDropEvent.get_count() + c_opSignalUtil.get_count()))
+ {
jam();
c_blockState = BS_NODE_FAILURE;
}
@@ -9846,6 +9850,8 @@ Dbdict::createEvent_RT_DICT_AFTER_GET(Signal* signal, OpCreateEventPtr evntRecPt
// Seize a Create Event record, the Coordinator will now have two seized
// but that's ok, it's like a recursion
+ CRASH_INSERTION2(6009, getOwnNodeId() != c_masterNodeId);
+
SubCreateReq * sumaReq = (SubCreateReq *)signal->getDataPtrSend();
sumaReq->senderRef = reference(); // reference to DICT
@@ -10104,6 +10110,8 @@ busy:
* Participant
*/
ndbrequire(refToBlock(origSenderRef) == DBDICT);
+
+ CRASH_INSERTION(6007);
{
SubStartReq* req = (SubStartReq*) signal->getDataPtrSend();
@@ -10334,6 +10342,9 @@ busy:
ndbout_c("SUB_STOP_REQ 2");
#endif
ndbrequire(refToBlock(origSenderRef) == DBDICT);
+
+ CRASH_INSERTION(6008);
+
{
SubStopReq* req = (SubStopReq*) signal->getDataPtrSend();
@@ -10659,6 +10670,8 @@ Dbdict::execSUB_REMOVE_REQ(Signal* signal)
subbPtr.p->m_errorCode = 0;
}
+ CRASH_INSERTION2(6010, getOwnNodeId() != c_masterNodeId);
+
SubRemoveReq* req = (SubRemoveReq*) signal->getDataPtrSend();
req->senderRef = reference();
req->senderData = subbPtr.i;
@@ -13738,6 +13751,15 @@ Dbdict::checkDictLockQueue(Signal* signal, bool poll)
break;
}
+ if (c_blockState != BS_IDLE)
+ {
+ /**
+ * If state is BS_NODE_FAILURE, it might be that no op is running
+ */
+ jam();
+ break;
+ }
+
ndbrequire(c_blockState == BS_IDLE);
lockPtr.p->locked = true;
c_blockState = lockPtr.p->lt->blockState;
diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
index 046518aeddc..718d53d8b96 100644
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
@@ -2041,10 +2041,10 @@ private:
KeyTable2<OpDropIndex, OpRecordUnion> c_opDropIndex;
KeyTable2<OpAlterIndex, OpRecordUnion> c_opAlterIndex;
KeyTable2<OpBuildIndex, OpRecordUnion> c_opBuildIndex;
- KeyTable2<OpCreateEvent, OpRecordUnion> c_opCreateEvent;
- KeyTable2<OpSubEvent, OpRecordUnion> c_opSubEvent;
- KeyTable2<OpDropEvent, OpRecordUnion> c_opDropEvent;
- KeyTable2<OpSignalUtil, OpRecordUnion> c_opSignalUtil;
+ KeyTable2C<OpCreateEvent, OpRecordUnion> c_opCreateEvent;
+ KeyTable2C<OpSubEvent, OpRecordUnion> c_opSubEvent;
+ KeyTable2C<OpDropEvent, OpRecordUnion> c_opDropEvent;
+ KeyTable2C<OpSignalUtil, OpRecordUnion> c_opSignalUtil;
KeyTable2<OpCreateTrigger, OpRecordUnion> c_opCreateTrigger;
KeyTable2<OpDropTrigger, OpRecordUnion> c_opDropTrigger;
KeyTable2<OpAlterTrigger, OpRecordUnion> c_opAlterTrigger;
diff --git a/storage/ndb/src/kernel/vm/KeyTable2.hpp b/storage/ndb/src/kernel/vm/KeyTable2.hpp
index 5c2b3096abe..22b2c16f540 100644
--- a/storage/ndb/src/kernel/vm/KeyTable2.hpp
+++ b/storage/ndb/src/kernel/vm/KeyTable2.hpp
@@ -40,4 +40,76 @@ public:
}
};
+template <class T, class U>
+class KeyTable2C : public KeyTable2<T, U> {
+ Uint32 m_count;
+public:
+ KeyTable2C(ArrayPool<U>& pool) :
+ KeyTable2<T, U>(pool), m_count(0) {
+ }
+
+ Uint32 get_count() const { return m_count; }
+
+ bool seize(Ptr<T> & ptr) {
+ if (KeyTable2<T, U>::seize(ptr))
+ {
+ m_count ++;
+ return true;
+ }
+ return false;
+ }
+
+ void add(Ptr<T> & ptr) {
+ KeyTable2<T, U>::add(ptr);
+ m_count ++;
+ }
+
+ void remove(Ptr<T> & ptr, const T & key) {
+ KeyTable2<T, U>::remove(ptr, key);
+ if (ptr.i != RNIL)
+ {
+ assert(m_count);
+ m_count --;
+ }
+ }
+
+ void remove(Uint32 i) {
+ KeyTable2<T, U>::remove(i);
+ assert(m_count);
+ m_count --;
+ }
+
+ void remove(Ptr<T> & ptr) {
+ KeyTable2<T, U>::remove(ptr);
+ assert(m_count);
+ m_count --;
+ }
+
+ void removeAll() {
+ KeyTable2<T, U>::removeAll();
+ m_count = 0;
+ }
+
+ void release(Ptr<T> & ptr, const T & key) {
+ KeyTable2<T, U>::release(ptr, key);
+ if (ptr.i != RNIL)
+ {
+ assert(m_count);
+ m_count --;
+ }
+ }
+
+ void release(Uint32 i) {
+ KeyTable2<T, U>::release(i);
+ assert(m_count);
+ m_count --;
+ }
+
+ void release(Ptr<T> & ptr) {
+ KeyTable2<T, U>::release(ptr);
+ assert(m_count);
+ m_count --;
+ }
+};
+
#endif