Commit 6b38100d authored by unknown's avatar unknown

bug#8786 - ndb autodiscover, sometimes fails

  remove dict forwarding
  add api retries on NotMaster
  


ndb/include/kernel/signaldata/AlterIndx.hpp:
  Add NotMaster error code
ndb/include/kernel/signaldata/BuildIndx.hpp:
  Add NotMaster error code
ndb/include/kernel/signaldata/CreateIndx.hpp:
  Add NotMaster error code
ndb/include/kernel/signaldata/CreateTrig.hpp:
  Add NotMaster error code
ndb/include/kernel/signaldata/DropIndx.hpp:
  Add NotMaster error code
ndb/src/kernel/blocks/dbdict/Dbdict.cpp:
  Never forward requests,
    instead REF to API who will retry towards correct node
ndb/src/ndbapi/NdbDictionaryImpl.cpp:
  1) Set error code for timeout
  2) Handle NotMaster with retry in all DICT requests
ndb/src/ndbapi/ndb_cluster_connection.cpp:
  Fix so that input values is in seconds and not 100ms's
sql/ha_ndbcluster.cc:
  Wait 3 sec for all nodes to connect...
parent bf88db5c
...@@ -181,6 +181,7 @@ public: ...@@ -181,6 +181,7 @@ public:
enum ErrorCode { enum ErrorCode {
NoError = 0, NoError = 0,
Busy = 701, Busy = 701,
NotMaster = 702,
IndexNotFound = 4243, IndexNotFound = 4243,
IndexExists = 4244, IndexExists = 4244,
BadRequestType = 4247, BadRequestType = 4247,
......
...@@ -234,6 +234,7 @@ public: ...@@ -234,6 +234,7 @@ public:
enum ErrorCode { enum ErrorCode {
NoError = 0, NoError = 0,
Busy = 701, Busy = 701,
NotMaster = 702,
BadRequestType = 4247, BadRequestType = 4247,
InvalidPrimaryTable = 4249, InvalidPrimaryTable = 4249,
InvalidIndexType = 4250, InvalidIndexType = 4250,
......
...@@ -184,7 +184,7 @@ public: ...@@ -184,7 +184,7 @@ public:
/** /**
* CreateIndxRef. * CreateIndxRef.
*/ */
class CreateIndxRef { struct CreateIndxRef {
friend bool printCREATE_INDX_REF(FILE*, const Uint32*, Uint32, Uint16); friend bool printCREATE_INDX_REF(FILE*, const Uint32*, Uint32, Uint16);
public: public:
...@@ -210,7 +210,6 @@ public: ...@@ -210,7 +210,6 @@ public:
InvalidAttributeOrder = 4255 InvalidAttributeOrder = 4255
}; };
private:
CreateIndxConf m_conf; CreateIndxConf m_conf;
//Uint32 m_userRef; //Uint32 m_userRef;
//Uint32 m_connectionPtr; //Uint32 m_connectionPtr;
......
...@@ -288,6 +288,7 @@ public: ...@@ -288,6 +288,7 @@ public:
enum ErrorCode { enum ErrorCode {
NoError = 0, NoError = 0,
Busy = 701, Busy = 701,
NotMaster = 702,
TriggerNameTooLong = 4236, TriggerNameTooLong = 4236,
TooManyTriggers = 4237, TooManyTriggers = 4237,
TriggerNotFound = 4238, TriggerNotFound = 4238,
......
...@@ -160,7 +160,7 @@ public: ...@@ -160,7 +160,7 @@ public:
/** /**
* DropIndxRef. * DropIndxRef.
*/ */
class DropIndxRef { struct DropIndxRef {
friend bool printDROP_INDX_REF(FILE*, const Uint32*, Uint32, Uint16); friend bool printDROP_INDX_REF(FILE*, const Uint32*, Uint32, Uint16);
public: public:
...@@ -168,6 +168,7 @@ public: ...@@ -168,6 +168,7 @@ public:
NoError = 0, NoError = 0,
InvalidIndexVersion = 241, InvalidIndexVersion = 241,
Busy = 701, Busy = 701,
NotMaster = 702,
IndexNotFound = 4243, IndexNotFound = 4243,
BadRequestType = 4247, BadRequestType = 4247,
InvalidName = 4248, InvalidName = 4248,
...@@ -175,7 +176,6 @@ public: ...@@ -175,7 +176,6 @@ public:
}; };
STATIC_CONST( SignalLength = DropIndxConf::SignalLength + 3 ); STATIC_CONST( SignalLength = DropIndxConf::SignalLength + 3 );
private:
DropIndxConf m_conf; DropIndxConf m_conf;
//Uint32 m_userRef; //Uint32 m_userRef;
//Uint32 m_connectionPtr; //Uint32 m_connectionPtr;
......
...@@ -6053,11 +6053,21 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal) ...@@ -6053,11 +6053,21 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal)
jam(); jam();
if (getOwnNodeId() != c_masterNodeId) { if (getOwnNodeId() != c_masterNodeId) {
jam(); jam();
// forward to DICT master
sendSignal(calcDictBlockRef(c_masterNodeId), GSN_CREATE_INDX_REQ, releaseSections(signal);
signal, signal->getLength(), JBB); OpCreateIndex opBusy;
return; opPtr.p = &opBusy;
opPtr.p->save(req);
opPtr.p->m_isMaster = (senderRef == reference());
opPtr.p->key = 0;
opPtr.p->m_requestType = CreateIndxReq::RT_DICT_PREPARE;
opPtr.p->m_errorCode = CreateIndxRef::NotMaster;
opPtr.p->m_errorLine = __LINE__;
opPtr.p->m_errorNode = c_masterNodeId;
createIndex_sendReply(signal, opPtr, true);
return;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
req->setOpKey(++c_opRecordSequence); req->setOpKey(++c_opRecordSequence);
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
...@@ -6588,10 +6598,9 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) ...@@ -6588,10 +6598,9 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
jam(); jam();
if (getOwnNodeId() != c_masterNodeId) { if (getOwnNodeId() != c_masterNodeId) {
jam(); jam();
// forward to DICT master
sendSignal(calcDictBlockRef(c_masterNodeId), GSN_DROP_INDX_REQ, err = DropIndxRef::NotMaster;
signal, signal->getLength(), JBB); goto error;
return;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
Uint32 indexId= req->getIndexId(); Uint32 indexId= req->getIndexId();
...@@ -6679,6 +6688,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) ...@@ -6679,6 +6688,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal)
opPtr.p->save(req); opPtr.p->save(req);
opPtr.p->m_errorCode = (DropIndxRef::ErrorCode)err; opPtr.p->m_errorCode = (DropIndxRef::ErrorCode)err;
opPtr.p->m_errorLine = __LINE__; opPtr.p->m_errorLine = __LINE__;
opPtr.p->m_errorNode = c_masterNodeId;
dropIndex_sendReply(signal, opPtr, true); dropIndex_sendReply(signal, opPtr, true);
} }
...@@ -9117,9 +9127,15 @@ Dbdict::execALTER_INDX_REQ(Signal* signal) ...@@ -9117,9 +9127,15 @@ Dbdict::execALTER_INDX_REQ(Signal* signal)
jam(); jam();
if (! isLocal && getOwnNodeId() != c_masterNodeId) { if (! isLocal && getOwnNodeId() != c_masterNodeId) {
jam(); jam();
// forward to DICT master
sendSignal(calcDictBlockRef(c_masterNodeId), GSN_ALTER_INDX_REQ, releaseSections(signal);
signal, signal->getLength(), JBB); OpAlterIndex opBad;
opPtr.p = &opBad;
opPtr.p->save(req);
opPtr.p->m_errorCode = AlterIndxRef::NotMaster;
opPtr.p->m_errorLine = __LINE__;
opPtr.p->m_errorNode = c_masterNodeId;
alterIndex_sendReply(signal, opPtr, true);
return; return;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
...@@ -9797,9 +9813,15 @@ Dbdict::execBUILDINDXREQ(Signal* signal) ...@@ -9797,9 +9813,15 @@ Dbdict::execBUILDINDXREQ(Signal* signal)
jam(); jam();
if (getOwnNodeId() != c_masterNodeId) { if (getOwnNodeId() != c_masterNodeId) {
jam(); jam();
// forward to DICT master
sendSignal(calcDictBlockRef(c_masterNodeId), GSN_BUILDINDXREQ, releaseSections(signal);
signal, signal->getLength(), JBB); OpBuildIndex opBad;
opPtr.p = &opBad;
opPtr.p->save(req);
opPtr.p->m_errorCode = BuildIndxRef::NotMaster;
opPtr.p->m_errorLine = __LINE__;
opPtr.p->m_errorNode = c_masterNodeId;
buildIndex_sendReply(signal, opPtr, true);
return; return;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
...@@ -10263,9 +10285,15 @@ Dbdict::execCREATE_TRIG_REQ(Signal* signal) ...@@ -10263,9 +10285,15 @@ Dbdict::execCREATE_TRIG_REQ(Signal* signal)
jam(); jam();
if (! isLocal && getOwnNodeId() != c_masterNodeId) { if (! isLocal && getOwnNodeId() != c_masterNodeId) {
jam(); jam();
// forward to DICT master
sendSignal(calcDictBlockRef(c_masterNodeId), GSN_CREATE_TRIG_REQ, releaseSections(signal);
signal, signal->getLength(), JBB); OpCreateTrigger opBad;
opPtr.p = &opBad;
opPtr.p->save(req);
opPtr.p->m_errorCode = CreateTrigRef::NotMaster;
opPtr.p->m_errorLine = __LINE__;
opPtr.p->m_errorNode = c_masterNodeId;
createTrigger_sendReply(signal, opPtr, true);
return; return;
} }
// forward initial request plus operation key to all // forward initial request plus operation key to all
......
...@@ -945,6 +945,12 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal, ...@@ -945,6 +945,12 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
if(m_waiter.m_state == WAIT_NODE_FAILURE) if(m_waiter.m_state == WAIT_NODE_FAILURE)
continue; continue;
if(m_waiter.m_state == WST_WAIT_TIMEOUT)
{
m_error.code = 4008;
DBUG_RETURN(-1);
}
if ( (temporaryMask & m_error.code) != 0 ) { if ( (temporaryMask & m_error.code) != 0 ) {
continue; continue;
} }
...@@ -2091,8 +2097,8 @@ int ...@@ -2091,8 +2097,8 @@ int
NdbDictInterface::createIndex(NdbApiSignal* signal, NdbDictInterface::createIndex(NdbApiSignal* signal,
LinearSectionPtr ptr[3]) LinearSectionPtr ptr[3])
{ {
const int noErrCodes = 1; const int noErrCodes = 2;
int errCodes[noErrCodes] = {CreateIndxRef::Busy}; int errCodes[noErrCodes] = {CreateIndxRef::Busy, CreateIndxRef::NotMaster};
return dictSignal(signal,ptr,2, return dictSignal(signal,ptr,2,
1 /*use masternode id*/, 1 /*use masternode id*/,
100, 100,
...@@ -2116,6 +2122,8 @@ NdbDictInterface::execCREATE_INDX_REF(NdbApiSignal * signal, ...@@ -2116,6 +2122,8 @@ NdbDictInterface::execCREATE_INDX_REF(NdbApiSignal * signal,
{ {
const CreateIndxRef* const ref = CAST_CONSTPTR(CreateIndxRef, signal->getDataPtr()); const CreateIndxRef* const ref = CAST_CONSTPTR(CreateIndxRef, signal->getDataPtr());
m_error.code = ref->getErrorCode(); m_error.code = ref->getErrorCode();
if(m_error.code == ref->NotMaster)
m_masterNodeId= ref->m_errorNode;
m_waiter.signal(NO_WAIT); m_waiter.signal(NO_WAIT);
} }
...@@ -2212,8 +2220,8 @@ NdbDictInterface::dropIndex(const NdbIndexImpl & impl, ...@@ -2212,8 +2220,8 @@ NdbDictInterface::dropIndex(const NdbIndexImpl & impl,
int int
NdbDictInterface::dropIndex(NdbApiSignal* signal, LinearSectionPtr ptr[3]) NdbDictInterface::dropIndex(NdbApiSignal* signal, LinearSectionPtr ptr[3])
{ {
const int noErrCodes = 1; const int noErrCodes = 2;
int errCodes[noErrCodes] = {DropIndxRef::Busy}; int errCodes[noErrCodes] = {DropIndxRef::Busy, DropIndxRef::NotMaster};
int r = dictSignal(signal,NULL,0, int r = dictSignal(signal,NULL,0,
1/*Use masternode id*/, 1/*Use masternode id*/,
100, 100,
...@@ -2240,6 +2248,8 @@ NdbDictInterface::execDROP_INDX_REF(NdbApiSignal * signal, ...@@ -2240,6 +2248,8 @@ NdbDictInterface::execDROP_INDX_REF(NdbApiSignal * signal,
{ {
const DropIndxRef* const ref = CAST_CONSTPTR(DropIndxRef, signal->getDataPtr()); const DropIndxRef* const ref = CAST_CONSTPTR(DropIndxRef, signal->getDataPtr());
m_error.code = ref->getErrorCode(); m_error.code = ref->getErrorCode();
if(m_error.code == ref->NotMaster)
m_masterNodeId= ref->m_errorNode;
m_waiter.signal(NO_WAIT); m_waiter.signal(NO_WAIT);
} }
......
...@@ -222,7 +222,8 @@ Ndb_cluster_connection::wait_until_ready(int timeout, ...@@ -222,7 +222,8 @@ Ndb_cluster_connection::wait_until_ready(int timeout,
else if (foundAliveNode > 0) else if (foundAliveNode > 0)
{ {
noChecksSinceFirstAliveFound++; noChecksSinceFirstAliveFound++;
if (noChecksSinceFirstAliveFound > timeout_after_first_alive) // 100 ms delay -> 10*
if (noChecksSinceFirstAliveFound > 10*timeout_after_first_alive)
DBUG_RETURN(1); DBUG_RETURN(1);
} }
else if (secondsCounter >= timeout) else if (secondsCounter >= timeout)
......
...@@ -4339,7 +4339,7 @@ bool ndbcluster_init() ...@@ -4339,7 +4339,7 @@ bool ndbcluster_init()
DBUG_PRINT("info",("NDBCLUSTER storage engine at %s on port %d", DBUG_PRINT("info",("NDBCLUSTER storage engine at %s on port %d",
g_ndb_cluster_connection->get_connected_host(), g_ndb_cluster_connection->get_connected_host(),
g_ndb_cluster_connection->get_connected_port())); g_ndb_cluster_connection->get_connected_port()));
g_ndb_cluster_connection->wait_until_ready(10,0); g_ndb_cluster_connection->wait_until_ready(10,3);
} }
else if(res == 1) else if(res == 1)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment