Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-01-04 09:17:14+01:00, jonas@stripped +5 -0
ndb - bug#25329
better handling of restarting node wrt to SUB_START_REQ
(mysql-5.1-wl2325-5.0 commit)
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp@stripped, 2007-01-04 09:17:12+01:00,
jonas@stripped +10 -0
events -
Pass error code when needed
Make sure correct conf signals are sent even when receiving intermidiate ref's
storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp@stripped, 2007-01-04 09:17:12+01:00,
jonas@stripped +5 -0
events -
Pass error code when needed
Make sure correct conf signals are sent even when receiving intermidiate ref's
storage/ndb/src/kernel/blocks/suma/Suma.cpp@stripped, 2007-01-04 09:17:12+01:00,
jonas@stripped +110 -24
- Fix better start_mereq handling
- Add some error inserts
- Add ugly "delay" handling of SUB_START_REQ to handle problems...
storage/ndb/src/kernel/blocks/suma/Suma.hpp@stripped, 2007-01-04 09:17:12+01:00,
jonas@stripped +1 -1
- Fix better start_mereq handling
- Add some error inserts
- Add ugly "delay" handling of SUB_START_REQ to handle problems...
storage/ndb/src/kernel/blocks/suma/SumaInit.cpp@stripped, 2007-01-04 09:17:12+01:00,
jonas@stripped +2 -0
- Fix better start_mereq handling
- Add some error inserts
- Add ugly "delay" handling of SUB_START_REQ to handle problems...
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: jonas
# Host: perch.ndb.mysql.com
# Root: /home/jonas/src/mysql-5.1-wl2325-5.0
--- 1.62/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2007-01-04 09:17:18 +01:00
+++ 1.63/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp 2007-01-04 09:17:18 +01:00
@@ -8863,6 +8863,7 @@
SubStartRef* ref = (SubStartRef*) signal->getDataPtrSend();
ref->senderRef = reference();
ref->senderData = subbPtr.p->m_senderData;
+ ref->errorCode = err;
sendSignal(subbPtr.p->m_senderRef, GSN_SUB_START_REF,
signal, SubStartRef::SignalLength2, JBB);
c_opSubEvent.release(subbPtr);
@@ -8925,6 +8926,7 @@
#ifdef EVENT_PH3_DEBUG
ndbout_c("DBDICT(Coordinator) got GSN_SUB_START_CONF = (%d)", subbPtr.i);
#endif
+ subbPtr.p->m_sub_start_conf = *conf;
subbPtr.p->m_reqTracker.reportConf(c_counterMgr, refToNode(senderRef));
completeSubStartReq(signal,subbPtr.i,0);
}
@@ -8961,6 +8963,9 @@
#ifdef EVENT_DEBUG
ndbout_c("SUB_START_CONF");
#endif
+
+ SubStartConf* conf = (SubStartConf*)signal->getDataPtrSend();
+ * conf = subbPtr.p->m_sub_start_conf;
sendSignal(subbPtr.p->m_senderRef, GSN_SUB_START_CONF,
signal, SubStartConf::SignalLength, JBB);
c_opSubEvent.release(subbPtr);
@@ -9065,6 +9070,7 @@
SubStopRef* ref = (SubStopRef*) signal->getDataPtrSend();
ref->senderRef = reference();
ref->senderData = subbPtr.p->m_senderData;
+ ref->errorCode = err;
sendSignal(subbPtr.p->m_senderRef, GSN_SUB_STOP_REF,
signal, SubStopRef::SignalLength, JBB);
c_opSubEvent.release(subbPtr);
@@ -9117,6 +9123,7 @@
* Coordinator
*/
ndbrequire(refToBlock(senderRef) == DBDICT);
+ subbPtr.p->m_sub_stop_conf = *conf;
subbPtr.p->m_reqTracker.reportConf(c_counterMgr, refToNode(senderRef));
completeSubStopReq(signal,subbPtr.i,0);
}
@@ -9157,6 +9164,8 @@
#ifdef EVENT_DEBUG
ndbout_c("SUB_STOP_CONF");
#endif
+ SubStopConf* conf = (SubStopConf*)signal->getDataPtrSend();
+ * conf = subbPtr.p->m_sub_stop_conf;
sendSignal(subbPtr.p->m_senderRef, GSN_SUB_STOP_CONF,
signal, SubStopConf::SignalLength, JBB);
c_opSubEvent.release(subbPtr);
@@ -9386,6 +9395,7 @@
SubRemoveRef* ref = (SubRemoveRef*) signal->getDataPtrSend();
ref->senderRef = reference();
ref->senderData = subbPtr.p->m_senderData;
+ ref->errorCode = err;
sendSignal(subbPtr.p->m_senderRef, GSN_SUB_REMOVE_REF,
signal, SubRemoveRef::SignalLength, JBB);
}
--- 1.23/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2007-01-04 09:17:18 +01:00
+++ 1.24/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp 2007-01-04 09:17:18 +01:00
@@ -50,6 +50,7 @@
#include <signaldata/CreateTrig.hpp>
#include <signaldata/DropTrig.hpp>
#include <signaldata/AlterTrig.hpp>
+#include <signaldata/SumaImpl.hpp>
#include "SchemaFile.hpp"
#include <blocks/mutexes.hpp>
#include <SafeCounter.hpp>
@@ -1367,6 +1368,10 @@
Uint32 m_senderRef;
Uint32 m_senderData;
Uint32 m_errorCode;
+ union {
+ SubStartConf m_sub_start_conf;
+ SubStopConf m_sub_stop_conf;
+ };
RequestTracker m_reqTracker;
};
typedef Ptr<OpSubEvent> OpSubEventPtr;
--- 1.31/storage/ndb/src/kernel/blocks/suma/Suma.cpp 2007-01-04 09:17:18 +01:00
+++ 1.32/storage/ndb/src/kernel/blocks/suma/Suma.cpp 2007-01-04 09:17:18 +01:00
@@ -226,7 +226,6 @@
c_startup.m_wait_handover= false;
c_failedApiNodes.clear();
- c_startup.m_restart_server_node_id = 0; // Server for my NR
ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
conf->senderRef = reference();
@@ -257,6 +256,14 @@
if(startphase == 5)
{
+ if (ERROR_INSERTED(13029)) /* Hold startphase 5 */
+ {
+ sendSignalWithDelay(SUMA_REF, GSN_STTOR, signal,
+ 30, signal->getLength());
+ DBUG_VOID_RETURN;
+ }
+
+ c_startup.m_restart_server_node_id = 0;
getNodeGroupMembers(signal);
if (typeOfStart == NodeState::ST_NODE_RESTART ||
typeOfStart == NodeState::ST_INITIAL_NODE_RESTART)
@@ -369,6 +376,8 @@
infoEvent("Suma: node %d refused %d",
c_startup.m_restart_server_node_id, ref->errorCode);
+
+ c_startup.m_restart_server_node_id++;
send_start_me_req(signal);
}
@@ -868,6 +877,22 @@
ptr->m_buffer_head.m_page_id);
}
}
+
+ if (tCase == 8006)
+ {
+ SET_ERROR_INSERT_VALUE(13029);
+ }
+
+ if (tCase == 8007)
+ {
+ c_startup.m_restart_server_node_id = MAX_NDB_NODES + 1;
+ SET_ERROR_INSERT_VALUE(13029);
+ }
+
+ if (tCase == 8008)
+ {
+ CLEAR_ERROR_INSERT_VALUE;
+ }
}
/*************************************************************
@@ -1069,14 +1094,14 @@
}
} else {
if (c_startup.m_restart_server_node_id &&
- refToNode(subRef) != c_startup.m_restart_server_node_id)
+ subRef != calcSumaBlockRef(c_startup.m_restart_server_node_id))
{
/**
* only allow "restart_server" Suma's to come through
* for restart purposes
*/
jam();
- sendSubStartRef(signal, 1405);
+ sendSubCreateRef(signal, 1415);
DBUG_VOID_RETURN;
}
// Check that id/key is unique
@@ -2155,47 +2180,105 @@
key.m_subscriptionId = req->subscriptionId;
key.m_subscriptionKey = req->subscriptionKey;
+ Uint32 ref = signal->getSendersBlockRef();
+ bool delayed = (ref == reference());
+ if (delayed)
+ {
+ jam();
+ ref = signal->theData[signal->getLength() - 1];
+ }
if (c_startup.m_restart_server_node_id &&
- refToNode(senderRef) != c_startup.m_restart_server_node_id)
+ senderRef != calcSumaBlockRef(c_startup.m_restart_server_node_id))
{
/**
* only allow "restart_server" Suma's to come through
* for restart purposes
*/
jam();
- sendSubStartRef(signal, 1405);
+
+ if (c_startup.m_restart_server_node_id == RNIL)
+ {
+ jam();
+ sendSubStartRef(signal, ref, SubStartRef::NF_FakeErrorREF);
+ return;
+ }
+
+ /**
+ * Delay it...
+ */
+ ndbout_c("delay");
+ if (delayed)
+ {
+ jam();
+ sendSignalWithDelay(SUMA_REF, GSN_SUB_START_REQ, signal, 100,
+ signal->getLength());
+ }
+ else
+ {
+ jam();
+ signal->theData[signal->getLength()] = ref;
+ sendSignalWithDelay(SUMA_REF, GSN_SUB_START_REQ, signal, 100,
+ signal->getLength() + 1);
+ }
+
DBUG_VOID_RETURN;
}
SubscriptionPtr subPtr;
if(!c_subscriptions.find(subPtr, key)){
jam();
- sendSubStartRef(signal, 1407);
+ sendSubStartRef(signal, ref, 1407);
DBUG_VOID_RETURN;
}
if (subPtr.p->m_state == Subscription::LOCKED) {
jam();
DBUG_PRINT("info",("Locked"));
- sendSubStartRef(signal, 1411);
+ sendSubStartRef(signal, ref, 1411);
DBUG_VOID_RETURN;
}
- if (subPtr.p->m_state == Subscription::DROPPED &&
- c_startup.m_restart_server_node_id == 0) {
+ if (subPtr.p->m_state == Subscription::DROPPED) {
jam();
DBUG_PRINT("info",("Dropped"));
- sendSubStartRef(signal, 1418);
+ sendSubStartRef(signal, ref, 1418);
DBUG_VOID_RETURN;
}
- ndbrequire(subPtr.p->m_state == Subscription::DEFINED ||
- c_startup.m_restart_server_node_id);
+ ndbrequire(subPtr.p->m_state == Subscription::DEFINED);
+ if (delayed)
+ {
+ jam();
+ /**
+ * Check if it's already there...
+ */
+ TablePtr tabPtr;
+ if (c_tables.find(tabPtr, subPtr.p->m_tableId))
+ {
+ jam();
+ SubscriberPtr tmp;
+ LocalDLList<Subscriber> list(c_subscriberPool, tabPtr.p->c_subscribers);
+ for (list.first(tmp); !tmp.isNull(); list.next(tmp))
+ {
+ if (tmp.p->m_senderRef == subscriberRef &&
+ tmp.p->m_senderData == subscriberData)
+ {
+ jam();
+ /**
+ * This is ugly but will work short term...
+ */
+ sendSubStartRef(signal, ref, SubStartRef::NF_FakeErrorREF);
+ return;
+ }
+ }
+ }
+ }
+
SubscriberPtr subbPtr;
if(!c_subscriberPool.seize(subbPtr)){
jam();
- sendSubStartRef(signal, 1412);
+ sendSubStartRef(signal, ref, 1412);
DBUG_VOID_RETURN;
}
DBUG_PRINT("info",("c_subscriberPool size: %d free: %d",
@@ -2286,14 +2369,14 @@
}
void
-Suma::sendSubStartRef(Signal* signal, Uint32 errCode)
+Suma::sendSubStartRef(Signal* signal, Uint32 dstref, Uint32 errCode)
{
jam();
SubStartRef * ref = (SubStartRef *)signal->getDataPtrSend();
ref->senderRef = reference();
ref->errorCode = errCode;
releaseSections(signal);
- sendSignal(signal->getSendersBlockRef(), GSN_SUB_START_REF, signal,
+ sendSignal(dstref, GSN_SUB_START_REF, signal,
SubStartRef::SignalLength, JBB);
}
void
@@ -2372,25 +2455,28 @@
DBUG_VOID_RETURN;
}
- if(!c_subscriptions.find(subPtr, key)){
- jam();
- DBUG_PRINT("error", ("not found"));
- sendSubStopRef(signal, 1407);
- DBUG_VOID_RETURN;
- }
-
if (c_startup.m_restart_server_node_id &&
- refToNode(senderRef) != c_startup.m_restart_server_node_id)
+ senderRef != calcSumaBlockRef(c_startup.m_restart_server_node_id))
{
/**
* only allow "restart_server" Suma's to come through
* for restart purposes
*/
jam();
- sendSubStopRef(signal, 1405);
+ Uint32 err = c_startup.m_restart_server_node_id != RNIL ? 1405 :
+ SubStopRef::NF_FakeErrorREF;
+
+ sendSubStopRef(signal, err);
DBUG_VOID_RETURN;
}
+ if(!c_subscriptions.find(subPtr, key)){
+ jam();
+ DBUG_PRINT("error", ("not found"));
+ sendSubStopRef(signal, 1407);
+ DBUG_VOID_RETURN;
+ }
+
if (subPtr.p->m_state == Subscription::LOCKED) {
jam();
DBUG_PRINT("error", ("locked"));
--- 1.8/storage/ndb/src/kernel/blocks/suma/Suma.hpp 2007-01-04 09:17:18 +01:00
+++ 1.9/storage/ndb/src/kernel/blocks/suma/Suma.hpp 2007-01-04 09:17:18 +01:00
@@ -355,7 +355,7 @@
void sendSubIdRef(Signal* signal,Uint32 senderRef,Uint32 senderData,Uint32 errorCode);
void sendSubCreateRef(Signal* signal, Uint32 errorCode);
void sendSubStartRef(Signal*, SubscriberPtr, Uint32 errorCode, SubscriptionData::Part);
- void sendSubStartRef(Signal* signal, Uint32 errorCode);
+ void sendSubStartRef(Signal* signal, Uint32 ref, Uint32 errorCode);
void sendSubStopRef(Signal* signal, Uint32 errorCode);
void sendSubSyncRef(Signal* signal, Uint32 errorCode);
void sendSubRemoveRef(Signal* signal, const SubRemoveReq& ref,
--- 1.10/storage/ndb/src/kernel/blocks/suma/SumaInit.cpp 2007-01-04 09:17:18 +01:00
+++ 1.11/storage/ndb/src/kernel/blocks/suma/SumaInit.cpp 2007-01-04 09:17:18 +01:00
@@ -121,6 +121,8 @@
addRecSignal(GSN_SUB_GCP_COMPLETE_REP,
&Suma::execSUB_GCP_COMPLETE_REP);
+
+ c_startup.m_restart_server_node_id = RNIL; // Server for my NR
}
Suma::~Suma()
| Thread |
|---|
| • bk commit into 5.1 tree (jonas:1.2079) BUG#25329 | jonas | 4 Jan |