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

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 QMGR_H
  14. #define QMGR_H
  15. #include <pc.hpp>
  16. #include <NdbTick.h>
  17. #include <SimulatedBlock.hpp>
  18. #include <NodeBitmask.hpp>
  19. #include <SignalCounter.hpp>
  20. #include <signaldata/EventReport.hpp>
  21. #include <signaldata/ArbitSignalData.hpp>
  22. #include <signaldata/CmRegSignalData.hpp>
  23. #include <signaldata/ApiRegSignalData.hpp>
  24. #include <signaldata/FailRep.hpp>
  25. #include "timer.hpp"
  26. #ifdef QMGR_C
  27. #define NO_REG_APP 1
  28. /* Delay values, ms -----------------------------*/
  29. #define ZDELAY_REGREQ 1000
  30. /* Type of refuse in CM_NODEINFOREF -------------*/
  31. #define ZNOT_RUNNING 0
  32. /* Type of continue in CONTINUEB ----------------*/
  33. #define ZREGREQ_TIMELIMIT 0
  34. #define ZHB_HANDLING 1
  35. #define ZREGREQ_MASTER_TIMELIMIT 2
  36. #define ZAPI_HB_HANDLING 3
  37. #define ZTIMER_HANDLING 4
  38. #define ZARBIT_HANDLING 5
  39. /* Error Codes ------------------------------*/
  40. #define ZERRTOOMANY 1101
  41. #define ZERRALREADYREG 1102
  42. #define ZERRNHMISSING 1103
  43. #define ZERRNLMISSING 1104
  44. #define ZERRAPPMISSING 1105
  45. #define ZERROR_NOT_IN_CFGFILE 1106
  46. #define ZERROR_TIMEOUT 1107
  47. #define ZERROR_NOT_ZINIT 1108
  48. #define ZERROR_NODEINFOREF 1109
  49. #define ZERROR_NOTLOCALQMGR 1110
  50. #define ZERROR_NOTRUNNING 1111
  51. #define ZCOULD_NOT_OCCUR_ERROR 1112
  52. #define ZTIME_OUT_ERROR 1113
  53. #define ZERROR_NOT_DEAD 1114
  54. #define ZDECLARED_FAIL_ERROR 1115
  55. #define ZOWN_NODE_ERROR 1116
  56. #define ZWRONG_STATE_ERROR 1117
  57. #define ZNODE_ZERO_ERROR 1118
  58. #define ZWRONG_NODE_ERROR 1119
  59. #endif
  60. class Qmgr : public SimulatedBlock {
  61. public:
  62.   // State values
  63.   enum QmgrState {
  64.     Q_NOT_ACTIVE = 0,
  65.     Q_ACTIVE = 1
  66.   };
  67.   
  68.   enum FailState {
  69.     NORMAL = 0,
  70.     WAITING_FOR_FAILCONF1 = 1,
  71.     WAITING_FOR_FAILCONF2 = 2,
  72.     WAITING_FOR_NDB_FAILCONF = 3
  73.   };
  74.   enum Phase {
  75.     ZINIT = 1,          /* All nodes start in phase INIT         */
  76.     ZSTARTING = 2,  /* Node is connecting to cluster         */
  77.     ZRUNNING = 3,  /* Node is running in the cluster        */
  78.     ZPREPARE_FAIL = 4,       /* PREPARATION FOR FAILURE               */
  79.     ZFAIL_CLOSING = 5,             /* API/NDB IS DISCONNECTING              */
  80.     ZAPI_ACTIVE = 6,            /* API IS RUNNING IN NODE                */
  81.     ZAPI_INACTIVE = 7           /* Inactive API */
  82.   };
  83.   struct StartRecord {
  84.     void reset(){ m_startKey++; m_startNode = 0;}
  85.     Uint32 m_startKey;
  86.     Uint32 m_startNode;
  87.     Uint64 m_startTimeout;
  88.     
  89.     Uint32 m_gsn;
  90.     SignalCounter m_nodes;
  91.   } c_start;
  92.   NdbNodeBitmask c_definedNodes; // DB nodes in config
  93.   NdbNodeBitmask c_clusterNodes; // DB nodes in cluster
  94.   NodeBitmask c_connectedNodes;  // All kinds of connected nodes
  95.   Uint32 c_maxDynamicId;
  96.   
  97.   // Records
  98.   struct NodeRec {
  99.     UintR ndynamicId;
  100.     Phase phase;
  101.     UintR alarmCount;
  102.     
  103.     QmgrState sendPrepFailReqStatus;
  104.     QmgrState sendCommitFailReqStatus;
  105.     QmgrState sendPresToStatus;
  106.     FailState failState;
  107.     BlockReference rcv[2];        // remember which failconf we have received
  108.     BlockReference blockRef;
  109.     NodeRec() { }
  110.   }; /* p2c: size = 52 bytes */
  111.   
  112.   typedef Ptr<NodeRec> NodeRecPtr;
  113.   
  114.   enum ArbitState {
  115.     ARBIT_NULL = 0,
  116.     ARBIT_INIT = 1,             // create new ticket
  117.     ARBIT_FIND = 2, // find candidate arbitrator node
  118.     ARBIT_PREP1 = 3, // PREP db nodes with null ticket
  119.     ARBIT_PREP2 = 4, // PREP db nodes with current ticket
  120.     ARBIT_START = 5, // START arbitrator API thread
  121.     ARBIT_RUN = 6, // running with arbitrator
  122.     ARBIT_CHOOSE = 7, // ask arbitrator after network partition
  123.     ARBIT_CRASH = 8 // crash ourselves
  124.   };
  125.   struct ArbitRec {
  126.     ArbitState state; // state
  127.     bool newstate; // flag to initialize new state
  128.     unsigned thread; // identifies a continueB "thread"
  129.     NodeId node; // current arbitrator candidate
  130.     ArbitTicket ticket; // ticket
  131.     NodeBitmask apiMask[1+2]; // arbitrators 0=all 1,2=per rank
  132.     NodeBitmask newMask; // new nodes to process in RUN state
  133.     Uint8 sendCount; // control send/recv of signals
  134.     Uint8 recvCount;
  135.     NodeBitmask recvMask; // left to recv
  136.     Uint32 code; // code field from signal
  137.     Uint32 failureNr;            // cfailureNr at arbitration start
  138.     Uint32 timeout;             // timeout for CHOOSE state
  139.     NDB_TICKS timestamp; // timestamp for checking timeouts
  140.     inline bool match(ArbitSignalData* sd) {
  141.       return
  142. node == sd->node &&
  143. ticket.match(sd->ticket);
  144.     }
  145.     inline void setTimestamp() {
  146.       timestamp = NdbTick_CurrentMillisecond();
  147.     }
  148.     inline NDB_TICKS getTimediff() {
  149.       NDB_TICKS now = NdbTick_CurrentMillisecond();
  150.       return now < timestamp ? 0 : now - timestamp;
  151.     }
  152.   };
  153.   
  154. public:
  155.   Qmgr(const class Configuration &);
  156.   virtual ~Qmgr();
  157. private:
  158.   BLOCK_DEFINES(Qmgr);
  159.   // Transit signals
  160.   void execDEBUG_SIG(Signal* signal);
  161.   void execCONTINUEB(Signal* signal);
  162.   void execCM_HEARTBEAT(Signal* signal);
  163.   void execCM_ADD(Signal* signal);
  164.   void execCM_ACKADD(Signal* signal);
  165.   void execCM_REGREQ(Signal* signal);
  166.   void execCM_REGCONF(Signal* signal);
  167.   void execCM_REGREF(Signal* signal);
  168.   void execCM_NODEINFOREQ(Signal* signal);
  169.   void execCM_NODEINFOCONF(Signal* signal);
  170.   void execCM_NODEINFOREF(Signal* signal);
  171.   void execPREP_FAILREQ(Signal* signal);
  172.   void execPREP_FAILCONF(Signal* signal);
  173.   void execPREP_FAILREF(Signal* signal);
  174.   void execCOMMIT_FAILREQ(Signal* signal);
  175.   void execCOMMIT_FAILCONF(Signal* signal);
  176.   void execFAIL_REP(Signal* signal);
  177.   void execPRES_TOREQ(Signal* signal);
  178.   void execPRES_TOCONF(Signal* signal);
  179.   void execDISCONNECT_REP(Signal* signal);
  180.   void execSYSTEM_ERROR(Signal* signal);
  181.   // Received signals
  182.   void execDUMP_STATE_ORD(Signal* signal);
  183.   void execCONNECT_REP(Signal* signal);
  184.   void execNDB_FAILCONF(Signal* signal);
  185.   void execSTTOR(Signal* signal);
  186.   void execCM_INFOCONF(Signal* signal);
  187.   void execCLOSE_COMCONF(Signal* signal);
  188.   void execAPI_REGREQ(Signal* signal);
  189.   void execAPI_FAILCONF(Signal* signal);
  190.   void execREAD_NODESREQ(Signal* signal);
  191.   void execSET_VAR_REQ(Signal* signal);
  192.   void execAPI_VERSION_REQ(Signal* signal);
  193.   void execAPI_BROADCAST_REP(Signal* signal);
  194.   // Arbitration signals
  195.   void execARBIT_CFG(Signal* signal);
  196.   void execARBIT_PREPREQ(Signal* signal);
  197.   void execARBIT_PREPCONF(Signal* signal);
  198.   void execARBIT_PREPREF(Signal* signal);
  199.   void execARBIT_STARTCONF(Signal* signal);
  200.   void execARBIT_STARTREF(Signal* signal);
  201.   void execARBIT_CHOOSECONF(Signal* signal);
  202.   void execARBIT_CHOOSEREF(Signal* signal);
  203.   void execARBIT_STOPREP(Signal* signal);
  204.   // Statement blocks
  205.   void node_failed(Signal* signal, Uint16 aFailedNode);
  206.   void checkStartInterface(Signal* signal);
  207.   void failReport(Signal* signal,
  208.                   Uint16 aFailedNode,
  209.                   UintR aSendFailRep,
  210.                   FailRep::FailCause failCause);
  211.   void findNeighbours(Signal* signal);
  212.   Uint16 translateDynamicIdToNodeId(Signal* signal, UintR TdynamicId);
  213.   void initData(Signal* signal);
  214.   void sendCloseComReq(Signal* signal, BlockReference TBRef, Uint16 TfailNo);
  215.   void sendPrepFailReq(Signal* signal, Uint16 aNode);
  216.   void sendApiFailReq(Signal* signal, Uint16 aFailedNode);
  217.   void sendApiRegRef(Signal*, Uint32 ref, ApiRegRef::ErrorCode);
  218.   // Generated statement blocks
  219.   void startphase1(Signal* signal);
  220.   void electionWon();
  221.   void cmInfoconf010Lab(Signal* signal);
  222.   void apiHbHandlingLab(Signal* signal);
  223.   void timerHandlingLab(Signal* signal);
  224.   void hbReceivedLab(Signal* signal);
  225.   void sendCmRegrefLab(Signal* signal, BlockReference ref, 
  226.        CmRegRef::ErrorCode);
  227.   void systemErrorBecauseOtherNodeFailed(Signal* signal, Uint32 line, NodeId);
  228.   void systemErrorLab(Signal* signal, Uint32 line,
  229.       const char* message = NULL);
  230.   void prepFailReqLab(Signal* signal);
  231.   void prepFailConfLab(Signal* signal);
  232.   void prepFailRefLab(Signal* signal);
  233.   void commitFailReqLab(Signal* signal);
  234.   void commitFailConfLab(Signal* signal);
  235.   void failReportLab(Signal* signal, Uint16 aFailedNode, 
  236.      FailRep::FailCause aFailCause);
  237.   void sendCommitFailReq(Signal* signal);
  238.   void presToConfLab(Signal* signal);
  239.   void sendSttorryLab(Signal* signal);
  240.   void sttor020Lab(Signal* signal);
  241.   void closeComConfLab(Signal* signal);
  242.   void apiRegReqLab(Signal* signal);
  243.   void regreqTimeLimitLab(Signal* signal);
  244.   void regreqTimeMasterLimitLab(Signal* signal);
  245.   void cmRegreq010Lab(Signal* signal);
  246.   void cmRegconf010Lab(Signal* signal);
  247.   void sttor010Lab(Signal* signal);
  248.   void sendHeartbeat(Signal* signal);
  249.   void checkHeartbeat(Signal* signal);
  250.   void setHbDelay(UintR aHbDelay);
  251.   void setHbApiDelay(UintR aHbApiDelay);
  252.   void setArbitTimeout(UintR aArbitTimeout);
  253.   // Interface to arbitration module
  254.   void handleArbitStart(Signal* signal);
  255.   void handleArbitApiFail(Signal* signal, Uint16 nodeId);
  256.   void handleArbitNdbAdd(Signal* signal, Uint16 nodeId);
  257.   void handleArbitCheck(Signal* signal);
  258.   // Private arbitration routines
  259.   Uint32 getArbitDelay();
  260.   Uint32 getArbitTimeout();
  261.   void startArbitThread(Signal* signal);
  262.   void runArbitThread(Signal* signal);
  263.   void stateArbitInit(Signal* signal);
  264.   void stateArbitFind(Signal* signal);
  265.   void stateArbitPrep(Signal* signal);
  266.   void stateArbitStart(Signal* signal);
  267.   void stateArbitRun(Signal* signal);
  268.   void stateArbitChoose(Signal* signal);
  269.   void stateArbitCrash(Signal* signal);
  270.   void computeArbitNdbMask(NodeBitmask& aMask);
  271.   void reportArbitEvent(Signal* signal, EventReport::EventType type);
  272.   // Initialisation
  273.   void initData();
  274.   void initRecords();
  275.   // Transit signals
  276.   // Variables
  277.   
  278.   bool checkAPIVersion(NodeId, Uint32 nodeVersion, Uint32 ownVersion) const;
  279.   bool checkNDBVersion(NodeId, Uint32 nodeVersion, Uint32 ownVersion) const;
  280.   void cmAddPrepare(Signal* signal, NodeRecPtr nodePtr, const NodeRec* self);
  281.   void sendCmAckAdd(Signal *, Uint32 nodeId, CmAdd::RequestType);
  282.   void joinedCluster(Signal* signal, NodeRecPtr nodePtr);
  283.   void sendCmRegReq(Signal * signal, Uint32 nodeId);
  284.   void sendCmNodeInfoReq(Signal* signal, Uint32 nodeId, const NodeRec * self);
  285. private:
  286.   void sendPrepFailReqRef(Signal* signal, 
  287.   Uint32 dstBlockRef,
  288.   GlobalSignalNumber gsn,
  289.   Uint32 blockRef,
  290.   Uint32 failNo,
  291.   Uint32 noOfNodes,
  292.   const NodeId theNodes[]);
  293.     
  294.   
  295.   /* Wait this time until we try to join the       */
  296.   /* cluster again                                 */
  297.   /**** Common stored variables ****/
  298.   NodeRec *nodeRec;
  299.   ArbitRec arbitRec;
  300.   /* Block references ------------------------------*/
  301.   BlockReference cpdistref;  /* Dist. ref of president   */
  302.   /* Node numbers. ---------------------------------*/
  303.   Uint16 cneighbourl;   /* Node no. of lower neighbour  */
  304.   Uint16 cneighbourh;   /* Node no. of higher neighbour */
  305.   Uint16 cpresident;   /* Node no. of president        */
  306.   /* Counters --------------------------------------*/
  307.   Uint16 cnoOfNodes;   /* Static node counter          */
  308.   /* Status flags ----------------------------------*/
  309.   Uint32 c_restartPartialTimeout;
  310.   Uint16 creadyDistCom;
  311.   Uint16 c_regReqReqSent;
  312.   Uint16 c_regReqReqRecv;
  313.   Uint64 c_stopElectionTime;
  314.   Uint16 cpresidentCandidate;
  315.   Uint16 cdelayRegreq;
  316.   Uint16 cpresidentAlive;
  317.   Uint16 cnoFailedNodes;
  318.   Uint16 cnoPrepFailedNodes;
  319.   Uint16 cnoCommitFailedNodes;
  320.   Uint16 cactivateApiCheck;
  321.   UintR chbApiDelay;
  322.   UintR ccommitFailureNr;
  323.   UintR cprepareFailureNr;
  324.   UintR ctoFailureNr;
  325.   UintR cfailureNr;
  326.   QmgrState ctoStatus;
  327.   UintR cLqhTimeSignalCount;
  328.   bool cHbSent;
  329.   NDB_TICKS clatestTransactionCheck;
  330.   class Timer interface_check_timer;
  331.   class Timer hb_check_timer;
  332.   class Timer hb_send_timer;
  333.   class Timer hb_api_timer;
  334.   Uint16 cfailedNodes[MAX_NDB_NODES];
  335.   Uint16 cprepFailedNodes[MAX_NDB_NODES];
  336.   Uint16 ccommitFailedNodes[MAX_NDB_NODES];
  337. };
  338. #endif