Commit 7a7ee30c authored by unknown's avatar unknown
Browse files

ndb: fix bug-4644 Err Out of fragment operations


sql/ha_ndbcluster.cc:
  compile fix in DBUG code
ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp:
  fix count of metadata pages
ndb/include/kernel/signaldata/TupFrag.hpp:
  bug-4644 fix
ndb/src/kernel/blocks/ERROR_codes.txt:
  bug-4644 fix
ndb/src/kernel/blocks/dblqh/Dblqh.hpp:
  bug-4644 fix
ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
  bug-4644 fix
ndb/src/kernel/blocks/dbtup/Dbtup.hpp:
  bug-4644 fix
ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp:
  bug-4644 fix
ndb/src/kernel/blocks/dbtux/Dbtux.hpp:
  bug-4644 fix
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp:
  bug-4644 fix
ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp:
  bug-4644 fix
ndb/test/ndbapi/testDict.cpp:
  bug-4644 fix
parent 4374aaa5
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -132,9 +132,10 @@ class TupAddAttrConf {
  friend class Dblqh;
  friend class Dbtup;
public:
  STATIC_CONST( SignalLength = 1 );
  STATIC_CONST( SignalLength = 2 );
private:
  Uint32 userPtr;
  Uint32 lastAttr; // bool: got last attr and closed frag op
};

class TupAddAttrRef {
@@ -171,9 +172,10 @@ class TuxAddAttrConf {
  friend class Dblqh;
  friend class Dbtux;
public:
  STATIC_CONST( SignalLength = 1 );
  STATIC_CONST( SignalLength = 2 );
private:
  Uint32 userPtr;
  Uint32 lastAttr; // bool: got last attr and closed frag op
};

class TuxAddAttrRef {
+8 −2
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ Next QMGR 1
Next NDBCNTR 1000
Next NDBFS 2000
Next DBACC 3001
Next DBTUP 4007
Next DBTUP 4013
Next DBLQH 5042
Next DBDICT 6006
Next DBDIH 7174
@@ -10,7 +10,7 @@ Next DBTC 8035
Next CMVMI 9000
Next BACKUP 10022
Next DBUTIL 11002
Next DBTUX 12001
Next DBTUX 12007
Next SUMA 13001

TESTING NODE FAILURE, ARBITRATION
@@ -393,6 +393,12 @@ Failed Create Table:
--------------------
7173: Create table failed due to not sufficient number of fragment or
      replica records.
4007 12001: Fail create 1st fragment
4008 12002: Fail create 2nd fragment
4009 12003: Fail create 1st attribute in 1st fragment
4010 12004: Fail create last attribute in 1st fragment
4011 12005: Fail create 1st attribute in 2nd fragment
4012 12006: Fail create last attribute in 2nd fragment

Drop Table/Index:
-----------------
+1 −1
Original line number Diff line number Diff line
@@ -2474,7 +2474,7 @@ private:
  void sendExecFragRefLab(Signal* signal);
  void fragrefLab(Signal* signal, BlockReference retRef,
                  Uint32 retPtr, Uint32 errorCode);
  void accFragRefLab(Signal* signal);
  void abortAddFragOps(Signal* signal);
  void rwConcludedLab(Signal* signal);
  void sendsttorryLab(Signal* signal);
  void initialiseRecordsLab(Signal* signal, Uint32 data, Uint32, Uint32);
+104 −1
Original line number Diff line number Diff line
@@ -912,6 +912,10 @@ void Dblqh::execREAD_CONFIG_REQ(Signal* signal)
/* *********************************************************> */
/*  LQHFRAGREQ: Create new fragments for a table. Sender DICT */
/* *********************************************************> */
// this unbelievable mess could be replaced by one signal to LQH
// and execute direct to local DICT to get everything at once
void Dblqh::execLQHFRAGREQ(Signal* signal) 
{
  jamEntry();
@@ -1049,6 +1053,11 @@ void Dblqh::execLQHFRAGREQ(Signal* signal)
  addfragptr.p->lh3DistrBits = tlhstar;
  addfragptr.p->tableType = tableType;
  addfragptr.p->primaryTableId = primaryTableId;
  //
  addfragptr.p->tup1Connectptr = RNIL;
  addfragptr.p->tup2Connectptr = RNIL;
  addfragptr.p->tux1Connectptr = RNIL;
  addfragptr.p->tux2Connectptr = RNIL;
  if (DictTabInfo::isTable(tableType) ||
      DictTabInfo::isHashIndex(tableType)) {
@@ -1329,15 +1338,21 @@ void Dblqh::execTUP_ADD_ATTCONF(Signal* signal)
{
  jamEntry();
  addfragptr.i = signal->theData[0];
  // implies that operation was released on the other side
  const bool lastAttr = signal->theData[1];
  ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord);
  switch (addfragptr.p->addfragStatus) {
  case AddFragRecord::TUP_ATTR_WAIT1:
    jam();
    if (lastAttr)
      addfragptr.p->tup1Connectptr = RNIL;
    addfragptr.p->addfragStatus = AddFragRecord::TUP_ATTR_WAIT2;
    sendAddAttrReq(signal);
    break;
  case AddFragRecord::TUP_ATTR_WAIT2:
    jam();
    if (lastAttr)
      addfragptr.p->tup2Connectptr = RNIL;
    if (DictTabInfo::isOrderedIndex(addfragptr.p->tableType)) {
      addfragptr.p->addfragStatus = AddFragRecord::TUX_ATTR_WAIT1;
      sendAddAttrReq(signal);
@@ -1347,11 +1362,15 @@ void Dblqh::execTUP_ADD_ATTCONF(Signal* signal)
    break;
  case AddFragRecord::TUX_ATTR_WAIT1:
    jam();
    if (lastAttr)
      addfragptr.p->tux1Connectptr = RNIL;
    addfragptr.p->addfragStatus = AddFragRecord::TUX_ATTR_WAIT2;
    sendAddAttrReq(signal);
    break;
  case AddFragRecord::TUX_ATTR_WAIT2:
    jam();
    if (lastAttr)
      addfragptr.p->tux2Connectptr = RNIL;
    goto done_with_attr;
    break;
  done_with_attr:
@@ -1455,6 +1474,7 @@ Dblqh::sendAddAttrReq(Signal* signal)
      jam();
      TupAddAttrConf* tupconf = (TupAddAttrConf*)signal->getDataPtrSend();
      tupconf->userPtr = addfragptr.i;
      tupconf->lastAttr = false;
      sendSignal(reference(), GSN_TUP_ADD_ATTCONF,
          signal, TupAddAttrConf::SignalLength, JBB);
      return;
@@ -1485,6 +1505,7 @@ Dblqh::sendAddAttrReq(Signal* signal)
      jam();
      TuxAddAttrConf* tuxconf = (TuxAddAttrConf*)signal->getDataPtrSend();
      tuxconf->userPtr = addfragptr.i;
      tuxconf->lastAttr = false;
      sendSignal(reference(), GSN_TUX_ADD_ATTRCONF,
          signal, TuxAddAttrConf::SignalLength, JBB);
      return;
@@ -1549,6 +1570,40 @@ void Dblqh::fragrefLab(Signal* signal,
  return;
}//Dblqh::fragrefLab()
/*
 * Abort on-going ops.
 */
void Dblqh::abortAddFragOps(Signal* signal)
{
  fragptr.i = addfragptr.p->fragmentPtr;
  ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  signal->theData[0] = (Uint32)-1;
  if (addfragptr.p->tup1Connectptr != RNIL) {
    jam();
    signal->theData[1] = addfragptr.p->tup1Connectptr;
    sendSignal(fragptr.p->tupBlockref, GSN_TUPFRAGREQ, signal, 2, JBB);
    addfragptr.p->tup1Connectptr = RNIL;
  }
  if (addfragptr.p->tup2Connectptr != RNIL) {
    jam();
    signal->theData[1] = addfragptr.p->tup2Connectptr;
    sendSignal(fragptr.p->tupBlockref, GSN_TUPFRAGREQ, signal, 2, JBB);
    addfragptr.p->tup2Connectptr = RNIL;
  }
  if (addfragptr.p->tux1Connectptr != RNIL) {
    jam();
    signal->theData[1] = addfragptr.p->tux1Connectptr;
    sendSignal(fragptr.p->tuxBlockref, GSN_TUXFRAGREQ, signal, 2, JBB);
    addfragptr.p->tux1Connectptr = RNIL;
  }
  if (addfragptr.p->tux2Connectptr != RNIL) {
    jam();
    signal->theData[1] = addfragptr.p->tux2Connectptr;
    sendSignal(fragptr.p->tuxBlockref, GSN_TUXFRAGREQ, signal, 2, JBB);
    addfragptr.p->tux2Connectptr = RNIL;
  }
}
/* ************>> */
/*  ACCFRAGREF  > */
/* ************>> */
@@ -1582,6 +1637,27 @@ void Dblqh::execTUPFRAGREF(Signal* signal)
  fragptr.i = addfragptr.p->fragmentPtr;
  ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  addfragptr.p->addfragErrorCode = terrorCode;
  // no operation to release, just add some jams
  switch (addfragptr.p->addfragStatus) {
  case AddFragRecord::WAIT_TWO_TUP:
    jam();
    break;
  case AddFragRecord::WAIT_ONE_TUP:
    jam();
    break;
  case AddFragRecord::WAIT_TWO_TUX:
    jam();
    break;
  case AddFragRecord::WAIT_ONE_TUX:
    jam();
    break;
  default:
    ndbrequire(false);
    break;
  }
  abortAddFragOps(signal);
  const Uint32 ref = addfragptr.p->dictBlockref;
  const Uint32 senderData = addfragptr.p->dictConnectptr;
  const Uint32 errorCode = addfragptr.p->addfragErrorCode;
@@ -1605,12 +1681,39 @@ void Dblqh::execTUXFRAGREF(Signal* signal)
void Dblqh::execTUP_ADD_ATTRREF(Signal* signal) 
{
  jamEntry();
  addfragptr.i = signal->theData[0];
  ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord);
  terrorCode = signal->theData[1];
  addfragptr.p->addfragErrorCode = terrorCode;
  // operation was released on the other side
  switch (addfragptr.p->addfragStatus) {
  case AddFragRecord::TUP_ATTR_WAIT1:
    jam();
    ndbrequire(addfragptr.p->tup1Connectptr != RNIL);
    addfragptr.p->tup1Connectptr = RNIL;
    break;
  case AddFragRecord::TUP_ATTR_WAIT2:
    jam();
    ndbrequire(addfragptr.p->tup2Connectptr != RNIL);
    addfragptr.p->tup2Connectptr = RNIL;
    break;
  case AddFragRecord::TUX_ATTR_WAIT1:
    jam();
    ndbrequire(addfragptr.p->tux1Connectptr != RNIL);
    addfragptr.p->tux1Connectptr = RNIL;
    break;
  case AddFragRecord::TUX_ATTR_WAIT2:
    jam();
    ndbrequire(addfragptr.p->tux2Connectptr != RNIL);
    addfragptr.p->tux2Connectptr = RNIL;
    break;
  default:
    ndbrequire(false);
    break;
  }
  abortAddFragOps(signal);
  
  const Uint32 Ref = addfragptr.p->dictBlockref;
  const Uint32 senderData = addfragptr.p->dictConnectptr;
  const Uint32 errorCode = addfragptr.p->addfragErrorCode;
+2 −0
Original line number Diff line number Diff line
@@ -504,6 +504,7 @@ struct Fragoperrec {
  Uint32 noOfNewAttrCount;
  Uint32 charsetIndex;
  BlockReference lqhBlockrefFrag;
  bool inUse;
};
typedef Ptr<Fragoperrec> FragoperrecPtr;

@@ -1936,6 +1937,7 @@ private:
  void setUpKeyArray(Tablerec* const regTabPtr);
  bool addfragtotab(Tablerec* const regTabPtr, Uint32 fragId, Uint32 fragIndex);
  void deleteFragTab(Tablerec* const regTabPtr, Uint32 fragId);
  void abortAddFragOp(Signal* signal);
  void releaseTabDescr(Tablerec* const regTabPtr);
  void getFragmentrec(FragrecordPtr& regFragPtr, Uint32 fragId, Tablerec* const regTabPtr);

Loading