Commit cc00d542 authored by unknown's avatar unknown
Browse files

ndb - bug#24717

  5.0 version
  Add some extra state to try to prevent sending committedread to node too early


ndb/src/kernel/blocks/dbdih/Dbdih.hpp:
  remove extra virtual-indirection
ndb/src/kernel/blocks/dbdih/DbdihInit.cpp:
  remove extra virtual-indirection
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp:
  remove extra virtual-indirection
ndb/src/kernel/blocks/dblqh/Dblqh.hpp:
  Add retry mechanism to send TCKEYREF
    (as extra safety)
ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
  Add retry mechanism to send TCKEYREF
    (as extra safety)
ndb/src/kernel/blocks/dbtc/Dbtc.hpp:
  Add extra state to prevent sending committed reads to node to early
    (before connection establishment)
ndb/src/kernel/blocks/dbtc/DbtcInit.cpp:
  Add extra state to prevent sending committed reads to node to early
    (before connection establishment)
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
  Add extra state to prevent sending committed reads to node to early
    (before connection establishment)
ndb/src/kernel/vm/SimulatedBlock.cpp:
  remove extra virtual-indirection
ndb/src/kernel/vm/SimulatedBlock.hpp:
  remove extra virtual-indirection
parent 9c7361e6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1602,7 +1602,7 @@ private:
  void startInfoReply(Signal *, Uint32 nodeId);

  // DIH specifics for execNODE_START_REP (sendDictUnlockOrd)
  void exec_node_start_rep(Signal* signal);
  void execNODE_START_REP(Signal* signal);

  /*
   * Lock master DICT.  Only current use is by starting node
+2 −1
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ Dbdih::Dbdih(const class Configuration & config):

  addRecSignal(GSN_DICT_LOCK_CONF, &Dbdih::execDICT_LOCK_CONF);
  addRecSignal(GSN_DICT_LOCK_REF, &Dbdih::execDICT_LOCK_REF);
  addRecSignal(GSN_NODE_START_REP, &Dbdih::execNODE_START_REP);
  
  apiConnectRecord = 0;  
  connectRecord = 0;  
+1 −1
Original line number Diff line number Diff line
@@ -1390,7 +1390,7 @@ void Dbdih::execNDB_STTOR(Signal* signal)
}//Dbdih::execNDB_STTOR()

void
Dbdih::exec_node_start_rep(Signal* signal)
Dbdih::execNODE_START_REP(Signal* signal)
{
  /*
   * Send DICT_UNLOCK_ORD when this node is SL_STARTED.
+2 −0
Original line number Diff line number Diff line
@@ -236,6 +236,7 @@
#define ZOPERATION_EVENT_REP 19
#define ZPREP_DROP_TABLE 20
#define ZENABLE_EXPAND_CHECK 21
#define ZRETRY_TCKEYREF 22

/* ------------------------------------------------------------------------- */
/*        NODE STATE DURING SYSTEM RESTART, VARIABLES CNODES_SR_STATE        */
@@ -2276,6 +2277,7 @@ private:
  void releaseScanrec(Signal* signal);
  void seizeScanrec(Signal* signal);
  Uint32 sendKeyinfo20(Signal* signal, ScanRecord *, TcConnectionrec *);
  void sendTCKEYREF(Signal*, Uint32 dst, Uint32 route, Uint32 cnt);
  void sendScanFragConf(Signal* signal, Uint32 scanCompleted);
  void initCopyrec(Signal* signal);
  void initCopyTc(Signal* signal);
+41 −3
Original line number Diff line number Diff line
@@ -464,6 +464,22 @@ void Dblqh::execCONTINUEB(Signal* signal)
      return;
    }
  }
  case ZRETRY_TCKEYREF:
  {
    jam();
    Uint32 cnt = signal->theData[1];
    Uint32 ref = signal->theData[2];
    if (cnt < (10 * 60 * 5))
    {
      jam();
      /**
       * Only retry for 5 minutes...then hope that API has handled it..somehow
       */
      memmove(signal->theData, signal->theData+3, 4*TcKeyRef::SignalLength);
      sendTCKEYREF(signal, ref, 0, cnt);
    }
    return;
  }
  default:
    ndbrequire(false);
    break;
@@ -2370,7 +2386,7 @@ void Dblqh::noFreeRecordLab(Signal* signal,
    tcKeyRef->transId[0] = transid1;
    tcKeyRef->transId[1] = transid2;
    tcKeyRef->errorCode = errCode;
    sendSignal(apiRef, GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB);
    sendTCKEYREF(signal, apiRef, signal->getSendersBlockRef(), 0);
  } else {
    jam();
@@ -6576,8 +6592,7 @@ void Dblqh::continueAfterLogAbortWriteLab(Signal* signal)
    tcKeyRef->transId[0] = regTcPtr->transid[0];
    tcKeyRef->transId[1] = regTcPtr->transid[1];
    tcKeyRef->errorCode = regTcPtr->errorCode;
    sendSignal(regTcPtr->applRef, 
               GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB);
    sendTCKEYREF(signal, regTcPtr->applRef, regTcPtr->clientBlockref, 0);
    cleanUp(signal);
    return;
  }//if
@@ -6612,6 +6627,29 @@ void Dblqh::continueAfterLogAbortWriteLab(Signal* signal)
  cleanUp(signal);
}//Dblqh::continueAfterLogAbortWriteLab()
void
Dblqh::sendTCKEYREF(Signal* signal, Uint32 ref, Uint32 routeRef, Uint32 cnt)
{
  const Uint32 nodeId = refToNode(ref);
  const bool connectedToNode = getNodeInfo(nodeId).m_connected;
  
  if (likely(connectedToNode))
  {
    jam();
    sendSignal(ref, GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB);
  }
  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);
  }
}
/* ########################################################################## 
 * #######                       MODULE TO HANDLE TC FAILURE          ####### 
 *
Loading