mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
ndb - bug#24717
5.1 version remove 5.0 version add general routing signal send tckeyref routed if needed... storage/ndb/include/kernel/GlobalSignalNumbers.h: Add general routing signal storage/ndb/src/common/debugger/signaldata/SignalNames.cpp: Add general routing signal storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp: send TCKEYREF routed if needed storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp: add general routing remove node started state storage/ndb/src/kernel/blocks/dbtc/DbtcInit.cpp: add general routing remove node started state storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: add general routing remove node started state remove "avoid sending committed read to early" as it now should be handled correctly storage/ndb/include/kernel/signaldata/RouteOrd.hpp: New BitKeeper file ``storage/ndb/include/kernel/signaldata/RouteOrd.hpp''
This commit is contained in:
parent
e958b49e8d
commit
aeb2d45777
7 changed files with 124 additions and 49 deletions
|
@ -126,7 +126,6 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
|
|||
#define GSN_ACC_ABORTCONF 67
|
||||
/* 68 not unused */
|
||||
/* 69 not unused */
|
||||
/* 70 unused */
|
||||
#define GSN_UPDATE_FRAG_DIST_KEY_ORD 70
|
||||
#define GSN_ACC_ABORTREQ 71
|
||||
#define GSN_ACC_CHECK_SCAN 72
|
||||
|
@ -183,7 +182,7 @@ extern const GlobalSignalNumber NO_OF_SIGNAL_NAMES;
|
|||
#define GSN_CNTR_START_CONF 118
|
||||
#define GSN_CNTR_START_REP 119
|
||||
/* 120 not unused */
|
||||
/* 121 unused */
|
||||
#define GSN_ROUTE_ORD 121
|
||||
/* 122 unused */
|
||||
/* 123 unused */
|
||||
/* 124 unused */
|
||||
|
|
35
storage/ndb/include/kernel/signaldata/RouteOrd.hpp
Normal file
35
storage/ndb/include/kernel/signaldata/RouteOrd.hpp
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* Copyright (C) 2003 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifndef ROUTE_ORD_HPP
|
||||
#define ROUTE_ORD_HPP
|
||||
|
||||
#include "SignalData.hpp"
|
||||
#include <NodeBitmask.hpp>
|
||||
|
||||
/**
|
||||
* Request to allocate node id
|
||||
*/
|
||||
struct RouteOrd {
|
||||
STATIC_CONST( SignalLength = 4 );
|
||||
|
||||
Uint32 dstRef;
|
||||
Uint32 srcRef;
|
||||
Uint32 gsn;
|
||||
Uint32 cnt;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -635,5 +635,7 @@ const GsnName SignalNames [] = {
|
|||
|
||||
,{ GSN_UPDATE_FRAG_DIST_KEY_ORD, "UPDATE_FRAG_DIST_KEY_ORD" }
|
||||
,{ GSN_DICT_COMMIT_REQ, "DICT_COMMIT_REQ"}
|
||||
|
||||
,{ GSN_ROUTE_ORD, "ROUTE_ORD" }
|
||||
};
|
||||
const unsigned short NO_OF_SIGNAL_NAMES = sizeof(SignalNames)/sizeof(GsnName);
|
||||
|
|
|
@ -62,6 +62,7 @@
|
|||
#include <signaldata/KeyInfo.hpp>
|
||||
#include <signaldata/AttrInfo.hpp>
|
||||
#include <KeyDescriptor.hpp>
|
||||
#include <signaldata/RouteOrd.hpp>
|
||||
|
||||
// Use DEBUG to print messages that should be
|
||||
// seen only when we debug the product
|
||||
|
@ -7337,13 +7338,32 @@ Dblqh::sendTCKEYREF(Signal* signal, Uint32 ref, Uint32 routeRef, Uint32 cnt)
|
|||
}
|
||||
else
|
||||
{
|
||||
jam();
|
||||
memmove(signal->theData + 3, signal->theData, 4*TcKeyRef::SignalLength);
|
||||
signal->theData[0] = ZRETRY_TCKEYREF;
|
||||
signal->theData[1] = cnt + 1;
|
||||
signal->theData[2] = ref;
|
||||
sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100,
|
||||
TcKeyRef::SignalLength + 3);
|
||||
if (routeRef &&
|
||||
getNodeInfo(refToNode(routeRef)).m_version >= MAKE_VERSION(5,1,14))
|
||||
{
|
||||
jam();
|
||||
memmove(signal->theData+25, signal->theData, 4*TcKeyRef::SignalLength);
|
||||
RouteOrd* ord = (RouteOrd*)signal->getDataPtrSend();
|
||||
ord->dstRef = ref;
|
||||
ord->srcRef = reference();
|
||||
ord->gsn = GSN_TCKEYREF;
|
||||
ord->cnt = 0;
|
||||
LinearSectionPtr ptr[3];
|
||||
ptr[0].p = signal->theData+25;
|
||||
ptr[0].sz = TcKeyRef::SignalLength;
|
||||
sendSignal(routeRef, GSN_ROUTE_ORD, signal, RouteOrd::SignalLength, JBB,
|
||||
ptr, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
jam();
|
||||
memmove(signal->theData + 3, signal->theData, 4*TcKeyRef::SignalLength);
|
||||
signal->theData[0] = ZRETRY_TCKEYREF;
|
||||
signal->theData[1] = cnt + 1;
|
||||
signal->theData[2] = ref;
|
||||
sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100,
|
||||
TcKeyRef::SignalLength + 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -945,8 +945,7 @@ public:
|
|||
NF_CHECK_SCAN = 0x2,
|
||||
NF_CHECK_TRANSACTION = 0x4,
|
||||
NF_CHECK_DROP_TAB = 0x8,
|
||||
NF_NODE_FAIL_BITS = 0xF, // All bits...
|
||||
NF_STARTED = 0x10
|
||||
NF_NODE_FAIL_BITS = 0xF // All bits...
|
||||
};
|
||||
Uint32 m_nf_bits;
|
||||
NdbNodeBitmask m_lqh_trans_conf;
|
||||
|
@ -1286,7 +1285,7 @@ private:
|
|||
void execLQHKEYREF(Signal* signal);
|
||||
void execTRANSID_AI_R(Signal* signal);
|
||||
void execKEYINFO20_R(Signal* signal);
|
||||
|
||||
void execROUTE_ORD(Signal* signal);
|
||||
// Received signals
|
||||
void execDUMP_STATE_ORD(Signal* signal);
|
||||
void execSEND_PACKED(Signal* signal);
|
||||
|
@ -1324,7 +1323,6 @@ private:
|
|||
void execCOMMITCONF(Signal* signal);
|
||||
void execABORTCONF(Signal* signal);
|
||||
void execNODE_FAILREP(Signal* signal);
|
||||
void execNODE_START_REP(Signal* signal);
|
||||
void execINCL_NODEREQ(Signal* signal);
|
||||
void execTIME_SIGNAL(Signal* signal);
|
||||
void execAPI_FAILREQ(Signal* signal);
|
||||
|
|
|
@ -279,7 +279,7 @@ Dbtc::Dbtc(Block_context& ctx):
|
|||
addRecSignal(GSN_WAIT_DROP_TAB_CONF, &Dbtc::execWAIT_DROP_TAB_CONF);
|
||||
|
||||
addRecSignal(GSN_ALTER_TAB_REQ, &Dbtc::execALTER_TAB_REQ);
|
||||
addRecSignal(GSN_NODE_START_REP, &Dbtc::execNODE_START_REP, true);
|
||||
addRecSignal(GSN_ROUTE_ORD, &Dbtc::execROUTE_ORD);
|
||||
|
||||
cacheRecord = 0;
|
||||
apiConnectRecord = 0;
|
||||
|
|
|
@ -72,6 +72,8 @@
|
|||
#include <NdbOut.hpp>
|
||||
#include <DebuggerNames.hpp>
|
||||
|
||||
#include <signaldata/RouteOrd.hpp>
|
||||
|
||||
// Use DEBUG to print messages that should be
|
||||
// seen only when we debug the product
|
||||
#ifdef VM_TRACE
|
||||
|
@ -3051,28 +3053,7 @@ void Dbtc::tckeyreq050Lab(Signal* signal)
|
|||
}//if
|
||||
}//for
|
||||
}
|
||||
|
||||
if (regTcPtr->tcNodedata[0] != getOwnNodeId())
|
||||
{
|
||||
jam();
|
||||
for (Uint32 i = 0; i < tnoOfBackup + 1; i++)
|
||||
{
|
||||
HostRecordPtr hostPtr;
|
||||
hostPtr.i = regTcPtr->tcNodedata[i];
|
||||
ptrCheckGuard(hostPtr, chostFilesize, hostRecord);
|
||||
if (hostPtr.p->m_nf_bits & HostRecord::NF_STARTED)
|
||||
{
|
||||
jam();
|
||||
if (i != 0)
|
||||
{
|
||||
jam();
|
||||
regTcPtr->tcNodedata[0] = hostPtr.i;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}//if
|
||||
}
|
||||
}//if
|
||||
jam();
|
||||
regTcPtr->lastReplicaNo = 0;
|
||||
regTcPtr->noOfNodes = 1;
|
||||
|
@ -7029,19 +7010,6 @@ void Dbtc::execNODE_FAILREP(Signal* signal)
|
|||
}
|
||||
}//Dbtc::execNODE_FAILREP()
|
||||
|
||||
void
|
||||
Dbtc::execNODE_START_REP(Signal* signal)
|
||||
{
|
||||
Uint32 nodeId = signal->theData[0];
|
||||
hostptr.i = nodeId;
|
||||
ptrCheckGuard(hostptr, chostFilesize, hostRecord);
|
||||
if (hostptr.p->m_nf_bits == 0)
|
||||
{
|
||||
jam();
|
||||
hostptr.p->m_nf_bits |= HostRecord::NF_STARTED;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Dbtc::checkNodeFailComplete(Signal* signal,
|
||||
Uint32 failedNodeId,
|
||||
|
@ -13345,3 +13313,56 @@ Dbtc::TableRecord::getErrorCode(Uint32 schemaVersion) const {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Dbtc::execROUTE_ORD(Signal* signal)
|
||||
{
|
||||
jamEntry();
|
||||
if(!assembleFragments(signal)){
|
||||
jam();
|
||||
return;
|
||||
}
|
||||
|
||||
RouteOrd* ord = (RouteOrd*)signal->getDataPtr();
|
||||
Uint32 dstRef = ord->dstRef;
|
||||
Uint32 srcRef = ord->srcRef;
|
||||
Uint32 gsn = ord->gsn;
|
||||
Uint32 cnt = ord->cnt;
|
||||
|
||||
if (likely(getNodeInfo(refToNode(dstRef)).m_connected))
|
||||
{
|
||||
jam();
|
||||
Uint32 secCount = signal->getNoOfSections();
|
||||
SegmentedSectionPtr ptr[3];
|
||||
ndbrequire(secCount >= 1 && secCount <= 3);
|
||||
|
||||
jamLine(secCount);
|
||||
for (Uint32 i = 0; i<secCount; i++)
|
||||
signal->getSection(ptr[i], i);
|
||||
|
||||
/**
|
||||
* Put section 0 in signal->theData
|
||||
*/
|
||||
ndbrequire(ptr[0].sz <= 25);
|
||||
copy(signal->theData, ptr[0]);
|
||||
|
||||
signal->header.m_noOfSections = 0;
|
||||
|
||||
/**
|
||||
* Shift rest of sections
|
||||
*/
|
||||
for(Uint32 i = 1; i<secCount; i++)
|
||||
{
|
||||
signal->setSection(ptr[i], i - 1);
|
||||
}
|
||||
|
||||
sendSignal(dstRef, gsn, signal, ptr[0].sz, JBB);
|
||||
|
||||
signal->header.m_noOfSections = 0;
|
||||
signal->setSection(ptr[0], 0);
|
||||
releaseSections(signal);
|
||||
return ;
|
||||
}
|
||||
|
||||
warningEvent("Unable to route GSN: %d from %x to %x",
|
||||
gsn, srcRef, dstRef);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue