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

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. #ifndef NDBCNTR_H
  14. #define NDBCNTR_H
  15. #include <pc.hpp>
  16. #include <SimulatedBlock.hpp>
  17. #include <ndb_limits.h>
  18. #include <signaldata/StopReq.hpp>
  19. #include <signaldata/ResumeReq.hpp>
  20. #include <signaldata/DictTabInfo.hpp>
  21. #include <signaldata/CntrStart.hpp>
  22. #include <signaldata/CheckNodeGroups.hpp>
  23. #include <signaldata/UpgradeStartup.hpp>
  24. #include <NodeState.hpp>
  25. #include <NdbTick.h>
  26. #ifdef NDBCNTR_C
  27. /*
  28. 2.1 GLOBAL SYMBOLS
  29. ------------------
  30. */
  31. /*
  32. 2.2 LOCAL SYMBOLS
  33. ----------------- 
  34. */
  35. #define ZNO_NDB_BLOCKS 6           /* ACC, DICT, DIH, LQH, TC, TUP         */
  36. #define ZNOT_AVAILABLE 913
  37. //------- OTHERS ---------------------------------------------
  38. #define ZSTARTUP  1
  39. #define ZSHUTDOWN 2
  40. #define ZSIZE_NDB_BLOCKS_REC 16 /* MAX BLOCKS IN NDB                    */
  41. #define ZSIZE_SYSTAB 2048
  42. #define ZSTART_PHASE_1 1
  43. #define ZSTART_PHASE_2 2
  44. #define ZSTART_PHASE_3 3
  45. #define ZSTART_PHASE_4 4
  46. #define ZSTART_PHASE_5 5
  47. #define ZSTART_PHASE_6 6
  48. #define ZSTART_PHASE_7 7
  49. #define ZSTART_PHASE_8 8
  50. #define ZSTART_PHASE_9 9
  51. #define ZSTART_PHASE_END 255
  52. #define ZWAITPOINT_4_1 1
  53. #define ZWAITPOINT_4_2 2
  54. #define ZWAITPOINT_5_1 3
  55. #define ZWAITPOINT_5_2 4
  56. #define ZWAITPOINT_6_1 5
  57. #define ZWAITPOINT_6_2 6
  58. #define ZWAITPOINT_7_1 7
  59. #define ZWAITPOINT_7_2 8
  60. #define ZSYSTAB_VERSION 1
  61. #endif
  62. class Ndbcntr: public SimulatedBlock {
  63. public:
  64. // Records
  65. /* FSREADREQ FSWRITEREQ         */
  66. /**
  67.  * 2.3 RECORDS AND FILESIZES
  68.  * ------------------------------------------------------------
  69.  */
  70.   struct StartRecord {
  71.     Uint64 m_startTime;
  72.     
  73.     void reset();
  74.     NdbNodeBitmask m_starting;
  75.     NdbNodeBitmask m_waiting; // == (m_withLog | m_withoutLog)
  76.     NdbNodeBitmask m_withLog;
  77.     NdbNodeBitmask m_withoutLog;
  78.     Uint32 m_lastGci;
  79.     Uint32 m_lastGciNodeId;
  80.     Uint64 m_startPartialTimeout;
  81.     Uint64 m_startPartitionedTimeout;
  82.     Uint64 m_startFailureTimeout;
  83.     struct {
  84.       Uint32 m_nodeId;
  85.       Uint32 m_lastGci;
  86.     } m_logNodes[MAX_NDB_NODES];
  87.     Uint32 m_logNodesCount;
  88.   } c_start;
  89.   
  90.   struct NdbBlocksRec {
  91.     BlockReference blockref;
  92.   }; /* p2c: size = 2 bytes */
  93.   
  94.   typedef Ptr<NdbBlocksRec> NdbBlocksRecPtr;
  95.   /**
  96.    * Ndbcntr creates and initializes system tables on initial system start.
  97.    * The tables are defined in static structs in NdbcntrSysTable.cpp.
  98.    */
  99.   struct SysColumn {
  100.     unsigned pos;
  101.     const char* name;
  102.     // DictTabInfo
  103.     DictTabInfo::ExtType type;
  104.     Uint32 length;
  105.     bool keyFlag;
  106.     bool nullable;
  107.   };
  108.   struct SysTable {
  109.     const char* name;
  110.     unsigned columnCount;
  111.     const SysColumn* columnList;
  112.     // DictTabInfo
  113.     DictTabInfo::TableType tableType;
  114.     DictTabInfo::FragmentType fragmentType;
  115.     bool tableLoggedFlag;
  116.     // saved table id
  117.     mutable Uint32 tableId;
  118.   };
  119.   struct SysIndex {
  120.     const char* name;
  121.     const SysTable* primaryTable;
  122.     Uint32 columnCount;
  123.     Uint32 columnList[4];
  124.     // DictTabInfo
  125.     DictTabInfo::TableType indexType;
  126.     DictTabInfo::FragmentType fragmentType;
  127.     bool indexLoggedFlag;
  128.     // saved index table id
  129.     mutable Uint32 indexId;
  130.   };
  131.   static const SysTable* g_sysTableList[];
  132.   static const unsigned g_sysTableCount;
  133.   // the system tables
  134.   static const SysTable g_sysTable_SYSTAB_0;
  135.   static const SysTable g_sysTable_NDBEVENTS_0;
  136. public:
  137.   Ndbcntr(const class Configuration &);
  138.   virtual ~Ndbcntr();
  139. private:
  140.   BLOCK_DEFINES(Ndbcntr);
  141.   // Transit signals
  142.   void execCONTINUEB(Signal* signal);
  143.   void execREAD_NODESCONF(Signal* signal);
  144.   void execREAD_NODESREF(Signal* signal);
  145.   void execCM_ADD_REP(Signal* signal);
  146.   void execCNTR_START_REQ(Signal* signal);
  147.   void execCNTR_START_REF(Signal* signal);
  148.   void execCNTR_START_CONF(Signal* signal);
  149.   void execCNTR_START_REP(Signal* signal);
  150.   void execCNTR_WAITREP(Signal* signal);
  151.   void execNODE_FAILREP(Signal* signal);
  152.   void execSYSTEM_ERROR(Signal* signal);
  153.   // Received signals
  154.   void execDUMP_STATE_ORD(Signal* signal);
  155.   void execSTTOR(Signal* signal);
  156.   void execTCSEIZECONF(Signal* signal);
  157.   void execTCSEIZEREF(Signal* signal);
  158.   void execTCRELEASECONF(Signal* signal);
  159.   void execTCRELEASEREF(Signal* signal);
  160.   void execTCKEYCONF(Signal* signal);
  161.   void execTCKEYREF(Signal* signal);
  162.   void execTCROLLBACKREP(Signal* signal);
  163.   void execGETGCICONF(Signal* signal);
  164.   void execDIH_RESTARTCONF(Signal* signal);
  165.   void execDIH_RESTARTREF(Signal* signal);
  166.   void execCREATE_TABLE_REF(Signal* signal);
  167.   void execCREATE_TABLE_CONF(Signal* signal);
  168.   void execNDB_STTORRY(Signal* signal);
  169.   void execNDB_STARTCONF(Signal* signal);
  170.   void execREAD_NODESREQ(Signal* signal);
  171.   void execNDB_STARTREF(Signal* signal);
  172.   void execSET_VAR_REQ(Signal* signal);
  173.   void execSTOP_PERM_REF(Signal* signal);
  174.   void execSTOP_PERM_CONF(Signal* signal);
  175.   void execSTOP_ME_REF(Signal* signal);
  176.   void execSTOP_ME_CONF(Signal* signal);
  177.   
  178.   void execWAIT_GCP_REF(Signal* signal);
  179.   void execWAIT_GCP_CONF(Signal* signal);
  180.   void execSTOP_REQ(Signal* signal);
  181.   void execRESUME_REQ(Signal* signal);
  182.   void execCHANGE_NODE_STATE_CONF(Signal* signal);
  183.   void execABORT_ALL_REF(Signal* signal);
  184.   void execABORT_ALL_CONF(Signal* signal);
  185.   // Statement blocks
  186.   void sendCreateTabReq(Signal* signal, const char* buffer, Uint32 bufLen);
  187.   void startInsertTransactions(Signal* signal);
  188.   void initData(Signal* signal);
  189.   void resetStartVariables(Signal* signal);
  190.   void sendCntrStartReq(Signal* signal);
  191.   void sendCntrStartRef(Signal*, Uint32 nodeId, CntrStartRef::ErrorCode);
  192.   void sendNdbSttor(Signal* signal);
  193.   void sendSttorry(Signal* signal);
  194.   bool trySystemRestart(Signal* signal);
  195.   void startWaitingNodes(Signal* signal);
  196.   CheckNodeGroups::Output checkNodeGroups(Signal*, const NdbNodeBitmask &);
  197.   
  198.   // Generated statement blocks
  199.   void systemErrorLab(Signal* signal);
  200.   void createSystableLab(Signal* signal, unsigned index);
  201.   void crSystab7Lab(Signal* signal);
  202.   void crSystab8Lab(Signal* signal);
  203.   void crSystab9Lab(Signal* signal);
  204.   void startPhase1Lab(Signal* signal);
  205.   void startPhase2Lab(Signal* signal);
  206.   void startPhase3Lab(Signal* signal);
  207.   void startPhase4Lab(Signal* signal);
  208.   void startPhase5Lab(Signal* signal);
  209.   // jump 2 to resync phase counters
  210.   void startPhase8Lab(Signal* signal);
  211.   void startPhase9Lab(Signal* signal);
  212.   void ph2ALab(Signal* signal);
  213.   void ph2CLab(Signal* signal);
  214.   void ph2ELab(Signal* signal);
  215.   void ph2FLab(Signal* signal);
  216.   void ph2GLab(Signal* signal);
  217.   void ph3ALab(Signal* signal);
  218.   void ph4ALab(Signal* signal);
  219.   void ph4BLab(Signal* signal);
  220.   void ph4CLab(Signal* signal);
  221.   void ph5ALab(Signal* signal);
  222.   void ph6ALab(Signal* signal);
  223.   void ph6BLab(Signal* signal);
  224.   void ph7ALab(Signal* signal);
  225.   void ph8ALab(Signal* signal);
  226.   void waitpoint41Lab(Signal* signal);
  227.   void waitpoint51Lab(Signal* signal);
  228.   void waitpoint52Lab(Signal* signal);
  229.   void waitpoint61Lab(Signal* signal);
  230.   void waitpoint71Lab(Signal* signal);
  231.   void updateNodeState(Signal* signal, const NodeState & newState) const ;
  232.   void getNodeGroup(Signal* signal);
  233.   // Initialisation
  234.   void initData();
  235.   void initRecords();
  236.   // Variables
  237.   /**------------------------------------------------------------------------
  238.    * CONTAIN INFO ABOUT ALL NODES IN CLUSTER. NODE_PTR ARE USED AS NODE NUMBER
  239.    * IF THE STATE ARE ZDELETE THEN THE NODE DOESN'T EXIST. NODES ARE ALLOWED 
  240.    * TO REGISTER (ZADD) DURING RESTART.
  241.    *
  242.    * WHEN THE SYSTEM IS RUNNING THE MASTER WILL CHECK IF ANY NODE HAS MADE 
  243.    * A CNTR_MASTERREQ AND TAKE CARE OF THE REQUEST. 
  244.    * TO CONFIRM THE REQ, THE MASTER DEMANDS THAT ALL RUNNING NODES HAS VOTED 
  245.    * FOR THE NEW NODE. 
  246.    * NODE_PTR:MASTER_REQ IS USED DURING RESTART TO LOG 
  247.    * POSTPONED CNTR_MASTERREQ'S 
  248.    *------------------------------------------------------------------------*/
  249.   NdbBlocksRec *ndbBlocksRec;
  250.   /*
  251.     2.4 COMMON STORED VARIABLES
  252.   */
  253.   UintR cgciSystab;
  254.   UintR ckey;
  255.   //UintR csystabId;
  256.   UintR cnoWaitrep6;
  257.   UintR cnoWaitrep7;
  258.   UintR ctcConnectionP;
  259.   UintR ctcReqInfo;
  260.   Uint8 ctransidPhase;
  261.   Uint16 cresponses;
  262.   Uint8 cstartPhase;
  263.   Uint16 cinternalStartphase;
  264.   Uint16 cmasterNodeId;
  265.   Uint16 cndbBlocksCount;
  266.   Uint16 cnoStartNodes;
  267.   UintR cnoWaitrep;
  268.   NodeState::StartType ctypeOfStart;
  269.   Uint16 cdynamicNodeId;
  270.   Uint32 c_fsRemoveCount;
  271.   Uint32 c_nodeGroup;
  272.   void clearFilesystem(Signal* signal);
  273.   void execFSREMOVECONF(Signal* signal);
  274.   NdbNodeBitmask c_allDefinedNodes;
  275.   NdbNodeBitmask c_clusterNodes; // All members of qmgr cluster
  276.   NdbNodeBitmask c_startedNodes; // All cntr started nodes
  277.   
  278. public:
  279.   struct StopRecord {
  280.   public:
  281.     StopRecord(Ndbcntr & _cntr) : cntr(_cntr) {
  282.       stopReq.senderRef = 0;
  283.     }
  284.     Ndbcntr & cntr;
  285.     StopReq stopReq;          // Signal data
  286.     NDB_TICKS stopInitiatedTime; // When was the stop initiated
  287.     
  288.     bool checkNodeFail(Signal* signal);
  289.     void checkTimeout(Signal* signal);
  290.     void checkApiTimeout(Signal* signal);
  291.     void checkTcTimeout(Signal* signal);
  292.     void checkLqhTimeout_1(Signal* signal);
  293.     void checkLqhTimeout_2(Signal* signal);
  294.     
  295.     BlockNumber number() const { return cntr.number(); }
  296.     void progError(int line, int cause, const char * extra) { 
  297.       cntr.progError(line, cause, extra); 
  298.     }
  299.   };
  300. private:
  301.   StopRecord c_stopRec;
  302.   friend struct StopRecord;
  303.   struct Missra {
  304.     Missra(Ndbcntr & ref) : cntr(ref) { }
  305.     Uint32 currentBlockIndex;
  306.     Uint32 currentStartPhase;
  307.     Uint32 nextStartPhase[NO_OF_BLOCKS];
  308.     void execSTART_ORD(Signal* signal);
  309.     void execSTTORRY(Signal* signal);
  310.     void sendNextSTTOR(Signal* signal);
  311.     void execREAD_CONFIG_CONF(Signal* signal);
  312.     void sendNextREAD_CONFIG_REQ(Signal* signal);
  313.     
  314.     BlockNumber number() const { return cntr.number(); }
  315.     void progError(int line, int cause, const char * extra) { 
  316.       cntr.progError(line, cause, extra); 
  317.     }
  318.     Ndbcntr & cntr;
  319.   };
  320.   Missra c_missra;
  321.   friend struct Missra;
  322.   void execSTTORRY(Signal* signal);
  323.   void execSTART_ORD(Signal* signal);
  324.   void execREAD_CONFIG_CONF(Signal*);
  325.   friend struct UpgradeStartup;
  326. };
  327. #endif