NdbcntrMain.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:76k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #define NDBCNTR_C
  14. #include "Ndbcntr.hpp"
  15. #include <ndb_limits.h>
  16. #include <ndb_version.h>
  17. #include <SimpleProperties.hpp>
  18. #include <signaldata/DictTabInfo.hpp>
  19. #include <signaldata/CreateTable.hpp>
  20. #include <signaldata/ReadNodesConf.hpp>
  21. #include <signaldata/NodeFailRep.hpp>
  22. #include <signaldata/TcKeyReq.hpp>
  23. #include <signaldata/TcKeyConf.hpp>
  24. #include <signaldata/EventReport.hpp>
  25. #include <signaldata/NodeStateSignalData.hpp>
  26. #include <signaldata/StopPerm.hpp>
  27. #include <signaldata/StopMe.hpp>
  28. #include <signaldata/WaitGCP.hpp>
  29. #include <signaldata/CheckNodeGroups.hpp>
  30. #include <signaldata/StartOrd.hpp>
  31. #include <signaldata/AbortAll.hpp>
  32. #include <signaldata/SystemError.hpp>
  33. #include <signaldata/NdbSttor.hpp>
  34. #include <signaldata/CntrStart.hpp>
  35. #include <signaldata/DumpStateOrd.hpp>
  36. #include <signaldata/FsRemoveReq.hpp>
  37. #include <signaldata/ReadConfig.hpp>
  38. #include <AttributeHeader.hpp>
  39. #include <Configuration.hpp>
  40. #include <DebuggerNames.hpp>
  41. #include <NdbOut.hpp>
  42. #include <NdbTick.h>
  43. /**
  44.  * ALL_BLOCKS Used during start phases and while changing node state
  45.  *
  46.  * NDBFS_REF Has to be before NDBCNTR_REF (due to "ndb -i" stuff)
  47.  */
  48. struct BlockInfo {
  49.   BlockReference Ref; // BlockReference
  50.   Uint32 NextSP;            // Next start phase
  51.   Uint32 ErrorInsertStart;
  52.   Uint32 ErrorInsertStop;
  53. };
  54. static BlockInfo ALL_BLOCKS[] = { 
  55.   { DBTC_REF,    1 ,  8000,  8035 },
  56.   { DBDIH_REF,   1 ,  7000,  7173 },
  57.   { DBLQH_REF,   1 ,  5000,  5030 },
  58.   { DBACC_REF,   1 ,  3000,  3999 },
  59.   { DBTUP_REF,   1 ,  4000,  4007 },
  60.   { DBDICT_REF,  1 ,  6000,  6003 },
  61.   { NDBFS_REF,   0 ,  2000,  2999 },
  62.   { NDBCNTR_REF, 0 ,  1000,  1999 },
  63.   { QMGR_REF,    1 ,     1,   999 },
  64.   { CMVMI_REF,   1 ,  9000,  9999 },
  65.   { TRIX_REF,    1 ,     0,     0 },
  66.   { BACKUP_REF,  1 , 10000, 10999 },
  67.   { DBUTIL_REF,  1 , 11000, 11999 },
  68.   { SUMA_REF,    1 , 13000, 13999 },
  69.   { DBTUX_REF,   1 , 12000, 12999 }
  70. };
  71. static const Uint32 ALL_BLOCKS_SZ = sizeof(ALL_BLOCKS)/sizeof(BlockInfo);
  72. /*******************************/
  73. /*  CONTINUEB                  */
  74. /*******************************/
  75. void Ndbcntr::execCONTINUEB(Signal* signal) 
  76. {
  77.   jamEntry();
  78.   UintR Ttemp1 = signal->theData[0];
  79.   switch (Ttemp1) {
  80.   case ZSTARTUP:{
  81.     if(getNodeState().startLevel == NodeState::SL_STARTED){
  82.       jam();
  83.       return;
  84.     }
  85.     
  86.     if(cmasterNodeId == getOwnNodeId() && c_start.m_starting.isclear()){
  87.       jam();
  88.       trySystemRestart(signal);
  89.       // Fall-through
  90.     }
  91.     
  92.     Uint64 now = NdbTick_CurrentMillisecond();
  93.     if(now > c_start.m_startFailureTimeout)
  94.     {
  95.       jam();
  96.       Uint32 to_3= 0;
  97.       const ndb_mgm_configuration_iterator * p = 
  98. theConfiguration.getOwnConfigIterator();
  99.       ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3);
  100.       BaseString tmp;
  101.       tmp.append("Shutting down node as total restart time exceeds "
  102.  " StartFailureTimeout as set in config file ");
  103.       if(to_3 == 0)
  104. tmp.append(" 0 (inifinite)");
  105.       else
  106. tmp.appfmt(" %d", to_3);
  107.       
  108.       progError(__LINE__, ERR_SYSTEM_ERROR, tmp.c_str());
  109.     }
  110.     
  111.     signal->theData[0] = ZSTARTUP;
  112.     sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1);
  113.     break;
  114.   }
  115.   case ZSHUTDOWN:
  116.     jam();
  117.     c_stopRec.checkTimeout(signal);
  118.     break;
  119.   default:
  120.     jam();
  121.     systemErrorLab(signal);
  122.     return;
  123.     break;
  124.   }//switch
  125. }//Ndbcntr::execCONTINUEB()
  126. /*******************************/
  127. /*  SYSTEM_ERROR               */
  128. /*******************************/
  129. void Ndbcntr::execSYSTEM_ERROR(Signal* signal) 
  130. {
  131.   const SystemError * const sysErr = (SystemError *)signal->getDataPtr();
  132.   char buf[100];
  133.   int killingNode = refToNode(sysErr->errorRef);
  134.   Uint32 data1 = sysErr->data1;
  135.   
  136.   jamEntry();
  137.   switch (sysErr->errorCode){
  138.   case SystemError::StartInProgressError:    
  139.     BaseString::snprintf(buf, sizeof(buf), 
  140.      "Node %d killed this node because "
  141.      "master start in progress error",     
  142.      killingNode);
  143.     break;
  144.   case SystemError::GCPStopDetected:
  145.     BaseString::snprintf(buf, sizeof(buf), 
  146.      "Node %d killed this node because "
  147.      "GCP stop was detected",     
  148.      killingNode);
  149.     break;
  150.   case SystemError::ScanfragTimeout:
  151.     BaseString::snprintf(buf, sizeof(buf), 
  152.      "Node %d killed this node because "
  153.      "a fragment scan timed out and could not be stopped",     
  154.      killingNode);
  155.     break;
  156.   case SystemError::ScanfragStateError:
  157.     BaseString::snprintf(buf, sizeof(buf), 
  158.      "Node %d killed this node because "
  159.      "the state of a fragment scan was out of sync.",     
  160.      killingNode);
  161.     break;
  162.   case SystemError::CopyFragRefError:
  163.     BaseString::snprintf(buf, sizeof(buf), 
  164.      "Node %d killed this node because "
  165.      "it could not copy a fragment during node restart. "
  166.      "Copy fragment error code: %u.",
  167.      killingNode, data1);
  168.     break;
  169.   default:
  170.     BaseString::snprintf(buf, sizeof(buf), "System error %d, "
  171.      " this node was killed by node %d", 
  172.      sysErr->errorCode, killingNode);
  173.     break;
  174.   }
  175.   progError(__LINE__, 
  176.     ERR_SYSTEM_ERROR,
  177.     buf);
  178.   return;
  179. }//Ndbcntr::execSYSTEM_ERROR()
  180. void Ndbcntr::execSTTOR(Signal* signal) 
  181. {
  182.   jamEntry();
  183.   cstartPhase = signal->theData[1];
  184.   NodeState newState(NodeState::SL_STARTING, cstartPhase, 
  185.      (NodeState::StartType)ctypeOfStart);
  186.   updateNodeState(signal, newState);
  187.   
  188.   cndbBlocksCount = 0;
  189.   cinternalStartphase = cstartPhase - 1;
  190.   switch (cstartPhase) {
  191.   case 0:
  192.     if(theConfiguration.getInitialStart()){
  193.       jam();
  194.       c_fsRemoveCount = 0;
  195.       clearFilesystem(signal);
  196.       return;
  197.     }
  198.     sendSttorry(signal);
  199.     break;
  200.   case ZSTART_PHASE_1:
  201.     jam();
  202.     startPhase1Lab(signal);
  203.     break;
  204.   case ZSTART_PHASE_2:
  205.     jam();
  206.     startPhase2Lab(signal);
  207.     break;
  208.   case ZSTART_PHASE_3:
  209.     jam();
  210.     startPhase3Lab(signal);
  211.     break;
  212.   case ZSTART_PHASE_4:
  213.     jam();
  214.     startPhase4Lab(signal);
  215.     break;
  216.   case ZSTART_PHASE_5:
  217.     jam();
  218.     startPhase5Lab(signal);
  219.     break;
  220.   case 6:
  221.     jam();
  222.     getNodeGroup(signal);
  223.     // Fall through
  224.     break;
  225.   case ZSTART_PHASE_8:
  226.     jam();
  227.     startPhase8Lab(signal);
  228.     break;
  229.   case ZSTART_PHASE_9:
  230.     jam();
  231.     startPhase9Lab(signal);
  232.     break;
  233.   default:
  234.     jam();
  235.     sendSttorry(signal);
  236.     break;
  237.   }//switch
  238. }//Ndbcntr::execSTTOR()
  239. void
  240. Ndbcntr::getNodeGroup(Signal* signal){
  241.   jam();
  242.   CheckNodeGroups * sd = (CheckNodeGroups*)signal->getDataPtrSend();
  243.   sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::GetNodeGroup;
  244.   EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, 
  245.  CheckNodeGroups::SignalLength);
  246.   jamEntry();
  247.   c_nodeGroup = sd->output;
  248.   sendSttorry(signal);
  249. }
  250. /*******************************/
  251. /*  NDB_STTORRY                */
  252. /*******************************/
  253. void Ndbcntr::execNDB_STTORRY(Signal* signal) 
  254. {
  255.   jamEntry();
  256.   switch (cstartPhase) {
  257.   case ZSTART_PHASE_2:
  258.     jam();
  259.     ph2GLab(signal);
  260.     return;
  261.     break;
  262.   case ZSTART_PHASE_3:
  263.     jam();
  264.     ph3ALab(signal);
  265.     return;
  266.     break;
  267.   case ZSTART_PHASE_4:
  268.     jam();
  269.     ph4BLab(signal);
  270.     return;
  271.     break;
  272.   case ZSTART_PHASE_5:
  273.     jam();
  274.     ph5ALab(signal);
  275.     return;
  276.     break;
  277.   case ZSTART_PHASE_6:
  278.     jam();
  279.     ph6ALab(signal);
  280.     return;
  281.     break;
  282.   case ZSTART_PHASE_7:
  283.     jam();
  284.     ph6BLab(signal);
  285.     return;
  286.     break;
  287.   case ZSTART_PHASE_8:
  288.     jam();
  289.     ph7ALab(signal);
  290.     return;
  291.     break;
  292.   case ZSTART_PHASE_9:
  293.     jam();
  294.     ph8ALab(signal);
  295.     return;
  296.     break;
  297.   default:
  298.     jam();
  299.     systemErrorLab(signal);
  300.     return;
  301.     break;
  302.   }//switch
  303. }//Ndbcntr::execNDB_STTORRY()
  304. void Ndbcntr::startPhase1Lab(Signal* signal) 
  305. {
  306.   jamEntry();
  307.   initData(signal);
  308.   cdynamicNodeId = 0;
  309.   NdbBlocksRecPtr ndbBlocksPtr;
  310.   ndbBlocksPtr.i = 0;
  311.   ptrAss(ndbBlocksPtr, ndbBlocksRec);
  312.   ndbBlocksPtr.p->blockref = DBLQH_REF;
  313.   ndbBlocksPtr.i = 1;
  314.   ptrAss(ndbBlocksPtr, ndbBlocksRec);
  315.   ndbBlocksPtr.p->blockref = DBDICT_REF;
  316.   ndbBlocksPtr.i = 2;
  317.   ptrAss(ndbBlocksPtr, ndbBlocksRec);
  318.   ndbBlocksPtr.p->blockref = DBTUP_REF;
  319.   ndbBlocksPtr.i = 3;
  320.   ptrAss(ndbBlocksPtr, ndbBlocksRec);
  321.   ndbBlocksPtr.p->blockref = DBACC_REF;
  322.   ndbBlocksPtr.i = 4;
  323.   ptrAss(ndbBlocksPtr, ndbBlocksRec);
  324.   ndbBlocksPtr.p->blockref = DBTC_REF;
  325.   ndbBlocksPtr.i = 5;
  326.   ptrAss(ndbBlocksPtr, ndbBlocksRec);
  327.   ndbBlocksPtr.p->blockref = DBDIH_REF;
  328.   sendSttorry(signal);
  329.   return;
  330. }
  331. void Ndbcntr::execREAD_NODESREF(Signal* signal) 
  332. {
  333.   jamEntry();
  334.   systemErrorLab(signal);
  335.   return;
  336. }//Ndbcntr::execREAD_NODESREF()
  337. /*******************************/
  338. /*  NDB_STARTREF               */
  339. /*******************************/
  340. void Ndbcntr::execNDB_STARTREF(Signal* signal) 
  341. {
  342.   jamEntry();
  343.   systemErrorLab(signal);
  344.   return;
  345. }//Ndbcntr::execNDB_STARTREF()
  346. /*******************************/
  347. /*  STTOR                      */
  348. /*******************************/
  349. void Ndbcntr::startPhase2Lab(Signal* signal) 
  350. {
  351.   c_start.m_lastGci = 0;
  352.   c_start.m_lastGciNodeId = getOwnNodeId();
  353.   
  354.   signal->theData[0] = reference();
  355.   sendSignal(DBDIH_REF, GSN_DIH_RESTARTREQ, signal, 1, JBB);
  356.   return;
  357. }//Ndbcntr::startPhase2Lab()
  358. /*******************************/
  359. /*  DIH_RESTARTCONF            */
  360. /*******************************/
  361. void Ndbcntr::execDIH_RESTARTCONF(Signal* signal) 
  362. {
  363.   jamEntry();
  364.   //cmasterDihId = signal->theData[0];
  365.   c_start.m_lastGci = signal->theData[1];
  366.   ctypeOfStart = NodeState::ST_SYSTEM_RESTART;
  367.   ph2ALab(signal);
  368.   return;
  369. }//Ndbcntr::execDIH_RESTARTCONF()
  370. /*******************************/
  371. /*  DIH_RESTARTREF             */
  372. /*******************************/
  373. void Ndbcntr::execDIH_RESTARTREF(Signal* signal) 
  374. {
  375.   jamEntry();
  376.   ctypeOfStart = NodeState::ST_INITIAL_START;
  377.   ph2ALab(signal);
  378.   return;
  379. }//Ndbcntr::execDIH_RESTARTREF()
  380. void Ndbcntr::ph2ALab(Signal* signal) 
  381. {
  382.   /******************************/
  383.   /* request configured nodes   */
  384.   /* from QMGR                  */
  385.   /*  READ_NODESREQ             */
  386.   /******************************/
  387.   signal->theData[0] = reference();
  388.   sendSignal(QMGR_REF, GSN_READ_NODESREQ, signal, 1, JBB);
  389.   return;
  390. }//Ndbcntr::ph2ALab()
  391. inline
  392. Uint64
  393. setTimeout(Uint64 time, Uint32 timeoutValue){
  394.   if(timeoutValue == 0)
  395.     return ~(Uint64)0;
  396.   return time + timeoutValue;
  397. }
  398. /*******************************/
  399. /*  READ_NODESCONF             */
  400. /*******************************/
  401. void Ndbcntr::execREAD_NODESCONF(Signal* signal) 
  402. {
  403.   jamEntry();
  404.   const ReadNodesConf * readNodes = (ReadNodesConf *)&signal->theData[0];
  405.   cmasterNodeId = readNodes->masterNodeId;
  406.   cdynamicNodeId = readNodes->ndynamicId;
  407.   /**
  408.    * All defined nodes...
  409.    */
  410.   c_allDefinedNodes.assign(NdbNodeBitmask::Size, readNodes->allNodes);
  411.   c_clusterNodes.assign(NdbNodeBitmask::Size, readNodes->clusterNodes);
  412.   Uint32 to_1 = 30000;
  413.   Uint32 to_2 = 0;
  414.   Uint32 to_3 = 0;
  415.   const ndb_mgm_configuration_iterator * p = 
  416.     theConfiguration.getOwnConfigIterator();
  417.   
  418.   ndbrequire(p != 0);
  419.   ndb_mgm_get_int_parameter(p, CFG_DB_START_PARTIAL_TIMEOUT, &to_1);
  420.   ndb_mgm_get_int_parameter(p, CFG_DB_START_PARTITION_TIMEOUT, &to_2);
  421.   ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3);
  422.   
  423.   c_start.m_startTime = NdbTick_CurrentMillisecond();
  424.   c_start.m_startPartialTimeout = setTimeout(c_start.m_startTime, to_1);
  425.   c_start.m_startPartitionedTimeout = setTimeout(c_start.m_startTime, to_2);
  426.   c_start.m_startFailureTimeout = setTimeout(c_start.m_startTime, to_3);
  427.   
  428.   UpgradeStartup::sendCmAppChg(* this, signal, 0); // ADD
  429.   
  430.   sendCntrStartReq(signal);
  431.   signal->theData[0] = ZSTARTUP;
  432.   sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1);
  433.   
  434.   return;
  435. }
  436. void
  437. Ndbcntr::execCM_ADD_REP(Signal* signal){
  438.   jamEntry();
  439.   c_clusterNodes.set(signal->theData[0]);
  440. }
  441. void
  442. Ndbcntr::sendCntrStartReq(Signal * signal){
  443.   jamEntry();
  444.   CntrStartReq * req = (CntrStartReq*)signal->getDataPtrSend();
  445.   req->startType = ctypeOfStart;
  446.   req->lastGci = c_start.m_lastGci;
  447.   req->nodeId = getOwnNodeId();
  448.   sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_START_REQ,
  449.      signal, CntrStartReq::SignalLength, JBB);
  450. }
  451. void
  452. Ndbcntr::execCNTR_START_REF(Signal * signal){
  453.   jamEntry();
  454.   const CntrStartRef * ref = (CntrStartRef*)signal->getDataPtr();
  455.   switch(ref->errorCode){
  456.   case CntrStartRef::NotMaster:
  457.     jam();
  458.     cmasterNodeId = ref->masterNodeId;
  459.     sendCntrStartReq(signal);
  460.     return;
  461.   }
  462.   ndbrequire(false);
  463. }
  464. void
  465. Ndbcntr::StartRecord::reset(){
  466.   m_starting.clear();
  467.   m_waiting.clear();
  468.   m_withLog.clear();
  469.   m_withoutLog.clear();
  470.   m_lastGci = m_lastGciNodeId = 0;
  471.   m_startPartialTimeout = ~0;
  472.   m_startPartitionedTimeout = ~0;
  473.   m_startFailureTimeout = ~0;
  474.   
  475.   m_logNodesCount = 0;
  476. }
  477. void
  478. Ndbcntr::execCNTR_START_CONF(Signal * signal){
  479.   jamEntry();
  480.   const CntrStartConf * conf = (CntrStartConf*)signal->getDataPtr();
  481.   cnoStartNodes = conf->noStartNodes;
  482.   ctypeOfStart = (NodeState::StartType)conf->startType;
  483.   c_start.m_lastGci = conf->startGci;
  484.   cmasterNodeId = conf->masterNodeId;
  485.   NdbNodeBitmask tmp; 
  486.   tmp.assign(NdbNodeBitmask::Size, conf->startedNodes);
  487.   c_startedNodes.bitOR(tmp);
  488.   c_start.m_starting.assign(NdbNodeBitmask::Size, conf->startingNodes);
  489.   ph2GLab(signal);
  490.   UpgradeStartup::sendCmAppChg(* this, signal, 2); //START
  491. }
  492. /**
  493.  * Tried with parallell nr, but it crashed in DIH
  494.  * so I turned it off, as I don't want to debug DIH now...
  495.  * Jonas 19/11-03
  496.  *
  497.  * After trying for 2 hours, I gave up.
  498.  * DIH is not designed to support it, and
  499.  * it requires quite of lot of changes to
  500.  * make it work
  501.  * Jonas 5/12-03
  502.  */
  503. #define PARALLELL_NR 0
  504. #if PARALLELL_NR
  505. const bool parallellNR = true;
  506. #else
  507. const bool parallellNR = false;
  508. #endif
  509. void
  510. Ndbcntr::execCNTR_START_REP(Signal* signal){
  511.   jamEntry();
  512.   Uint32 nodeId = signal->theData[0];
  513.   c_startedNodes.set(nodeId);
  514.   c_start.m_starting.clear(nodeId);
  515.   
  516.   if(!c_start.m_starting.isclear()){
  517.     jam();
  518.     return;
  519.   }
  520.   
  521.   if(cmasterNodeId != getOwnNodeId()){
  522.     jam();
  523.     c_start.reset();
  524.     return;
  525.   }
  526.   if(c_start.m_waiting.isclear()){
  527.     jam();
  528.     c_start.reset();
  529.     return;
  530.   }
  531.   startWaitingNodes(signal);
  532. }
  533. void
  534. Ndbcntr::execCNTR_START_REQ(Signal * signal){
  535.   jamEntry();
  536.   const CntrStartReq * req = (CntrStartReq*)signal->getDataPtr();
  537.   
  538.   const Uint32 nodeId = req->nodeId;
  539.   const Uint32 lastGci = req->lastGci;
  540.   const NodeState::StartType st = (NodeState::StartType)req->startType;
  541.   if(cmasterNodeId == 0){
  542.     jam();
  543.     // Has not completed READNODES yet
  544.     sendSignalWithDelay(reference(), GSN_CNTR_START_REQ, signal, 100, 
  545. signal->getLength());
  546.     return;
  547.   }
  548.   
  549.   if(cmasterNodeId != getOwnNodeId()){
  550.     jam();
  551.     sendCntrStartRef(signal, nodeId, CntrStartRef::NotMaster);
  552.     return;
  553.   }
  554.   
  555.   const NodeState & nodeState = getNodeState();
  556.   switch(nodeState.startLevel){
  557.   case NodeState::SL_NOTHING:
  558.   case NodeState::SL_CMVMI:
  559.     jam();
  560.     ndbrequire(false);
  561.   case NodeState::SL_STARTING:
  562.   case NodeState::SL_STARTED:
  563.     jam();
  564.     break;
  565.     
  566.   case NodeState::SL_STOPPING_1:
  567.   case NodeState::SL_STOPPING_2:
  568.   case NodeState::SL_STOPPING_3:
  569.   case NodeState::SL_STOPPING_4:
  570.     jam();
  571.     sendCntrStartRef(signal, nodeId, CntrStartRef::StopInProgress);
  572.     return;
  573.   }
  574.   /**
  575.    * Am I starting (or started)
  576.    */
  577.   const bool starting = (nodeState.startLevel != NodeState::SL_STARTED);
  578.   
  579.   c_start.m_waiting.set(nodeId);
  580.   switch(st){
  581.   case NodeState::ST_INITIAL_START:
  582.     jam();
  583.     c_start.m_withoutLog.set(nodeId);
  584.     break;
  585.   case NodeState::ST_SYSTEM_RESTART:
  586.     jam();
  587.     c_start.m_withLog.set(nodeId);
  588.     if(starting && lastGci > c_start.m_lastGci){
  589.       jam();
  590.       CntrStartRef * ref = (CntrStartRef*)signal->getDataPtrSend();
  591.       ref->errorCode = CntrStartRef::NotMaster;
  592.       ref->masterNodeId = nodeId;
  593.       NodeReceiverGroup rg (NDBCNTR, c_start.m_waiting);
  594.       sendSignal(rg, GSN_CNTR_START_REF, signal,
  595.  CntrStartRef::SignalLength, JBB);
  596.       return;
  597.     }
  598.     if(starting){
  599.       jam();
  600.       Uint32 i = c_start.m_logNodesCount++;
  601.       c_start.m_logNodes[i].m_nodeId = nodeId;
  602.       c_start.m_logNodes[i].m_lastGci = req->lastGci;
  603.     }
  604.     break;
  605.   case NodeState::ST_NODE_RESTART:
  606.   case NodeState::ST_INITIAL_NODE_RESTART:
  607.   case NodeState::ST_ILLEGAL_TYPE:
  608.     ndbrequire(false);
  609.   }
  610.   const bool startInProgress = !c_start.m_starting.isclear();
  611.   if((starting && startInProgress) || (startInProgress && !parallellNR)){
  612.     jam();
  613.     // We're already starting together with a bunch of nodes
  614.     // Let this node wait...
  615.     return;
  616.   }
  617.   
  618.   if(starting){
  619.     jam();
  620.     trySystemRestart(signal);
  621.   } else {
  622.     jam();
  623.     startWaitingNodes(signal);
  624.   }
  625.   return;
  626. }
  627. void
  628. Ndbcntr::startWaitingNodes(Signal * signal){
  629. #if ! PARALLELL_NR
  630.   const Uint32 nodeId = c_start.m_waiting.find(0);
  631.   const Uint32 Tref = calcNdbCntrBlockRef(nodeId);
  632.   ndbrequire(nodeId != c_start.m_waiting.NotFound);
  633.   NodeState::StartType nrType = NodeState::ST_NODE_RESTART;
  634.   if(c_start.m_withoutLog.get(nodeId)){
  635.     jam();
  636.     nrType = NodeState::ST_INITIAL_NODE_RESTART;
  637.   }
  638.   
  639.   /**
  640.    * Let node perform restart
  641.    */
  642.   CntrStartConf * conf = (CntrStartConf*)signal->getDataPtrSend();
  643.   conf->noStartNodes = 1;
  644.   conf->startType = nrType;
  645.   conf->startGci = ~0; // Not used
  646.   conf->masterNodeId = getOwnNodeId();
  647.   BitmaskImpl::clear(NdbNodeBitmask::Size, conf->startingNodes);
  648.   BitmaskImpl::set(NdbNodeBitmask::Size, conf->startingNodes, nodeId);
  649.   c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
  650.   sendSignal(Tref, GSN_CNTR_START_CONF, signal, 
  651.      CntrStartConf::SignalLength, JBB);
  652.   c_start.m_waiting.clear(nodeId);
  653.   c_start.m_withLog.clear(nodeId);
  654.   c_start.m_withoutLog.clear(nodeId);
  655.   c_start.m_starting.set(nodeId);
  656. #else
  657.   // Parallell nr
  658.   
  659.   c_start.m_starting = c_start.m_waiting;
  660.   c_start.m_waiting.clear();
  661.   
  662.   CntrStartConf * conf = (CntrStartConf*)signal->getDataPtrSend();
  663.   conf->noStartNodes = 1;
  664.   conf->startGci = ~0; // Not used
  665.   conf->masterNodeId = getOwnNodeId();
  666.   c_start.m_starting.copyto(NdbNodeBitmask::Size, conf->startingNodes);
  667.   c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
  668.   
  669.   char buf[100];
  670.   if(!c_start.m_withLog.isclear()){
  671.     jam();
  672.     ndbout_c("Starting nodes w/ log: %s", c_start.m_withLog.getText(buf));
  673.     NodeReceiverGroup rg(NDBCNTR, c_start.m_withLog);
  674.     conf->startType = NodeState::ST_NODE_RESTART;
  675.     
  676.     sendSignal(rg, GSN_CNTR_START_CONF, signal, 
  677.        CntrStartConf::SignalLength, JBB);
  678.   }
  679.   if(!c_start.m_withoutLog.isclear()){
  680.     jam();
  681.     ndbout_c("Starting nodes wo/ log: %s", c_start.m_withoutLog.getText(buf));
  682.     NodeReceiverGroup rg(NDBCNTR, c_start.m_withoutLog);
  683.     conf->startType = NodeState::ST_INITIAL_NODE_RESTART;
  684.     
  685.     sendSignal(rg, GSN_CNTR_START_CONF, signal, 
  686.        CntrStartConf::SignalLength, JBB);
  687.   }
  688.   c_start.m_waiting.clear();
  689.   c_start.m_withLog.clear();
  690.   c_start.m_withoutLog.clear();
  691. #endif
  692. }
  693. void
  694. Ndbcntr::sendCntrStartRef(Signal * signal, 
  695.   Uint32 nodeId, CntrStartRef::ErrorCode code){
  696.   CntrStartRef * ref = (CntrStartRef*)signal->getDataPtrSend();
  697.   ref->errorCode = code;
  698.   ref->masterNodeId = cmasterNodeId;
  699.   sendSignal(calcNdbCntrBlockRef(nodeId), GSN_CNTR_START_REF, signal,
  700.      CntrStartRef::SignalLength, JBB);
  701. }
  702. CheckNodeGroups::Output
  703. Ndbcntr::checkNodeGroups(Signal* signal, const NdbNodeBitmask & mask){
  704.   CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
  705.   sd->blockRef = reference();
  706.   sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::ArbitCheck;
  707.   sd->mask = mask;
  708.   EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, 
  709.  CheckNodeGroups::SignalLength);
  710.   jamEntry();
  711.   return (CheckNodeGroups::Output)sd->output;
  712. }
  713. bool
  714. Ndbcntr::trySystemRestart(Signal* signal){
  715.   /**
  716.    * System restart something
  717.    */
  718.   const bool allNodes = c_start.m_waiting.equal(c_allDefinedNodes);
  719.   const bool allClusterNodes = c_start.m_waiting.equal(c_clusterNodes);
  720.   const Uint64 now = NdbTick_CurrentMillisecond();
  721.   if(!allClusterNodes){
  722.     jam();
  723.     return false;
  724.   }
  725.   
  726.   if(!allNodes && c_start.m_startPartialTimeout > now){
  727.     jam();
  728.     return false;
  729.   }
  730.   NodeState::StartType srType = NodeState::ST_SYSTEM_RESTART;
  731.   if(c_start.m_waiting.equal(c_start.m_withoutLog)){
  732.     if(!allNodes){
  733.       jam();
  734.       return false;
  735.     }
  736.     jam();
  737.     srType = NodeState::ST_INITIAL_START;
  738.     c_start.m_starting = c_start.m_withoutLog; // Used for starting...
  739.     c_start.m_withoutLog.clear();
  740.   } else {
  741.     CheckNodeGroups::Output wLog = checkNodeGroups(signal, c_start.m_withLog);
  742.     switch (wLog) {
  743.     case CheckNodeGroups::Win:
  744.       jam();
  745.       break;
  746.     case CheckNodeGroups::Lose:
  747.       jam();
  748.       // If we lose with all nodes, then we're in trouble
  749.       ndbrequire(!allNodes);
  750.       return false;
  751.     case CheckNodeGroups::Partitioning:
  752.       jam();
  753.       bool allowPartition = (c_start.m_startPartitionedTimeout != (Uint64)~0);
  754.       
  755.       if(allNodes){
  756. if(allowPartition){
  757.   jam();
  758.   break;
  759. }
  760. ndbrequire(false); // All nodes -> partitioning, which is not allowed
  761.       }
  762.       
  763.       if(c_start.m_startPartitionedTimeout > now){
  764. jam();
  765. return false;
  766.       }
  767.       break;
  768.     }    
  769.     
  770.     // For now only with the "logged"-ones.
  771.     // Let the others do node restart afterwards...
  772.     c_start.m_starting = c_start.m_withLog;
  773.     c_start.m_withLog.clear();
  774.   }
  775.       
  776.   /**
  777.    * Okidoki, we try to start
  778.    */
  779.   CntrStartConf * conf = (CntrStartConf*)signal->getDataPtr();
  780.   conf->noStartNodes = c_start.m_starting.count();
  781.   conf->startType = srType;
  782.   conf->startGci = c_start.m_lastGci;
  783.   conf->masterNodeId = c_start.m_lastGciNodeId;
  784.   c_start.m_starting.copyto(NdbNodeBitmask::Size, conf->startingNodes);
  785.   c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
  786.   
  787.   ndbrequire(c_start.m_lastGciNodeId == getOwnNodeId());
  788.   
  789.   NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
  790.   sendSignal(rg, GSN_CNTR_START_CONF, signal, CntrStartConf::SignalLength,JBB);
  791.   
  792.   c_start.m_waiting.bitANDC(c_start.m_starting);
  793.   
  794.   return true;
  795. }
  796. void Ndbcntr::ph2GLab(Signal* signal) 
  797. {
  798.   if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
  799.     jam();
  800.     sendNdbSttor(signal);
  801.     return;
  802.   }//if
  803.   sendSttorry(signal);
  804.   return;
  805. }//Ndbcntr::ph2GLab()
  806. /*
  807. 4.4  START PHASE 3 */
  808. /*###########################################################################*/
  809. // SEND SIGNAL NDBSTTOR TO ALL BLOCKS, ACC, DICT, DIH, LQH, TC AND TUP
  810. // WHEN ALL BLOCKS HAVE RETURNED THEIR NDB_STTORRY ALL BLOCK HAVE FINISHED
  811. // THEIR LOCAL CONNECTIONs SUCESSFULLY
  812. // AND THEN WE CAN SEND APPL_STARTREG TO INFORM QMGR THAT WE ARE READY TO
  813. // SET UP DISTRIBUTED CONNECTIONS.
  814. /*--------------------------------------------------------------*/
  815. // THIS IS NDB START PHASE 3.
  816. /*--------------------------------------------------------------*/
  817. /*******************************/
  818. /*  STTOR                      */
  819. /*******************************/
  820. void Ndbcntr::startPhase3Lab(Signal* signal) 
  821. {
  822.   ph3ALab(signal);
  823.   return;
  824. }//Ndbcntr::startPhase3Lab()
  825. /*******************************/
  826. /*  NDB_STTORRY                */
  827. /*******************************/
  828. void Ndbcntr::ph3ALab(Signal* signal) 
  829. {
  830.   if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
  831.     jam();
  832.     sendNdbSttor(signal);
  833.     return;
  834.   }//if
  835.   sendSttorry(signal);
  836.   return;
  837. }//Ndbcntr::ph3ALab()
  838. /*
  839. 4.5  START PHASE 4      */
  840. /*###########################################################################*/
  841. // WAIT FOR ALL NODES IN CLUSTER TO CHANGE STATE INTO ZSTART ,
  842. // APPL_CHANGEREP IS ALWAYS SENT WHEN SOMEONE HAVE
  843. // CHANGED THEIR STATE. APPL_STARTCONF INDICATES THAT ALL NODES ARE IN START 
  844. // STATE SEND NDB_STARTREQ TO DIH AND THEN WAIT FOR NDB_STARTCONF
  845. /*---------------------------------------------------------------------------*/
  846. /*******************************/
  847. /*  STTOR                      */
  848. /*******************************/
  849. void Ndbcntr::startPhase4Lab(Signal* signal) 
  850. {
  851.   ph4ALab(signal);
  852. }//Ndbcntr::startPhase4Lab()
  853. void Ndbcntr::ph4ALab(Signal* signal) 
  854. {
  855.   ph4BLab(signal);
  856.   return;
  857. }//Ndbcntr::ph4ALab()
  858. /*******************************/
  859. /*  NDB_STTORRY                */
  860. /*******************************/
  861. void Ndbcntr::ph4BLab(Signal* signal) 
  862. {
  863. /*--------------------------------------*/
  864. /* CASE: CSTART_PHASE = ZSTART_PHASE_4  */
  865. /*--------------------------------------*/
  866.   if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
  867.     jam();
  868.     sendNdbSttor(signal);
  869.     return;
  870.   }//if
  871.   if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
  872.       (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
  873.     jam();
  874.     sendSttorry(signal);
  875.     return;
  876.   }//if
  877.   waitpoint41Lab(signal);
  878.   return;
  879. }//Ndbcntr::ph4BLab()
  880. void Ndbcntr::waitpoint41Lab(Signal* signal) 
  881. {
  882.   if (getOwnNodeId() == cmasterNodeId) {
  883.     jam();
  884. /*--------------------------------------*/
  885. /* MASTER WAITS UNTIL ALL SLAVES HAS    */
  886. /* SENT THE REPORTS                     */
  887. /*--------------------------------------*/
  888.     cnoWaitrep++;
  889.     if (cnoWaitrep == cnoStartNodes) {
  890.       jam();
  891.       cnoWaitrep = 0;
  892. /*---------------------------------------------------------------------------*/
  893. // NDB_STARTREQ STARTS UP ALL SET UP OF DISTRIBUTION INFORMATION IN DIH AND
  894. // DICT. AFTER SETTING UP THIS
  895. // DATA IT USES THAT DATA TO SET UP WHICH FRAGMENTS THAT ARE TO START AND
  896. // WHERE THEY ARE TO START. THEN
  897. // IT SETS UP THE FRAGMENTS AND RECOVERS THEM BY:
  898. //  1) READING A LOCAL CHECKPOINT FROM DISK.
  899. //  2) EXECUTING THE UNDO LOG ON INDEX AND DATA.
  900. //  3) EXECUTING THE FRAGMENT REDO LOG FROM ONE OR SEVERAL NODES TO
  901. //     RESTORE THE RESTART CONFIGURATION OF DATA IN NDB CLUSTER.
  902. /*---------------------------------------------------------------------------*/
  903.       signal->theData[0] = reference();
  904.       signal->theData[1] = ctypeOfStart;
  905.       sendSignal(DBDIH_REF, GSN_NDB_STARTREQ, signal, 2, JBB);
  906.     }//if
  907.   } else {
  908.     jam();
  909. /*--------------------------------------*/
  910. /* SLAVE NODES WILL PASS HERE ONCE AND  */
  911. /* SEND A WAITPOINT REPORT TO MASTER.   */
  912. /* SLAVES WONT DO ANYTHING UNTIL THEY   */
  913. /* RECEIVE A WAIT REPORT FROM THE MASTER*/
  914. /*--------------------------------------*/
  915.     signal->theData[0] = getOwnNodeId();
  916.     signal->theData[1] = ZWAITPOINT_4_1;
  917.     sendSignal(calcNdbCntrBlockRef(cmasterNodeId), 
  918.        GSN_CNTR_WAITREP, signal, 2, JBB);
  919.   }//if
  920.   return;
  921. }//Ndbcntr::waitpoint41Lab()
  922. /*******************************/
  923. /*  NDB_STARTCONF              */
  924. /*******************************/
  925. void Ndbcntr::execNDB_STARTCONF(Signal* signal) 
  926. {
  927.   jamEntry();
  928.   NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
  929.   signal->theData[0] = getOwnNodeId();
  930.   signal->theData[1] = ZWAITPOINT_4_2;
  931.   sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
  932.   return;
  933. }//Ndbcntr::execNDB_STARTCONF()
  934. /*
  935. 4.6  START PHASE 5      */
  936. /*###########################################################################*/
  937. // SEND APPL_RUN TO THE QMGR IN THIS BLOCK
  938. // SEND NDB_STTOR ALL BLOCKS ACC, DICT, DIH, LQH, TC AND TUP THEN WAIT FOR
  939. // THEIR NDB_STTORRY
  940. /*---------------------------------------------------------------------------*/
  941. /*******************************/
  942. /*  STTOR                      */
  943. /*******************************/
  944. void Ndbcntr::startPhase5Lab(Signal* signal) 
  945. {
  946.   ph5ALab(signal);
  947.   return;
  948. }//Ndbcntr::startPhase5Lab()
  949. /*******************************/
  950. /*  NDB_STTORRY                */
  951. /*******************************/
  952. /*---------------------------------------------------------------------------*/
  953. // THIS IS NDB START PHASE 5.
  954. /*---------------------------------------------------------------------------*/
  955. // IN THIS START PHASE TUP INITIALISES DISK FILES FOR DISK STORAGE IF INITIAL
  956. // START. DIH WILL START UP
  957. // THE GLOBAL CHECKPOINT PROTOCOL AND WILL CONCLUDE ANY UNFINISHED TAKE OVERS 
  958. // THAT STARTED BEFORE THE SYSTEM CRASH.
  959. /*---------------------------------------------------------------------------*/
  960. void Ndbcntr::ph5ALab(Signal* signal) 
  961. {
  962.   if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
  963.     jam();
  964.     sendNdbSttor(signal);
  965.     return;
  966.   }//if
  967.   cstartPhase = cstartPhase + 1;
  968.   cinternalStartphase = cstartPhase - 1;
  969.   if (getOwnNodeId() == cmasterNodeId) {
  970.     switch(ctypeOfStart){
  971.     case NodeState::ST_INITIAL_START:
  972.       jam();
  973.       /*--------------------------------------*/
  974.       /* MASTER CNTR IS RESPONSIBLE FOR       */
  975.       /* CREATING SYSTEM TABLES               */
  976.       /*--------------------------------------*/
  977.       createSystableLab(signal, 0);
  978.       return;
  979.     case NodeState::ST_SYSTEM_RESTART:
  980.       jam();
  981.       waitpoint52Lab(signal);
  982.       return;
  983.     case NodeState::ST_NODE_RESTART:
  984.     case NodeState::ST_INITIAL_NODE_RESTART:
  985.       jam();
  986.       break;
  987.     case NodeState::ST_ILLEGAL_TYPE:
  988.       jam();
  989.       break;
  990.     }
  991.     ndbrequire(false);
  992.   }
  993.   
  994.   /**
  995.    * Not master
  996.    */
  997.   NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
  998.   switch(ctypeOfStart){
  999.   case NodeState::ST_NODE_RESTART:
  1000.   case NodeState::ST_INITIAL_NODE_RESTART:
  1001.     jam();
  1002.     /*----------------------------------------------------------------------*/
  1003.     // SEND NDB START PHASE 5 IN NODE RESTARTS TO COPY DATA TO THE NEWLY
  1004.     // STARTED NODE.
  1005.     /*----------------------------------------------------------------------*/
  1006.     req->senderRef = reference();
  1007.     req->nodeId = getOwnNodeId();
  1008.     req->internalStartPhase = cinternalStartphase;
  1009.     req->typeOfStart = ctypeOfStart;
  1010.     req->masterNodeId = cmasterNodeId;
  1011.     
  1012.     //#define TRACE_STTOR
  1013. #ifdef TRACE_STTOR
  1014.     ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);
  1015. #endif
  1016.     sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal, 
  1017.        NdbSttor::SignalLength, JBB);
  1018.     return;
  1019.   case NodeState::ST_INITIAL_START:
  1020.   case NodeState::ST_SYSTEM_RESTART:
  1021.     jam();
  1022.     /*--------------------------------------*/
  1023.     /* DURING SYSTEMRESTART AND INITALSTART:*/
  1024.     /* SLAVE NODES WILL PASS HERE ONCE AND  */
  1025.     /* SEND A WAITPOINT REPORT TO MASTER.   */
  1026.     /* SLAVES WONT DO ANYTHING UNTIL THEY   */
  1027.     /* RECEIVE A WAIT REPORT FROM THE MASTER*/
  1028.     /* WHEN THE MASTER HAS FINISHED HIS WORK*/
  1029.     /*--------------------------------------*/
  1030.     signal->theData[0] = getOwnNodeId();
  1031.     signal->theData[1] = ZWAITPOINT_5_2;
  1032.     sendSignal(calcNdbCntrBlockRef(cmasterNodeId), 
  1033.        GSN_CNTR_WAITREP, signal, 2, JBB);
  1034.     return;
  1035.   default:
  1036.     ndbrequire(false);
  1037.   }
  1038. }//Ndbcntr::ph5ALab()
  1039. void Ndbcntr::waitpoint52Lab(Signal* signal) 
  1040. {
  1041.   cnoWaitrep = cnoWaitrep + 1;
  1042. /*---------------------------------------------------------------------------*/
  1043. // THIS WAITING POINT IS ONLY USED BY A MASTER NODE. WE WILL EXECUTE NDB START 
  1044. // PHASE 5 FOR DIH IN THE
  1045. // MASTER. THIS WILL START UP LOCAL CHECKPOINTS AND WILL ALSO CONCLUDE ANY
  1046. // UNFINISHED LOCAL CHECKPOINTS
  1047. // BEFORE THE SYSTEM CRASH. THIS WILL ENSURE THAT WE ALWAYS RESTART FROM A
  1048. // WELL KNOWN STATE.
  1049. /*---------------------------------------------------------------------------*/
  1050. /*--------------------------------------*/
  1051. /* MASTER WAITS UNTIL HE RECEIVED WAIT  */
  1052. /* REPORTS FROM ALL SLAVE CNTR          */
  1053. /*--------------------------------------*/
  1054.   if (cnoWaitrep == cnoStartNodes) {
  1055.     jam();
  1056.     cnoWaitrep = 0;
  1057.     NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
  1058.     req->senderRef = reference();
  1059.     req->nodeId = getOwnNodeId();
  1060.     req->internalStartPhase = cinternalStartphase;
  1061.     req->typeOfStart = ctypeOfStart;
  1062.     req->masterNodeId = cmasterNodeId;
  1063. #ifdef TRACE_STTOR
  1064.     ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);
  1065. #endif
  1066.     sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal, 
  1067.        NdbSttor::SignalLength, JBB);
  1068.   }//if
  1069.   return;
  1070. }//Ndbcntr::waitpoint52Lab()
  1071. /*******************************/
  1072. /*  NDB_STTORRY                */
  1073. /*******************************/
  1074. void Ndbcntr::ph6ALab(Signal* signal) 
  1075. {
  1076.   if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
  1077.       (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
  1078.     jam();
  1079.     waitpoint51Lab(signal);
  1080.     return;
  1081.   }//if
  1082.   NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
  1083.   rg.m_nodes.clear(getOwnNodeId());
  1084.   signal->theData[0] = getOwnNodeId();
  1085.   signal->theData[1] = ZWAITPOINT_5_1;
  1086.   sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
  1087.   waitpoint51Lab(signal);
  1088.   return;
  1089. }//Ndbcntr::ph6ALab()
  1090. void Ndbcntr::waitpoint51Lab(Signal* signal) 
  1091. {
  1092.   cstartPhase = cstartPhase + 1;
  1093. /*---------------------------------------------------------------------------*/
  1094. // A FINAL STEP IS NOW TO SEND NDB_STTOR TO TC. THIS MAKES IT POSSIBLE TO 
  1095. // CONNECT TO TC FOR APPLICATIONS.
  1096. // THIS IS NDB START PHASE 6 WHICH IS FOR ALL BLOCKS IN ALL NODES.
  1097. /*---------------------------------------------------------------------------*/
  1098.   cinternalStartphase = cstartPhase - 1;
  1099.   cndbBlocksCount = 0;
  1100.   ph6BLab(signal);
  1101.   return;
  1102. }//Ndbcntr::waitpoint51Lab()
  1103. void Ndbcntr::ph6BLab(Signal* signal) 
  1104. {
  1105.   // c_missra.currentStartPhase - cstartPhase - cinternalStartphase =
  1106.   // 5 - 7 - 6
  1107.   if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
  1108.     jam();
  1109.     sendNdbSttor(signal);
  1110.     return;
  1111.   }//if
  1112.   if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
  1113.       (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
  1114.     jam();
  1115.     sendSttorry(signal);
  1116.     return;
  1117.   }
  1118.   waitpoint61Lab(signal);
  1119. }
  1120. void Ndbcntr::waitpoint61Lab(Signal* signal)
  1121. {
  1122.   if (getOwnNodeId() == cmasterNodeId) {
  1123.     jam();
  1124.     cnoWaitrep6++;
  1125.     if (cnoWaitrep6 == cnoStartNodes) {
  1126.       jam();
  1127.       NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
  1128.       rg.m_nodes.clear(getOwnNodeId());
  1129.       signal->theData[0] = getOwnNodeId();
  1130.       signal->theData[1] = ZWAITPOINT_6_2;
  1131.       sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
  1132.       sendSttorry(signal);
  1133.     }
  1134.   } else {
  1135.     jam();
  1136.     signal->theData[0] = getOwnNodeId();
  1137.     signal->theData[1] = ZWAITPOINT_6_1;
  1138.     sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB);
  1139.   }
  1140. }
  1141. // Start phase 8 (internal 7)
  1142. void Ndbcntr::startPhase8Lab(Signal* signal)
  1143. {
  1144.   cinternalStartphase = cstartPhase - 1;
  1145.   cndbBlocksCount = 0;
  1146.   ph7ALab(signal);
  1147. }
  1148. void Ndbcntr::ph7ALab(Signal* signal)
  1149. {
  1150.   while (cndbBlocksCount < ZNO_NDB_BLOCKS) {
  1151.     jam();
  1152.     sendNdbSttor(signal);
  1153.     return;
  1154.   }
  1155.   if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
  1156.       (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
  1157.     jam();
  1158.     sendSttorry(signal);
  1159.     return;
  1160.   }
  1161.   waitpoint71Lab(signal);
  1162. }
  1163. void Ndbcntr::waitpoint71Lab(Signal* signal)
  1164. {
  1165.   if (getOwnNodeId() == cmasterNodeId) {
  1166.     jam();
  1167.     cnoWaitrep7++;
  1168.     if (cnoWaitrep7 == cnoStartNodes) {
  1169.       jam();
  1170.       NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
  1171.       rg.m_nodes.clear(getOwnNodeId());
  1172.       signal->theData[0] = getOwnNodeId();
  1173.       signal->theData[1] = ZWAITPOINT_7_2;
  1174.       sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
  1175.       sendSttorry(signal);
  1176.     }
  1177.   } else {
  1178.     jam();
  1179.     signal->theData[0] = getOwnNodeId();
  1180.     signal->theData[1] = ZWAITPOINT_7_1;
  1181.     sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB);
  1182.   }
  1183. }
  1184. // Start phase 9 (internal 8)
  1185. void Ndbcntr::startPhase9Lab(Signal* signal)
  1186. {
  1187.   cinternalStartphase = cstartPhase - 1;
  1188.   cndbBlocksCount = 0;
  1189.   ph8ALab(signal);
  1190. }
  1191. void Ndbcntr::ph8ALab(Signal* signal)
  1192. {
  1193. /*---------------------------------------------------------------------------*/
  1194. // NODES WHICH PERFORM A NODE RESTART NEEDS TO GET THE DYNAMIC ID'S
  1195. // OF THE OTHER NODES HERE.
  1196. /*---------------------------------------------------------------------------*/
  1197.   sendSttorry(signal);
  1198.   resetStartVariables(signal);
  1199.   return;
  1200. }//Ndbcntr::ph8BLab()
  1201. /*******************************/
  1202. /*  CNTR_WAITREP               */
  1203. /*******************************/
  1204. void Ndbcntr::execCNTR_WAITREP(Signal* signal) 
  1205. {
  1206.   Uint16 twaitPoint;
  1207.   jamEntry();
  1208.   twaitPoint = signal->theData[1];
  1209.   switch (twaitPoint) {
  1210.   case ZWAITPOINT_4_1:
  1211.     jam();
  1212.     waitpoint41Lab(signal);
  1213.     break;
  1214.   case ZWAITPOINT_4_2:
  1215.     jam();
  1216.     sendSttorry(signal);
  1217.     break;
  1218.   case ZWAITPOINT_5_1:
  1219.     jam();
  1220.     waitpoint51Lab(signal);
  1221.     break;
  1222.   case ZWAITPOINT_5_2:
  1223.     jam();
  1224.     waitpoint52Lab(signal);
  1225.     break;
  1226.   case ZWAITPOINT_6_1:
  1227.     jam();
  1228.     waitpoint61Lab(signal);
  1229.     break;
  1230.   case ZWAITPOINT_6_2:
  1231.     jam();
  1232.     sendSttorry(signal);
  1233.     break;
  1234.   case ZWAITPOINT_7_1:
  1235.     jam();
  1236.     waitpoint71Lab(signal);
  1237.     break;
  1238.   case ZWAITPOINT_7_2:
  1239.     jam();
  1240.     sendSttorry(signal);
  1241.     break;
  1242.   default:
  1243.     jam();
  1244.     systemErrorLab(signal);
  1245.     break;
  1246.   }//switch
  1247. }//Ndbcntr::execCNTR_WAITREP()
  1248. /*******************************/
  1249. /*  NODE_FAILREP               */
  1250. /*******************************/
  1251. void Ndbcntr::execNODE_FAILREP(Signal* signal) 
  1252. {
  1253.   jamEntry();
  1254.   const NodeFailRep * nodeFail = (NodeFailRep *)&signal->theData[0];
  1255.   NdbNodeBitmask allFailed; 
  1256.   allFailed.assign(NdbNodeBitmask::Size, nodeFail->theNodes);
  1257.   NdbNodeBitmask failedStarted = c_startedNodes;
  1258.   NdbNodeBitmask failedStarting = c_start.m_starting;
  1259.   NdbNodeBitmask failedWaiting = c_start.m_waiting;
  1260.   failedStarted.bitAND(allFailed);
  1261.   failedStarting.bitAND(allFailed);
  1262.   failedWaiting.bitAND(allFailed);
  1263.   
  1264.   const bool tMasterFailed = allFailed.get(cmasterNodeId);
  1265.   const bool tStarted = !failedStarted.isclear();
  1266.   const bool tStarting = !failedStarting.isclear();
  1267.   const bool tWaiting = !failedWaiting.isclear();
  1268.   if(tMasterFailed){
  1269.     jam();
  1270.     /**
  1271.      * If master has failed choose qmgr president as master
  1272.      */
  1273.     cmasterNodeId = nodeFail->masterNodeId;
  1274.   }
  1275.   
  1276.   /**
  1277.    * Clear node bitmasks from failed nodes
  1278.    */
  1279.   c_start.m_starting.bitANDC(allFailed);
  1280.   c_start.m_waiting.bitANDC(allFailed);
  1281.   c_start.m_withLog.bitANDC(allFailed);
  1282.   c_start.m_withoutLog.bitANDC(allFailed);
  1283.   c_clusterNodes.bitANDC(allFailed);
  1284.   c_startedNodes.bitANDC(allFailed);
  1285.   const NodeState & st = getNodeState();
  1286.   if(st.startLevel == st.SL_STARTING){
  1287.     jam();
  1288.     const Uint32 phase = st.starting.startPhase;
  1289.     
  1290.     const bool tStartConf = (phase > 2) || (phase == 2 && cndbBlocksCount > 0);
  1291.     if(tMasterFailed){
  1292.       progError(__LINE__,
  1293. ERR_SR_OTHERNODEFAILED,
  1294. "Unhandled node failure during restart");
  1295.     }
  1296.     
  1297.     if(tStartConf && tStarting){
  1298.       // One of other starting nodes has crashed...
  1299.       progError(__LINE__,
  1300. ERR_SR_OTHERNODEFAILED,
  1301. "Unhandled node failure of starting node during restart");
  1302.     }
  1303.     if(tStartConf && tStarted){
  1304.       // One of other started nodes has crashed...      
  1305.       progError(__LINE__,
  1306. ERR_SR_OTHERNODEFAILED,
  1307. "Unhandled node failure of started node during restart");
  1308.     }
  1309.     
  1310.     Uint32 nodeId = 0;
  1311.     while(!allFailed.isclear()){
  1312.       nodeId = allFailed.find(nodeId + 1);
  1313.       allFailed.clear(nodeId);
  1314.       signal->theData[0] = nodeId;
  1315.       sendSignal(QMGR_REF, GSN_NDB_FAILCONF, signal, 1, JBB);
  1316.     }//for
  1317.     
  1318.     return;
  1319.   }
  1320.   
  1321.   ndbrequire(!allFailed.get(getOwnNodeId()));
  1322.   NodeFailRep * rep = (NodeFailRep *)&signal->theData[0];  
  1323.   rep->masterNodeId = cmasterNodeId;
  1324.   sendSignal(DBTC_REF, GSN_NODE_FAILREP, signal, 
  1325.      NodeFailRep::SignalLength, JBB);
  1326.   
  1327.   sendSignal(DBLQH_REF, GSN_NODE_FAILREP, signal, 
  1328.      NodeFailRep::SignalLength, JBB);
  1329.   
  1330.   sendSignal(DBDIH_REF, GSN_NODE_FAILREP, signal, 
  1331.      NodeFailRep::SignalLength, JBB);
  1332.   
  1333.   sendSignal(DBDICT_REF, GSN_NODE_FAILREP, signal, 
  1334.      NodeFailRep::SignalLength, JBB);
  1335.   
  1336.   sendSignal(BACKUP_REF, GSN_NODE_FAILREP, signal,
  1337.      NodeFailRep::SignalLength, JBB);
  1338.   sendSignal(SUMA_REF, GSN_NODE_FAILREP, signal,
  1339.      NodeFailRep::SignalLength, JBB);
  1340.   Uint32 nodeId = 0;
  1341.   while(!allFailed.isclear()){
  1342.     nodeId = allFailed.find(nodeId + 1);
  1343.     allFailed.clear(nodeId);
  1344.     signal->theData[0] = EventReport::NODE_FAILREP;
  1345.     signal->theData[1] = nodeId;
  1346.     signal->theData[2] = 0;
  1347.     sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
  1348.   }//for
  1349.   return;
  1350. }//Ndbcntr::execNODE_FAILREP()
  1351. /*******************************/
  1352. /*  READ_NODESREQ              */
  1353. /*******************************/
  1354. void Ndbcntr::execREAD_NODESREQ(Signal* signal) 
  1355. {
  1356.   jamEntry();
  1357.   /*----------------------------------------------------------------------*/
  1358.   // ANY BLOCK MAY SEND A REQUEST ABOUT NDB NODES AND VERSIONS IN THE
  1359.   // SYSTEM. THIS REQUEST CAN ONLY BE HANDLED IN
  1360.   // ABSOLUTE STARTPHASE 3 OR LATER
  1361.   /*----------------------------------------------------------------------*/
  1362.   BlockReference TuserBlockref = signal->theData[0];
  1363.   ReadNodesConf * const readNodes = (ReadNodesConf *)&signal->theData[0];
  1364.   
  1365.   /**
  1366.    * Prepare inactiveNodes bitmask.
  1367.    * The concept as such is by the way pretty useless.
  1368.    * It makes parallell starts more or less impossible...
  1369.    */
  1370.   NdbNodeBitmask tmp1; 
  1371.   tmp1.bitOR(c_startedNodes);
  1372.   if(!getNodeState().getNodeRestartInProgress()){
  1373.     tmp1.bitOR(c_start.m_starting);
  1374.   } else {
  1375.     tmp1.set(getOwnNodeId());
  1376.   }
  1377.   NdbNodeBitmask tmp2;
  1378.   tmp2.bitOR(c_allDefinedNodes);
  1379.   tmp2.bitANDC(tmp1);
  1380.   /**
  1381.    * Fill in return signal
  1382.    */
  1383.   tmp2.copyto(NdbNodeBitmask::Size, readNodes->inactiveNodes);
  1384.   c_allDefinedNodes.copyto(NdbNodeBitmask::Size, readNodes->allNodes);
  1385.   c_clusterNodes.copyto(NdbNodeBitmask::Size, readNodes->clusterNodes);
  1386.   c_startedNodes.copyto(NdbNodeBitmask::Size, readNodes->startedNodes);
  1387.   c_start.m_starting.copyto(NdbNodeBitmask::Size, readNodes->startingNodes);
  1388.   readNodes->noOfNodes = c_allDefinedNodes.count();
  1389.   readNodes->masterNodeId = cmasterNodeId;
  1390.   readNodes->ndynamicId = cdynamicNodeId;
  1391.   if (cstartPhase > ZSTART_PHASE_2) {
  1392.     jam();
  1393.     sendSignal(TuserBlockref, GSN_READ_NODESCONF, signal, 
  1394.        ReadNodesConf::SignalLength, JBB);
  1395.     
  1396.   } else {
  1397.     jam();
  1398.     signal->theData[0] = ZNOT_AVAILABLE;
  1399.     sendSignal(TuserBlockref, GSN_READ_NODESREF, signal, 1, JBB);
  1400.   }//if
  1401. }//Ndbcntr::execREAD_NODESREQ()
  1402. /*----------------------------------------------------------------------*/
  1403. // SENDS APPL_ERROR TO QMGR AND THEN SET A POINTER OUT OF BOUNDS
  1404. /*----------------------------------------------------------------------*/
  1405. void Ndbcntr::systemErrorLab(Signal* signal) 
  1406. {
  1407.   progError(0, 0); /* BUG INSERTION */
  1408.   return;
  1409. }//Ndbcntr::systemErrorLab()
  1410. /*###########################################################################*/
  1411. /* CNTR MASTER CREATES AND INITIALIZES A SYSTEMTABLE AT INITIALSTART         */
  1412. /*       |-2048| # 1 00000001    |                                           */
  1413. /*       |  :  |   :             |                                           */
  1414. /*       | -1  | # 1 00000001    |                                           */
  1415. /*       |  0  |   0             |                                           */
  1416. /*       |  1  |   0             |                                           */
  1417. /*       |  :  |   :             |                                           */
  1418. /*       | 2047|   0             |                                           */
  1419. /*---------------------------------------------------------------------------*/
  1420. void Ndbcntr::createSystableLab(Signal* signal, unsigned index)
  1421. {
  1422.   if (index >= g_sysTableCount) {
  1423.     ndbassert(index == g_sysTableCount);
  1424.     startInsertTransactions(signal);
  1425.     return;
  1426.   }
  1427.   const SysTable& table = *g_sysTableList[index];
  1428.   Uint32 propPage[256];
  1429.   LinearWriter w(propPage, 256);
  1430.   // XXX remove commented-out lines later
  1431.   w.first();
  1432.   w.add(DictTabInfo::TableName, table.name);
  1433.   w.add(DictTabInfo::TableLoggedFlag, table.tableLoggedFlag);
  1434.   //w.add(DictTabInfo::TableKValue, 6);
  1435.   //w.add(DictTabInfo::MinLoadFactor, 70);
  1436.   //w.add(DictTabInfo::MaxLoadFactor, 80);
  1437.   w.add(DictTabInfo::FragmentTypeVal, (Uint32)table.fragmentType);
  1438.   //w.add(DictTabInfo::TableStorageVal, (Uint32)DictTabInfo::MainMemory);
  1439.   //w.add(DictTabInfo::NoOfKeyAttr, 1);
  1440.   w.add(DictTabInfo::NoOfAttributes, (Uint32)table.columnCount);
  1441.   //w.add(DictTabInfo::NoOfNullable, (Uint32)0);
  1442.   //w.add(DictTabInfo::NoOfVariable, (Uint32)0);
  1443.   //w.add(DictTabInfo::KeyLength, 1);
  1444.   w.add(DictTabInfo::TableTypeVal, (Uint32)table.tableType);
  1445.   for (unsigned i = 0; i < table.columnCount; i++) {
  1446.     const SysColumn& column = table.columnList[i];
  1447.     ndbassert(column.pos == i);
  1448.     w.add(DictTabInfo::AttributeName, column.name);
  1449.     w.add(DictTabInfo::AttributeId, (Uint32)column.pos);
  1450.     //w.add(DictTabInfo::AttributeType, DictTabInfo::UnSignedType);
  1451.     //w.add(DictTabInfo::AttributeSize, DictTabInfo::a32Bit);
  1452.     //w.add(DictTabInfo::AttributeArraySize, 1);
  1453.     w.add(DictTabInfo::AttributeKeyFlag, (Uint32)column.keyFlag);
  1454.     //w.add(DictTabInfo::AttributeStorage, (Uint32)DictTabInfo::MainMemory);
  1455.     w.add(DictTabInfo::AttributeNullableFlag, (Uint32)column.nullable);
  1456.     // ext type overrides
  1457.     w.add(DictTabInfo::AttributeExtType, (Uint32)column.type);
  1458.     w.add(DictTabInfo::AttributeExtLength, (Uint32)column.length);
  1459.     w.add(DictTabInfo::AttributeEnd, (Uint32)true);
  1460.   }
  1461.   w.add(DictTabInfo::TableEnd, (Uint32)true);
  1462.   
  1463.   Uint32 length = w.getWordsUsed();
  1464.   LinearSectionPtr ptr[3];
  1465.   ptr[0].p = &propPage[0];
  1466.   ptr[0].sz = length;
  1467.   CreateTableReq* const req = (CreateTableReq*)signal->getDataPtrSend();
  1468.   req->senderData = index;
  1469.   req->senderRef = reference();
  1470.   sendSignal(DBDICT_REF, GSN_CREATE_TABLE_REQ, signal,
  1471.      CreateTableReq::SignalLength, JBB, ptr, 1);
  1472.   return;
  1473. }//Ndbcntr::createSystableLab()
  1474. void Ndbcntr::execCREATE_TABLE_REF(Signal* signal) 
  1475. {
  1476.   jamEntry();
  1477.   progError(0,0);
  1478.   return;
  1479. }//Ndbcntr::execDICTTABREF()
  1480. void Ndbcntr::execCREATE_TABLE_CONF(Signal* signal) 
  1481. {
  1482.   jamEntry();
  1483.   CreateTableConf * const conf = (CreateTableConf*)signal->getDataPtrSend();
  1484.   //csystabId = conf->tableId;
  1485.   ndbrequire(conf->senderData < g_sysTableCount);
  1486.   const SysTable& table = *g_sysTableList[conf->senderData];
  1487.   table.tableId = conf->tableId;
  1488.   createSystableLab(signal, conf->senderData + 1);
  1489.   //startInsertTransactions(signal);
  1490.   return;
  1491. }//Ndbcntr::execDICTTABCONF()
  1492. /*******************************/
  1493. /*  DICTRELEASECONF            */
  1494. /*******************************/
  1495. void Ndbcntr::startInsertTransactions(Signal* signal) 
  1496. {
  1497.   jamEntry();
  1498.   ckey = 1;
  1499.   ctransidPhase = ZTRUE;
  1500.   signal->theData[0] = 0;
  1501.   signal->theData[1] = reference();
  1502.   sendSignal(DBTC_REF, GSN_TCSEIZEREQ, signal, 2, JBB);
  1503.   return;
  1504. }//Ndbcntr::startInsertTransactions()
  1505. /*******************************/
  1506. /*  TCSEIZECONF                */
  1507. /*******************************/
  1508. void Ndbcntr::execTCSEIZECONF(Signal* signal) 
  1509. {
  1510.   jamEntry();
  1511.   ctcConnectionP = signal->theData[1];
  1512.   crSystab7Lab(signal);
  1513.   return;
  1514. }//Ndbcntr::execTCSEIZECONF()
  1515. const unsigned int RowsPerCommit = 16;
  1516. void Ndbcntr::crSystab7Lab(Signal* signal) 
  1517. {
  1518.   UintR tkey;
  1519.   UintR Tmp;
  1520.   
  1521.   TcKeyReq * const tcKeyReq = (TcKeyReq *)&signal->theData[0];
  1522.   
  1523.   UintR reqInfo_Start = 0;
  1524.   tcKeyReq->setOperationType(reqInfo_Start, ZINSERT); // Insert
  1525.   tcKeyReq->setKeyLength    (reqInfo_Start, 1);
  1526.   tcKeyReq->setAIInTcKeyReq (reqInfo_Start, 5);
  1527.   tcKeyReq->setAbortOption  (reqInfo_Start, TcKeyReq::AbortOnError);
  1528. /* KEY LENGTH = 1, ATTRINFO LENGTH IN TCKEYREQ = 5 */
  1529.   cresponses = 0;
  1530.   const UintR guard0 = ckey + (RowsPerCommit - 1);
  1531.   for (Tmp = ckey; Tmp <= guard0; Tmp++) {
  1532.     UintR reqInfo = reqInfo_Start;
  1533.     if (Tmp == ckey) { // First iteration, Set start flag
  1534.       jam();
  1535.       tcKeyReq->setStartFlag(reqInfo, 1);
  1536.     } //if
  1537.     if (Tmp == guard0) { // Last iteration, Set commit flag
  1538.       jam();
  1539.       tcKeyReq->setCommitFlag(reqInfo, 1);      
  1540.       tcKeyReq->setExecuteFlag(reqInfo, 1);
  1541.     } //if
  1542.     if (ctransidPhase == ZTRUE) {
  1543.       jam();
  1544.       tkey = 0;
  1545.       tkey = tkey - Tmp;
  1546.     } else {
  1547.       jam();
  1548.       tkey = Tmp;
  1549.     }//if
  1550.     tcKeyReq->apiConnectPtr      = ctcConnectionP;
  1551.     tcKeyReq->attrLen            = 5;
  1552.     tcKeyReq->tableId            = g_sysTable_SYSTAB_0.tableId;
  1553.     tcKeyReq->requestInfo        = reqInfo;
  1554.     tcKeyReq->tableSchemaVersion = ZSYSTAB_VERSION;
  1555.     tcKeyReq->transId1           = 0;
  1556.     tcKeyReq->transId2           = ckey;
  1557. //-------------------------------------------------------------
  1558. // There is no optional part in this TCKEYREQ. There is one
  1559. // key word and five ATTRINFO words.
  1560. //-------------------------------------------------------------
  1561.     Uint32* tKeyDataPtr          = &tcKeyReq->scanInfo;
  1562.     Uint32* tAIDataPtr           = &tKeyDataPtr[1];
  1563.     tKeyDataPtr[0]               = tkey;
  1564.     AttributeHeader::init(&tAIDataPtr[0], 0, 1);
  1565.     tAIDataPtr[1]                = tkey;
  1566.     AttributeHeader::init(&tAIDataPtr[2], 1, 2);
  1567.     tAIDataPtr[3]                = (tkey << 16);
  1568.     tAIDataPtr[4]                = 1;    
  1569.     sendSignal(DBTC_REF, GSN_TCKEYREQ, signal, 
  1570.        TcKeyReq::StaticLength + 6, JBB);
  1571.   }//for
  1572.   ckey = ckey + RowsPerCommit;
  1573.   return;
  1574. }//Ndbcntr::crSystab7Lab()
  1575. /*******************************/
  1576. /*  TCKEYCONF09                */
  1577. /*******************************/
  1578. void Ndbcntr::execTCKEYCONF(Signal* signal) 
  1579. {
  1580.   const TcKeyConf * const keyConf = (TcKeyConf *)&signal->theData[0];
  1581.   
  1582.   jamEntry();
  1583.   cgciSystab = keyConf->gci;
  1584.   UintR confInfo = keyConf->confInfo;
  1585.   
  1586.   if (TcKeyConf::getMarkerFlag(confInfo)){
  1587.     Uint32 transId1 = keyConf->transId1;
  1588.     Uint32 transId2 = keyConf->transId2;
  1589.     signal->theData[0] = transId1;
  1590.     signal->theData[1] = transId2;
  1591.     sendSignal(DBTC_REF, GSN_TC_COMMIT_ACK, signal, 2, JBB);    
  1592.   }//if
  1593.   
  1594.   cresponses = cresponses + TcKeyConf::getNoOfOperations(confInfo);
  1595.   if (TcKeyConf::getCommitFlag(confInfo)){
  1596.     jam();
  1597.     ndbrequire(cresponses == RowsPerCommit);
  1598.     crSystab8Lab(signal);
  1599.     return;
  1600.   }
  1601.   return;
  1602. }//Ndbcntr::tckeyConfLab()
  1603. void Ndbcntr::crSystab8Lab(Signal* signal) 
  1604. {
  1605.   if (ckey < ZSIZE_SYSTAB) {
  1606.     jam();
  1607.     crSystab7Lab(signal);
  1608.     return;
  1609.   } else if (ctransidPhase == ZTRUE) {
  1610.     jam();
  1611.     ckey = 1;
  1612.     ctransidPhase = ZFALSE;
  1613.     crSystab7Lab(signal);
  1614.     return;
  1615.   }//if
  1616.   signal->theData[0] = ctcConnectionP;
  1617.   signal->theData[1] = reference();
  1618.   signal->theData[2] = 0;
  1619.   sendSignal(DBTC_REF, GSN_TCRELEASEREQ, signal, 2, JBB);
  1620.   return;
  1621. }//Ndbcntr::crSystab8Lab()
  1622. /*******************************/
  1623. /*  TCRELEASECONF              */
  1624. /*******************************/
  1625. void Ndbcntr::execTCRELEASECONF(Signal* signal) 
  1626. {
  1627.   jamEntry();
  1628.   waitpoint52Lab(signal);
  1629.   return;
  1630. }//Ndbcntr::execTCRELEASECONF()
  1631. void Ndbcntr::crSystab9Lab(Signal* signal) 
  1632. {
  1633.   signal->theData[1] = reference();
  1634.   sendSignalWithDelay(DBDIH_REF, GSN_GETGCIREQ, signal, 100, 2);
  1635.   return;
  1636. }//Ndbcntr::crSystab9Lab()
  1637. /*******************************/
  1638. /*  GETGCICONF                 */
  1639. /*******************************/
  1640. void Ndbcntr::execGETGCICONF(Signal* signal) 
  1641. {
  1642.   jamEntry();
  1643. #ifndef NO_GCP
  1644.   if (signal->theData[1] < cgciSystab) {
  1645.     jam();
  1646. /*--------------------------------------*/
  1647. /* MAKE SURE THAT THE SYSTABLE IS       */
  1648. /* NOW SAFE ON DISK                     */
  1649. /*--------------------------------------*/
  1650.     crSystab9Lab(signal);
  1651.     return;
  1652.   }//if
  1653. #endif
  1654.   waitpoint52Lab(signal);
  1655.   return;
  1656. }//Ndbcntr::execGETGCICONF()
  1657. void Ndbcntr::execTCKEYREF(Signal* signal) 
  1658. {
  1659.   jamEntry();
  1660.   systemErrorLab(signal);
  1661.   return;
  1662. }//Ndbcntr::execTCKEYREF()
  1663. void Ndbcntr::execTCROLLBACKREP(Signal* signal) 
  1664. {
  1665.   jamEntry();
  1666.   systemErrorLab(signal);
  1667.   return;
  1668. }//Ndbcntr::execTCROLLBACKREP()
  1669. void Ndbcntr::execTCRELEASEREF(Signal* signal) 
  1670. {
  1671.   jamEntry();
  1672.   systemErrorLab(signal);
  1673.   return;
  1674. }//Ndbcntr::execTCRELEASEREF()
  1675. void Ndbcntr::execTCSEIZEREF(Signal* signal) 
  1676. {
  1677.   jamEntry();
  1678.   systemErrorLab(signal);
  1679.   return;
  1680. }//Ndbcntr::execTCSEIZEREF()
  1681. /*---------------------------------------------------------------------------*/
  1682. /*INITIALIZE VARIABLES AND RECORDS                                           */
  1683. /*---------------------------------------------------------------------------*/
  1684. void Ndbcntr::initData(Signal* signal) 
  1685. {
  1686.   c_start.reset();
  1687.   cmasterNodeId = 0;
  1688.   cnoStartNodes = 0;
  1689.   cnoWaitrep = 0;
  1690. }//Ndbcntr::initData()
  1691. /*---------------------------------------------------------------------------*/
  1692. /*RESET VARIABLES USED DURING THE START                                      */
  1693. /*---------------------------------------------------------------------------*/
  1694. void Ndbcntr::resetStartVariables(Signal* signal) 
  1695. {
  1696.   cnoStartNodes = 0;
  1697.   cnoWaitrep6 = cnoWaitrep7 = 0;
  1698. }//Ndbcntr::resetStartVariables()
  1699. /*---------------------------------------------------------------------------*/
  1700. // SEND THE SIGNAL
  1701. // INPUT                  CNDB_BLOCKS_COUNT
  1702. /*---------------------------------------------------------------------------*/
  1703. void Ndbcntr::sendNdbSttor(Signal* signal) 
  1704. {
  1705.   NdbBlocksRecPtr ndbBlocksPtr;
  1706.   ndbBlocksPtr.i = cndbBlocksCount;
  1707.   ptrCheckGuard(ndbBlocksPtr, ZSIZE_NDB_BLOCKS_REC, ndbBlocksRec);
  1708.   NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
  1709.   req->senderRef = reference();
  1710.   req->nodeId = getOwnNodeId();
  1711.   req->internalStartPhase = cinternalStartphase;
  1712.   req->typeOfStart = ctypeOfStart;
  1713.   req->masterNodeId = cmasterNodeId;
  1714.   
  1715.   for (int i = 0; i < 16; i++) {
  1716.     // Garbage
  1717.     req->config[i] = 0x88776655;
  1718.     //cfgBlockPtr.p->cfgData[i];
  1719.   }
  1720.   
  1721.   //#define MAX_STARTPHASE 2
  1722. #ifdef TRACE_STTOR
  1723.   ndbout_c("sending NDB_STTOR(%d) to %s",
  1724.    cinternalStartphase, 
  1725.    getBlockName( refToBlock(ndbBlocksPtr.p->blockref)));
  1726. #endif
  1727.   sendSignal(ndbBlocksPtr.p->blockref, GSN_NDB_STTOR, signal, 22, JBB);
  1728.   cndbBlocksCount++;
  1729. }//Ndbcntr::sendNdbSttor()
  1730. /*---------------------------------------------------------------------------*/
  1731. // JUST SEND THE SIGNAL
  1732. /*---------------------------------------------------------------------------*/
  1733. void Ndbcntr::sendSttorry(Signal* signal) 
  1734. {
  1735.   signal->theData[3] = ZSTART_PHASE_1;
  1736.   signal->theData[4] = ZSTART_PHASE_2;
  1737.   signal->theData[5] = ZSTART_PHASE_3;
  1738.   signal->theData[6] = ZSTART_PHASE_4;
  1739.   signal->theData[7] = ZSTART_PHASE_5;
  1740.   signal->theData[8] = ZSTART_PHASE_6;
  1741.   // skip simulated phase 7
  1742.   signal->theData[9] = ZSTART_PHASE_8;
  1743.   signal->theData[10] = ZSTART_PHASE_9;
  1744.   signal->theData[11] = ZSTART_PHASE_END;
  1745.   sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 12, JBB);
  1746. }//Ndbcntr::sendSttorry()
  1747. void
  1748. Ndbcntr::execDUMP_STATE_ORD(Signal* signal)
  1749. {
  1750.   DumpStateOrd * const & dumpState = (DumpStateOrd *)&signal->theData[0];
  1751.   if(signal->theData[0] == 13){
  1752.     infoEvent("Cntr: cstartPhase = %d, cinternalStartphase = %d, block = %d", 
  1753.       cstartPhase, cinternalStartphase, cndbBlocksCount);
  1754.     infoEvent("Cntr: cmasterNodeId = %d", cmasterNodeId);
  1755.   }
  1756.   if (dumpState->args[0] == DumpStateOrd::NdbcntrTestStopOnError){
  1757.     if (theConfiguration.stopOnError() == true)
  1758.       ((Configuration&)theConfiguration).stopOnError(false);
  1759.     
  1760.     const BlockReference tblockref = calcNdbCntrBlockRef(getOwnNodeId());
  1761.       
  1762.     SystemError * const sysErr = (SystemError*)&signal->theData[0];
  1763.     sysErr->errorCode = SystemError::TestStopOnError;
  1764.     sysErr->errorRef = reference();
  1765.     sendSignal(tblockref, GSN_SYSTEM_ERROR, signal, 
  1766.        SystemError::SignalLength, JBA);
  1767.   }
  1768. }//Ndbcntr::execDUMP_STATE_ORD()
  1769. void Ndbcntr::execSET_VAR_REQ(Signal* signal) {
  1770. #if 0
  1771.   SetVarReq* const setVarReq = (SetVarReq*)&signal->theData[0];
  1772.   ConfigParamId var = setVarReq->variable();
  1773.   switch (var) {
  1774.   case TimeToWaitAlive:
  1775.     // Valid only during start so value not set.
  1776.     sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB);
  1777.     break;
  1778.   default:
  1779.     sendSignal(CMVMI_REF, GSN_SET_VAR_REF, signal, 1, JBB);
  1780.   }// switch
  1781. #endif
  1782. }//Ndbcntr::execSET_VAR_REQ()
  1783. void Ndbcntr::updateNodeState(Signal* signal, const NodeState& newState) const{
  1784.   NodeStateRep * const stateRep = (NodeStateRep *)&signal->theData[0];
  1785.   stateRep->nodeState = newState;
  1786.   stateRep->nodeState.masterNodeId = cmasterNodeId;
  1787.   stateRep->nodeState.setNodeGroup(c_nodeGroup);
  1788.   
  1789.   for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
  1790.     sendSignal(ALL_BLOCKS[i].Ref, GSN_NODE_STATE_REP, signal,
  1791.        NodeStateRep::SignalLength, JBB);
  1792.   }
  1793. }
  1794. void
  1795. Ndbcntr::execRESUME_REQ(Signal* signal){
  1796.   //ResumeReq * const req = (ResumeReq *)&signal->theData[0];
  1797.   //ResumeRef * const ref = (ResumeRef *)&signal->theData[0];
  1798.   
  1799.   jamEntry();
  1800.   signal->theData[0] = EventReport::SingleUser;
  1801.   signal->theData[1] = 2;
  1802.   sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
  1803.   //Uint32 senderData = req->senderData;
  1804.   //BlockReference senderRef = req->senderRef;
  1805.   NodeState newState(NodeState::SL_STARTED);   
  1806.   updateNodeState(signal, newState);
  1807.   c_stopRec.stopReq.senderRef=0;
  1808. }
  1809. void
  1810. Ndbcntr::execSTOP_REQ(Signal* signal){
  1811.   StopReq * const req = (StopReq *)&signal->theData[0];
  1812.   StopRef * const ref = (StopRef *)&signal->theData[0];
  1813.   Uint32 singleuser  = req->singleuser;
  1814.   jamEntry();
  1815.   Uint32 senderData = req->senderData;
  1816.   BlockReference senderRef = req->senderRef;
  1817.   bool abort = StopReq::getStopAbort(req->requestInfo);
  1818.   if(getNodeState().startLevel < NodeState::SL_STARTED || 
  1819.      abort && !singleuser){
  1820.     /**
  1821.      * Node is not started yet
  1822.      *
  1823.      * So stop it quickly
  1824.      */
  1825.     jam();
  1826.     const Uint32 reqInfo = req->requestInfo;
  1827.     if(StopReq::getPerformRestart(reqInfo)){
  1828.       jam();
  1829.       StartOrd * startOrd = (StartOrd *)&signal->theData[0];
  1830.       startOrd->restartInfo = reqInfo;
  1831.       sendSignal(CMVMI_REF, GSN_START_ORD, signal, 1, JBA);
  1832.     } else {
  1833.       jam();
  1834.       sendSignal(CMVMI_REF, GSN_STOP_ORD, signal, 1, JBA);
  1835.     }
  1836.     return;
  1837.   }
  1838.   if(c_stopRec.stopReq.senderRef != 0){
  1839.     /**
  1840.      * Requested a system shutdown
  1841.      */
  1842.     if(!singleuser && StopReq::getSystemStop(req->requestInfo)){
  1843.       jam();
  1844.       sendSignalWithDelay(reference(), GSN_STOP_REQ, signal, 100,
  1845.   StopReq::SignalLength);
  1846.       return;
  1847.     }
  1848.     /**
  1849.      * Requested a node shutdown
  1850.      */
  1851.     if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo))
  1852.       ref->errorCode = StopRef::SystemShutdownInProgress;
  1853.     else
  1854.       ref->errorCode = StopRef::NodeShutdownInProgress;
  1855.     ref->senderData = senderData;
  1856.     sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
  1857.     return;
  1858.   }
  1859.   
  1860.   c_stopRec.stopReq = * req;
  1861.   c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
  1862.   
  1863.   if(!singleuser) {
  1864.     if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo)) {
  1865.       jam();
  1866.       if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){
  1867. ((Configuration&)theConfiguration).stopOnError(false);
  1868.       }
  1869.     }
  1870.     if(!c_stopRec.checkNodeFail(signal)){
  1871.       jam();
  1872.       return;
  1873.     }
  1874.     signal->theData[0] = EventReport::NDBStopStarted;
  1875.     signal->theData[1] = StopReq::getSystemStop(c_stopRec.stopReq.requestInfo) ? 1 : 0;
  1876.     sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
  1877.   }
  1878.   else
  1879.   {
  1880.     signal->theData[0] = EventReport::SingleUser;
  1881.     signal->theData[1] = 0;
  1882.     sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
  1883.   }
  1884.   NodeState newState(NodeState::SL_STOPPING_1, 
  1885.      StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
  1886.   
  1887.    if(singleuser) {
  1888.      newState.setSingleUser(true);
  1889.      newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
  1890.    }
  1891.   updateNodeState(signal, newState);
  1892.   signal->theData[0] = ZSHUTDOWN;
  1893.   sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
  1894. }
  1895. void
  1896. Ndbcntr::StopRecord::checkTimeout(Signal* signal){
  1897.   jamEntry();
  1898.   if(!cntr.getNodeState().getSingleUserMode())
  1899.     if(!checkNodeFail(signal)){
  1900.       jam();
  1901.       return;
  1902.     }
  1903.   switch(cntr.getNodeState().startLevel){
  1904.   case NodeState::SL_STOPPING_1:
  1905.     checkApiTimeout(signal);
  1906.     break;
  1907.   case NodeState::SL_STOPPING_2:
  1908.     checkTcTimeout(signal);
  1909.     break;
  1910.   case NodeState::SL_STOPPING_3:
  1911.     checkLqhTimeout_1(signal);
  1912.     break;
  1913.   case NodeState::SL_STOPPING_4:
  1914.     checkLqhTimeout_2(signal);
  1915.     break;
  1916.   case NodeState::SL_SINGLEUSER:
  1917.     break;
  1918.   default:
  1919.     ndbrequire(false);
  1920.   }
  1921. }
  1922. bool
  1923. Ndbcntr::StopRecord::checkNodeFail(Signal* signal){
  1924.   jam();
  1925.   if(StopReq::getSystemStop(stopReq.requestInfo)){
  1926.     jam();
  1927.     return true;
  1928.   }
  1929.   /**
  1930.    * Check if I can survive me stopping
  1931.    */
  1932.   NodeBitmask ndbMask; 
  1933.   ndbMask.assign(cntr.c_startedNodes);
  1934.   ndbMask.clear(cntr.getOwnNodeId());
  1935.   
  1936.   CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
  1937.   sd->blockRef = cntr.reference();
  1938.   sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::ArbitCheck;
  1939.   sd->mask = ndbMask;
  1940.   cntr.EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, 
  1941.       CheckNodeGroups::SignalLength);
  1942.   jamEntry();
  1943.   switch (sd->output) {
  1944.   case CheckNodeGroups::Win:
  1945.   case CheckNodeGroups::Partitioning:
  1946.     return true;
  1947.     break;
  1948.   }
  1949.   
  1950.   StopRef * const ref = (StopRef *)&signal->theData[0];    
  1951.   
  1952.   ref->senderData = stopReq.senderData;
  1953.   ref->errorCode = StopRef::NodeShutdownWouldCauseSystemCrash;
  1954.   
  1955.   const BlockReference bref = stopReq.senderRef;
  1956.   cntr.sendSignal(bref, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
  1957.   
  1958.   stopReq.senderRef = 0;
  1959.   if (cntr.getNodeState().startLevel != NodeState::SL_SINGLEUSER)
  1960.   {
  1961.     NodeState newState(NodeState::SL_STARTED); 
  1962.     cntr.updateNodeState(signal, newState);
  1963.   }
  1964.   signal->theData[0] = EventReport::NDBStopAborted;
  1965.   cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 1, JBB);
  1966.   
  1967.   return false;
  1968. }
  1969. void
  1970. Ndbcntr::StopRecord::checkApiTimeout(Signal* signal){
  1971.   const Int32 timeout = stopReq.apiTimeout; 
  1972.   const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
  1973.   const NDB_TICKS now = NdbTick_CurrentMillisecond();
  1974.   if((timeout >= 0 && now >= alarm)){
  1975.     // || checkWithApiInSomeMagicWay)
  1976.     jam();
  1977.     NodeState newState(NodeState::SL_STOPPING_2, 
  1978.        StopReq::getSystemStop(stopReq.requestInfo));
  1979.     if(stopReq.singleuser) {
  1980.       newState.setSingleUser(true);
  1981.       newState.setSingleUserApi(stopReq.singleUserApi);
  1982.     }
  1983.     cntr.updateNodeState(signal, newState);
  1984.     stopInitiatedTime = now;
  1985.   }
  1986.   signal->theData[0] = ZSHUTDOWN;
  1987.   cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
  1988. }
  1989. void
  1990. Ndbcntr::StopRecord::checkTcTimeout(Signal* signal){
  1991.   const Int32 timeout = stopReq.transactionTimeout;
  1992.   const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
  1993.   const NDB_TICKS now = NdbTick_CurrentMillisecond();
  1994.   if((timeout >= 0 && now >= alarm)){
  1995.     // || checkWithTcInSomeMagicWay)
  1996.     jam();
  1997.     if(stopReq.getSystemStop(stopReq.requestInfo)  || stopReq.singleuser){
  1998.       jam();
  1999.       if(stopReq.singleuser) 
  2000. {
  2001.   jam();
  2002.    AbortAllReq * req = (AbortAllReq*)&signal->theData[0];
  2003.    req->senderRef = cntr.reference();
  2004.    req->senderData = 12;
  2005.    cntr.sendSignal(DBTC_REF, GSN_ABORT_ALL_REQ, signal, 
  2006.       AbortAllReq::SignalLength, JBB);
  2007.       else
  2008. {
  2009.   WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
  2010.   req->senderRef = cntr.reference();
  2011.   req->senderData = 12;
  2012.   req->requestType = WaitGCPReq::CompleteForceStart;
  2013.   cntr.sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
  2014.   WaitGCPReq::SignalLength, JBB);
  2015. }
  2016.     } else {
  2017.       jam();
  2018.       StopPermReq * req = (StopPermReq*)&signal->theData[0];
  2019.       req->senderRef = cntr.reference();
  2020.       req->senderData = 12;
  2021.       cntr.sendSignal(DBDIH_REF, GSN_STOP_PERM_REQ, signal, 
  2022.       StopPermReq::SignalLength, JBB);
  2023.     }
  2024.     return;
  2025.   } 
  2026.   signal->theData[0] = ZSHUTDOWN;
  2027.   cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
  2028. }
  2029. void Ndbcntr::execSTOP_PERM_REF(Signal* signal){
  2030.   //StopPermRef* const ref = (StopPermRef*)&signal->theData[0];
  2031.   jamEntry();
  2032.   signal->theData[0] = ZSHUTDOWN;
  2033.   sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
  2034. }
  2035. void Ndbcntr::execSTOP_PERM_CONF(Signal* signal){
  2036.   jamEntry();
  2037.   
  2038.   AbortAllReq * req = (AbortAllReq*)&signal->theData[0];
  2039.   req->senderRef = reference();
  2040.   req->senderData = 12;
  2041.   sendSignal(DBTC_REF, GSN_ABORT_ALL_REQ, signal, 
  2042.      AbortAllReq::SignalLength, JBB);
  2043. }
  2044. void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
  2045.   jamEntry();
  2046.   if(c_stopRec.stopReq.singleuser) {
  2047.     jam();
  2048.     NodeState newState(NodeState::SL_SINGLEUSER);    
  2049.     newState.setSingleUser(true);
  2050.     newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
  2051.     updateNodeState(signal, newState);    
  2052.     c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
  2053.     StopConf * const stopConf = (StopConf *)&signal->theData[0];
  2054.     stopConf->senderData = c_stopRec.stopReq.senderData;
  2055.     stopConf->nodeState  = (Uint32) NodeState::SL_SINGLEUSER;
  2056.     sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_CONF, signal, StopConf::SignalLength, JBB);
  2057.     c_stopRec.stopReq.senderRef = 0; // the command is done
  2058.     signal->theData[0] = EventReport::SingleUser;
  2059.     signal->theData[1] = 1;
  2060.     signal->theData[2] = c_stopRec.stopReq.singleUserApi;
  2061.     sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
  2062.   }
  2063.   else 
  2064.     {
  2065.       jam();
  2066.       NodeState newState(NodeState::SL_STOPPING_3, 
  2067.  StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
  2068.       updateNodeState(signal, newState);
  2069.   
  2070.       c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
  2071.       
  2072.       signal->theData[0] = ZSHUTDOWN;
  2073.       sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
  2074.     }
  2075. }
  2076. void Ndbcntr::execABORT_ALL_REF(Signal* signal){
  2077.   jamEntry();
  2078.   AbortAllRef *abortAllRef = (AbortAllRef *)&signal->theData[0];
  2079.   AbortAllRef::ErrorCode errorCode = (AbortAllRef::ErrorCode) abortAllRef->errorCode;
  2080.   StopRef * const stopRef = (StopRef *)&signal->theData[0];
  2081.   stopRef->senderData = c_stopRec.stopReq.senderData;
  2082.   stopRef->errorCode = StopRef::TransactionAbortFailed;
  2083.   sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
  2084. }
  2085. void
  2086. Ndbcntr::StopRecord::checkLqhTimeout_1(Signal* signal){
  2087.   const Int32 timeout = stopReq.readOperationTimeout;
  2088.   const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
  2089.   const NDB_TICKS now = NdbTick_CurrentMillisecond();
  2090.   
  2091.   if((timeout >= 0 && now >= alarm)){
  2092.     // || checkWithLqhInSomeMagicWay)
  2093.     jam();
  2094.     
  2095.     ChangeNodeStateReq * req = (ChangeNodeStateReq*)&signal->theData[0];
  2096.     NodeState newState(NodeState::SL_STOPPING_4, 
  2097.        StopReq::getSystemStop(stopReq.requestInfo));
  2098.     req->nodeState = newState;
  2099.     req->senderRef = cntr.reference();
  2100.     req->senderData = 12;
  2101.     cntr.sendSignal(DBLQH_REF, GSN_CHANGE_NODE_STATE_REQ, signal, 2, JBB);
  2102.     return;
  2103.   }
  2104.   signal->theData[0] = ZSHUTDOWN;
  2105.   cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
  2106. }
  2107. void Ndbcntr::execCHANGE_NODE_STATE_CONF(Signal* signal){
  2108.   jamEntry();
  2109.   signal->theData[0] = reference();
  2110.   signal->theData[1] = 12;
  2111.   sendSignal(DBDIH_REF, GSN_STOP_ME_REQ, signal, 2, JBB);
  2112. }
  2113. void Ndbcntr::execSTOP_ME_REF(Signal* signal){
  2114.   jamEntry();
  2115.   ndbrequire(false);
  2116. }
  2117. void Ndbcntr::execSTOP_ME_CONF(Signal* signal){
  2118.   jamEntry();
  2119.   NodeState newState(NodeState::SL_STOPPING_4, 
  2120.      StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
  2121.   updateNodeState(signal, newState);
  2122.   
  2123.   c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
  2124.   signal->theData[0] = ZSHUTDOWN;
  2125.   sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
  2126. }
  2127. void
  2128. Ndbcntr::StopRecord::checkLqhTimeout_2(Signal* signal){
  2129.   const Int32 timeout = stopReq.operationTimeout; 
  2130.   const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
  2131.   const NDB_TICKS now = NdbTick_CurrentMillisecond();
  2132.   if((timeout >= 0 && now >= alarm)){
  2133.     // || checkWithLqhInSomeMagicWay)
  2134.     jam();
  2135.     if(StopReq::getPerformRestart(stopReq.requestInfo)){
  2136.       jam();
  2137.       StartOrd * startOrd = (StartOrd *)&signal->theData[0];
  2138.       startOrd->restartInfo = stopReq.requestInfo;
  2139.       cntr.sendSignal(CMVMI_REF, GSN_START_ORD, signal, 2, JBA);
  2140.     } else {
  2141.       jam();
  2142.       cntr.sendSignal(CMVMI_REF, GSN_STOP_ORD, signal, 1, JBA);
  2143.     }
  2144.     return;
  2145.   }
  2146.   signal->theData[0] = ZSHUTDOWN;
  2147.   cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
  2148. }
  2149. void Ndbcntr::execWAIT_GCP_REF(Signal* signal){
  2150.   jamEntry();
  2151.   
  2152.   //WaitGCPRef* const ref = (WaitGCPRef*)&signal->theData[0];
  2153.   WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
  2154.   req->senderRef = reference();
  2155.   req->senderData = 12;
  2156.   req->requestType = WaitGCPReq::CompleteForceStart;
  2157.   sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
  2158.      WaitGCPReq::SignalLength, JBB);
  2159. }
  2160. void Ndbcntr::execWAIT_GCP_CONF(Signal* signal){
  2161.   jamEntry();
  2162.   ndbrequire(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
  2163.   NodeState newState(NodeState::SL_STOPPING_3, true); 
  2164.   /**
  2165.    * Inform QMGR so that arbitrator won't kill us
  2166.    */
  2167.   NodeStateRep * rep = (NodeStateRep *)&signal->theData[0];
  2168.   rep->nodeState = newState;
  2169.   rep->nodeState.masterNodeId = cmasterNodeId;
  2170.   rep->nodeState.setNodeGroup(c_nodeGroup);
  2171.   EXECUTE_DIRECT(QMGR, GSN_NODE_STATE_REP, signal, NodeStateRep::SignalLength);
  2172.   if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){
  2173.     jam();
  2174.     StartOrd * startOrd = (StartOrd *)&signal->theData[0];
  2175.     startOrd->restartInfo = c_stopRec.stopReq.requestInfo;
  2176.     sendSignalWithDelay(CMVMI_REF, GSN_START_ORD, signal, 500, 
  2177. StartOrd::SignalLength);
  2178.   } else {
  2179.     jam();
  2180.     sendSignalWithDelay(CMVMI_REF, GSN_STOP_ORD, signal, 500, 1);
  2181.   }
  2182.   return;
  2183. }
  2184. void Ndbcntr::execSTTORRY(Signal* signal){
  2185.   jamEntry();
  2186.   c_missra.execSTTORRY(signal);
  2187. }
  2188. void Ndbcntr::execREAD_CONFIG_CONF(Signal* signal){
  2189.   jamEntry();
  2190.   c_missra.execREAD_CONFIG_CONF(signal);
  2191. }
  2192. void Ndbcntr::execSTART_ORD(Signal* signal){
  2193.   jamEntry();
  2194.   c_missra.execSTART_ORD(signal);
  2195. }
  2196. void
  2197. Ndbcntr::clearFilesystem(Signal* signal){
  2198.   FsRemoveReq * req  = (FsRemoveReq *)signal->getDataPtrSend();
  2199.   req->userReference = reference();
  2200.   req->userPointer   = 0;
  2201.   req->directory     = 1;
  2202.   req->ownDirectory  = 1;
  2203.   FsOpenReq::setVersion(req->fileNumber, 3);
  2204.   FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL); // Can by any...
  2205.   FsOpenReq::v1_setDisk(req->fileNumber, c_fsRemoveCount);
  2206.   sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, 
  2207.              FsRemoveReq::SignalLength, JBA);
  2208.   c_fsRemoveCount++;
  2209. }
  2210. void
  2211. Ndbcntr::execFSREMOVECONF(Signal* signal){
  2212.   jamEntry();
  2213.   if(c_fsRemoveCount == 13){
  2214.     jam();
  2215.     sendSttorry(signal);
  2216.   } else {
  2217.     jam();
  2218.     ndbrequire(c_fsRemoveCount < 13);
  2219.     clearFilesystem(signal);
  2220.   }//if
  2221. }
  2222. void Ndbcntr::Missra::execSTART_ORD(Signal* signal){
  2223.   signal->theData[0] = EventReport::NDBStartStarted;
  2224.   signal->theData[1] = NDB_VERSION;
  2225.   cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
  2226.   currentBlockIndex = 0;
  2227.   sendNextREAD_CONFIG_REQ(signal);
  2228. }
  2229. void Ndbcntr::Missra::sendNextREAD_CONFIG_REQ(Signal* signal){
  2230.   if(currentBlockIndex < ALL_BLOCKS_SZ){
  2231.     jam();
  2232.     ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtrSend();    
  2233.     req->senderData = 0;
  2234.     req->senderRef = cntr.reference();
  2235.     req->noOfParameters = 0;
  2236.     
  2237.     const BlockReference ref = ALL_BLOCKS[currentBlockIndex].Ref;
  2238. #if 0 
  2239.     ndbout_c("sending READ_CONFIG_REQ to %s(ref=%x index=%d)", 
  2240.      getBlockName( refToBlock(ref)),
  2241.      ref,
  2242.      currentBlockIndex);
  2243. #endif
  2244.     
  2245.     cntr.sendSignal(ref, GSN_READ_CONFIG_REQ, signal, 
  2246.     ReadConfigReq::SignalLength, JBB);
  2247.     return;
  2248.   }
  2249.   
  2250.   /**
  2251.    * Finished...
  2252.    */
  2253.   currentStartPhase = 0;
  2254.   for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
  2255.     if(ALL_BLOCKS[i].NextSP < currentStartPhase)
  2256.       currentStartPhase = ALL_BLOCKS[i].NextSP;
  2257.   }
  2258.   
  2259.   currentBlockIndex = 0;
  2260.   sendNextSTTOR(signal);
  2261. }
  2262. void Ndbcntr::Missra::execREAD_CONFIG_CONF(Signal* signal){
  2263.   const ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtr();
  2264.   const Uint32 ref = conf->senderRef;
  2265.   ndbrequire(refToBlock(ALL_BLOCKS[currentBlockIndex].Ref) == refToBlock(ref));
  2266.   currentBlockIndex++;
  2267.   sendNextREAD_CONFIG_REQ(signal);
  2268. }
  2269. void Ndbcntr::Missra::execSTTORRY(Signal* signal){
  2270.   const BlockReference ref = signal->senderBlockRef();
  2271.   ndbrequire(refToBlock(ref) == refToBlock(ALL_BLOCKS[currentBlockIndex].Ref));
  2272.   
  2273.   /**
  2274.    * Update next start phase
  2275.    */
  2276.   for (Uint32 i = 3; i < 25; i++){
  2277.     jam();
  2278.     if (signal->theData[i] > currentStartPhase){
  2279.       jam();
  2280.       ALL_BLOCKS[currentBlockIndex].NextSP = signal->theData[i];
  2281.       break;
  2282.     }
  2283.   }    
  2284.   
  2285.   currentBlockIndex++;
  2286.   sendNextSTTOR(signal);
  2287. }
  2288. void Ndbcntr::Missra::sendNextSTTOR(Signal* signal){
  2289.   for(; currentStartPhase < 255 ; currentStartPhase++){
  2290.     jam();
  2291.     
  2292.     const Uint32 start = currentBlockIndex;
  2293.     
  2294.     if (currentStartPhase == ZSTART_PHASE_6)
  2295.     {
  2296.       // Ndbd has passed the critical startphases.
  2297.       // Change error handler from "startup" state
  2298.       // to normal state.
  2299.       ErrorReporter::setErrorHandlerShutdownType();
  2300.     }
  2301.     for(; currentBlockIndex < ALL_BLOCKS_SZ; currentBlockIndex++){
  2302.       jam();
  2303.       if(ALL_BLOCKS[currentBlockIndex].NextSP == currentStartPhase){
  2304. jam();
  2305. signal->theData[0] = 0;
  2306. signal->theData[1] = currentStartPhase;
  2307. signal->theData[2] = 0;
  2308. signal->theData[3] = 0;
  2309. signal->theData[4] = 0;
  2310. signal->theData[5] = 0;
  2311. signal->theData[6] = 0;
  2312. signal->theData[7] = cntr.ctypeOfStart;
  2313. const BlockReference ref = ALL_BLOCKS[currentBlockIndex].Ref;
  2314. #ifdef MAX_STARTPHASE
  2315. ndbrequire(currentStartPhase <= MAX_STARTPHASE);
  2316. #endif
  2317. #ifdef TRACE_STTOR
  2318. ndbout_c("sending STTOR(%d) to %s(ref=%x index=%d)", 
  2319.  currentStartPhase,
  2320.  getBlockName( refToBlock(ref)),
  2321.  ref,
  2322.  currentBlockIndex);
  2323. #endif
  2324. cntr.sendSignal(ref, GSN_STTOR, signal, 8, JBB);
  2325. return;
  2326.       }
  2327.     }
  2328.     
  2329.     currentBlockIndex = 0;
  2330.     if(start != 0){
  2331.       /**
  2332.        * At least one wanted this start phase,  report it
  2333.        */
  2334.       jam();
  2335.       signal->theData[0] = EventReport::StartPhaseCompleted;
  2336.       signal->theData[1] = currentStartPhase;
  2337.       signal->theData[2] = cntr.ctypeOfStart;    
  2338.       cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
  2339.     }
  2340.   }
  2341.   
  2342.   signal->theData[0] = EventReport::NDBStartCompleted;
  2343.   signal->theData[1] = NDB_VERSION;
  2344.   cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
  2345.   
  2346.   NodeState newState(NodeState::SL_STARTED);
  2347.   cntr.updateNodeState(signal, newState);
  2348.   /**
  2349.    * Backward
  2350.    */
  2351.   UpgradeStartup::sendCmAppChg(cntr, signal, 3); //RUN
  2352.   NdbNodeBitmask nodes = cntr.c_clusterNodes;
  2353.   Uint32 node = 0;
  2354.   while((node = nodes.find(node+1)) != NdbNodeBitmask::NotFound){
  2355.     if(cntr.getNodeInfo(node).m_version < MAKE_VERSION(3,5,0)){
  2356.       nodes.clear(node);
  2357.     }
  2358.   }
  2359.   
  2360.   NodeReceiverGroup rg(NDBCNTR, nodes);
  2361.   signal->theData[0] = cntr.getOwnNodeId();
  2362.   cntr.sendSignal(rg, GSN_CNTR_START_REP, signal, 1, JBB);
  2363. }
  2364. /**
  2365.  * Backward compatible code
  2366.  */
  2367. void
  2368. UpgradeStartup::sendCmAppChg(Ndbcntr& cntr, Signal* signal, Uint32 startLevel){
  2369.   
  2370.   if(cntr.getNodeInfo(cntr.cmasterNodeId).m_version >= MAKE_VERSION(3,5,0)){
  2371.     jam();
  2372.     return;
  2373.   }
  2374.   /**
  2375.    * Old NDB running
  2376.    */
  2377.   
  2378.   signal->theData[0] = startLevel;
  2379.   signal->theData[1] = cntr.getOwnNodeId();
  2380.   signal->theData[2] = 3 | ('N' << 8);
  2381.   signal->theData[3] = 'D' | ('B' << 8);
  2382.   signal->theData[4] = 0;
  2383.   signal->theData[5] = 0;
  2384.   signal->theData[6] = 0;
  2385.   signal->theData[7] = 0;
  2386.   signal->theData[8] = 0;
  2387.   signal->theData[9] = 0;
  2388.   signal->theData[10] = 0;
  2389.   signal->theData[11] = 0;
  2390.   
  2391.   NdbNodeBitmask nodes = cntr.c_clusterNodes;
  2392.   nodes.clear(cntr.getOwnNodeId());
  2393.   Uint32 node = 0;
  2394.   while((node = nodes.find(node+1)) != NdbNodeBitmask::NotFound){
  2395.     if(cntr.getNodeInfo(node).m_version < MAKE_VERSION(3,5,0)){
  2396.       cntr.sendSignal(cntr.calcQmgrBlockRef(node),
  2397.       GSN_CM_APPCHG, signal, 12, JBB);
  2398.     } else {
  2399.       cntr.c_startedNodes.set(node); // Fake started
  2400.     }
  2401.   }
  2402. }
  2403. void
  2404. UpgradeStartup::execCM_APPCHG(SimulatedBlock & block, Signal* signal){
  2405.   Uint32 state = signal->theData[0];
  2406.   Uint32 nodeId = signal->theData[1];
  2407.   if(block.number() == QMGR){
  2408.     Ndbcntr& cntr = * (Ndbcntr*)globalData.getBlock(CNTR);
  2409.     switch(state){
  2410.     case 0: // ZADD
  2411.       break;
  2412.     case 2: // ZSTART
  2413.       break;
  2414.     case 3: // ZRUN{
  2415.       cntr.c_startedNodes.set(nodeId);
  2416.       Uint32 recv = cntr.c_startedNodes.count();
  2417.       Uint32 cnt = cntr.c_clusterNodes.count();
  2418.       if(recv + 1 == cnt){ //+1 == own node
  2419. /**
  2420.  * Check master
  2421.  */
  2422. sendCntrMasterReq(cntr, signal, 0);
  2423.       }
  2424.       return;
  2425.     }
  2426.   }
  2427.   block.progError(0,0);
  2428. }
  2429. void
  2430. UpgradeStartup::sendCntrMasterReq(Ndbcntr& cntr, Signal* signal, Uint32 n){
  2431.   Uint32 node = cntr.c_startedNodes.find(n);
  2432.   if(node != NdbNodeBitmask::NotFound && 
  2433.      (node == cntr.getOwnNodeId() || 
  2434.       cntr.getNodeInfo(node).m_version >= MAKE_VERSION(3,5,0))){
  2435.     node = cntr.c_startedNodes.find(node+1);
  2436.   }
  2437.   
  2438.   if(node == NdbNodeBitmask::NotFound){
  2439.     cntr.progError(0,0);
  2440.   }
  2441.   CntrMasterReq * const cntrMasterReq = (CntrMasterReq*)&signal->theData[0];
  2442.   cntr.c_clusterNodes.copyto(NdbNodeBitmask::Size, cntrMasterReq->theNodes);
  2443.   NdbNodeBitmask::clear(cntrMasterReq->theNodes, cntr.getOwnNodeId());
  2444.   cntrMasterReq->userBlockRef = 0;
  2445.   cntrMasterReq->userNodeId = cntr.getOwnNodeId();
  2446.   cntrMasterReq->typeOfStart = NodeState::ST_INITIAL_NODE_RESTART;
  2447.   cntrMasterReq->noRestartNodes = cntr.c_clusterNodes.count() - 1;
  2448.   cntr.sendSignal(cntr.calcNdbCntrBlockRef(node), GSN_CNTR_MASTERREQ,
  2449.   signal, CntrMasterReq::SignalLength, JBB);
  2450. }
  2451. void
  2452. UpgradeStartup::execCNTR_MASTER_REPLY(SimulatedBlock & block, Signal* signal){
  2453.   Uint32 gsn = signal->header.theVerId_signalNumber;
  2454.   Uint32 node = refToNode(signal->getSendersBlockRef());
  2455.   if(block.number() == CNTR){
  2456.     Ndbcntr& cntr = (Ndbcntr&)block;
  2457.     switch(gsn){
  2458.     case GSN_CNTR_MASTERREF:
  2459.       sendCntrMasterReq(cntr, signal, node + 1);
  2460.       return;
  2461.       break;
  2462.     case GSN_CNTR_MASTERCONF:{
  2463.       CntrStartConf* conf = (CntrStartConf*)signal->getDataPtrSend();
  2464.       conf->startGci = 0;
  2465.       conf->masterNodeId = node;
  2466.       conf->noStartNodes = 1;
  2467.       conf->startType = NodeState::ST_INITIAL_NODE_RESTART;
  2468.       NodeBitmask mask;
  2469.       mask.clear();
  2470.       mask.copyto(NdbNodeBitmask::Size, conf->startedNodes);
  2471.       mask.clear();
  2472.       mask.set(cntr.getOwnNodeId());
  2473.       mask.copyto(NdbNodeBitmask::Size, conf->startingNodes);
  2474.       cntr.execCNTR_START_CONF(signal);
  2475.       return;
  2476.     }
  2477.     }
  2478.   }
  2479.   block.progError(0,0);
  2480. }