⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmgr.hpp

📁 mysql-5.0.22.tar.gz源码包
💻 HPP
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef QMGR_H#define QMGR_H#include <pc.hpp>#include <NdbTick.h>#include <SimulatedBlock.hpp>#include <NodeBitmask.hpp>#include <SignalCounter.hpp>#include <signaldata/EventReport.hpp>#include <signaldata/ArbitSignalData.hpp>#include <signaldata/CmRegSignalData.hpp>#include <signaldata/ApiRegSignalData.hpp>#include <signaldata/FailRep.hpp>#include <signaldata/StopReq.hpp>#include "timer.hpp"#ifdef QMGR_C#define NO_REG_APP 1/* Delay values, ms -----------------------------*/#define ZDELAY_REGREQ 1000/* Type of refuse in CM_NODEINFOREF -------------*/#define ZNOT_RUNNING 0/* Type of continue in CONTINUEB ----------------*/#define ZREGREQ_TIMELIMIT 0#define ZHB_HANDLING 1#define ZREGREQ_MASTER_TIMELIMIT 2#define ZAPI_HB_HANDLING 3#define ZTIMER_HANDLING 4#define ZARBIT_HANDLING 5#define ZSTART_FAILURE_LIMIT 6/* Error Codes ------------------------------*/#define ZERRTOOMANY 1101#define ZERRALREADYREG 1102#define ZERRNHMISSING 1103#define ZERRNLMISSING 1104#define ZERRAPPMISSING 1105#define ZERROR_NOT_IN_CFGFILE 1106#define ZERROR_TIMEOUT 1107#define ZERROR_NOT_ZINIT 1108#define ZERROR_NODEINFOREF 1109#define ZERROR_NOTLOCALQMGR 1110#define ZERROR_NOTRUNNING 1111#define ZCOULD_NOT_OCCUR_ERROR 1112#define ZTIME_OUT_ERROR 1113#define ZERROR_NOT_DEAD 1114#define ZDECLARED_FAIL_ERROR 1115#define ZOWN_NODE_ERROR 1116#define ZWRONG_STATE_ERROR 1117#define ZNODE_ZERO_ERROR 1118#define ZWRONG_NODE_ERROR 1119#endifclass Qmgr : public SimulatedBlock {public:  // State values  enum QmgrState {    Q_NOT_ACTIVE = 0,    Q_ACTIVE = 1  };    enum FailState {    NORMAL = 0,    WAITING_FOR_FAILCONF1 = 1,    WAITING_FOR_FAILCONF2 = 2,    WAITING_FOR_NDB_FAILCONF = 3  };  enum Phase {    ZINIT = 1, 		        /* All nodes start in phase INIT         */    ZSTARTING = 2, 		/* Node is connecting to cluster         */    ZRUNNING = 3, 		/* Node is running in the cluster        */    ZPREPARE_FAIL = 4,       /* PREPARATION FOR FAILURE               */    ZFAIL_CLOSING = 5,             /* API/NDB IS DISCONNECTING              */    ZAPI_ACTIVE = 6,            /* API IS RUNNING IN NODE                */    ZAPI_INACTIVE = 7           /* Inactive API */  };  struct StartRecord {    void reset(){       m_startKey++;       m_startNode = 0;       m_gsn = RNIL;       m_nodes.clearWaitingFor();    }    Uint32 m_startKey;    Uint32 m_startNode;    Uint64 m_startTimeout;        Uint32 m_gsn;    SignalCounter m_nodes;    Uint32 m_latest_gci;    Uint32 m_start_type;    NdbNodeBitmask m_skip_nodes;    NdbNodeBitmask m_starting_nodes;    NdbNodeBitmask m_starting_nodes_w_log;    Uint16 m_president_candidate;    Uint32 m_president_candidate_gci;    Uint16 m_regReqReqSent;    Uint16 m_regReqReqRecv;  } c_start;    NdbNodeBitmask c_definedNodes; // DB nodes in config  NdbNodeBitmask c_clusterNodes; // DB nodes in cluster  NodeBitmask c_connectedNodes;  // All kinds of connected nodes  /**   * Nodes which we're checking for partitioned cluster   *   * i.e. nodes that connect to use, when we already have elected president   */  NdbNodeBitmask c_readnodes_nodes;  Uint32 c_maxDynamicId;    // Records  struct NodeRec {    UintR ndynamicId;    Phase phase;    QmgrState sendPrepFailReqStatus;    QmgrState sendCommitFailReqStatus;    QmgrState sendPresToStatus;    FailState failState;    BlockReference rcv[2];        // remember which failconf we have received    BlockReference blockRef;    NodeRec() { }  }; /* p2c: size = 52 bytes */    typedef Ptr<NodeRec> NodeRecPtr;    enum ArbitState {    ARBIT_NULL = 0,    ARBIT_INIT = 1,             // create new ticket    ARBIT_FIND = 2,		// find candidate arbitrator node    ARBIT_PREP1 = 3,		// PREP db nodes with null ticket    ARBIT_PREP2 = 4,		// PREP db nodes with current ticket    ARBIT_START = 5,		// START arbitrator API thread    ARBIT_RUN = 6,		// running with arbitrator    ARBIT_CHOOSE = 7,		// ask arbitrator after network partition    ARBIT_CRASH = 8		// crash ourselves  };  struct ArbitRec {    ArbitState state;		// state    bool newstate;		// flag to initialize new state    unsigned thread;		// identifies a continueB "thread"    NodeId node;		// current arbitrator candidate    ArbitTicket ticket;		// ticket    NodeBitmask apiMask[1+2];	// arbitrators 0=all 1,2=per rank    NodeBitmask newMask;	// new nodes to process in RUN state    Uint8 sendCount;		// control send/recv of signals    Uint8 recvCount;    NodeBitmask recvMask;	// left to recv    Uint32 code;		// code field from signal    Uint32 failureNr;            // cfailureNr at arbitration start    Uint32 timeout;             // timeout for CHOOSE state    NDB_TICKS timestamp;	// timestamp for checking timeouts    inline bool match(ArbitSignalData* sd) {      return	node == sd->node &&	ticket.match(sd->ticket);    }    inline void setTimestamp() {      timestamp = NdbTick_CurrentMillisecond();    }    inline NDB_TICKS getTimediff() {      NDB_TICKS now = NdbTick_CurrentMillisecond();      return now < timestamp ? 0 : now - timestamp;    }  };  public:  Qmgr(const class Configuration &);  virtual ~Qmgr();private:  BLOCK_DEFINES(Qmgr);  // Transit signals  void execDEBUG_SIG(Signal* signal);  void execCONTINUEB(Signal* signal);  void execCM_HEARTBEAT(Signal* signal);  void execCM_ADD(Signal* signal);  void execCM_ACKADD(Signal* signal);  void execCM_REGREQ(Signal* signal);  void execCM_REGCONF(Signal* signal);  void execCM_REGREF(Signal* signal);  void execCM_NODEINFOREQ(Signal* signal);  void execCM_NODEINFOCONF(Signal* signal);  void execCM_NODEINFOREF(Signal* signal);  void execPREP_FAILREQ(Signal* signal);  void execPREP_FAILCONF(Signal* signal);  void execPREP_FAILREF(Signal* signal);  void execCOMMIT_FAILREQ(Signal* signal);  void execCOMMIT_FAILCONF(Signal* signal);  void execFAIL_REP(Signal* signal);  void execPRES_TOREQ(Signal* signal);  void execPRES_TOCONF(Signal* signal);  void execDISCONNECT_REP(Signal* signal);  void execSYSTEM_ERROR(Signal* signal);  void execSTOP_REQ(Signal* signal);  // Received signals  void execDUMP_STATE_ORD(Signal* signal);  void execCONNECT_REP(Signal* signal);  void execNDB_FAILCONF(Signal* signal);  void execREAD_CONFIG_REQ(Signal* signal);  void execSTTOR(Signal* signal);  void execCM_INFOCONF(Signal* signal);  void execCLOSE_COMCONF(Signal* signal);  void execAPI_REGREQ(Signal* signal);  void execAPI_FAILCONF(Signal* signal);  void execREAD_NODESREQ(Signal* signal);  void execSET_VAR_REQ(Signal* signal);  void execREAD_NODESREF(Signal* signal);  void execREAD_NODESCONF(Signal* signal);  void execDIH_RESTARTREF(Signal* signal);  void execDIH_RESTARTCONF(Signal* signal);    void execAPI_VERSION_REQ(Signal* signal);  void execAPI_BROADCAST_REP(Signal* signal);  // Arbitration signals  void execARBIT_CFG(Signal* signal);  void execARBIT_PREPREQ(Signal* signal);  void execARBIT_PREPCONF(Signal* signal);  void execARBIT_PREPREF(Signal* signal);  void execARBIT_STARTCONF(Signal* signal);  void execARBIT_STARTREF(Signal* signal);  void execARBIT_CHOOSECONF(Signal* signal);  void execARBIT_CHOOSEREF(Signal* signal);  void execARBIT_STOPREP(Signal* signal);  // Statement blocks  void check_readnodes_reply(Signal* signal, Uint32 nodeId, Uint32 gsn);  Uint32 check_startup(Signal* signal);  void node_failed(Signal* signal, Uint16 aFailedNode);  void checkStartInterface(Signal* signal);  void failReport(Signal* signal,                  Uint16 aFailedNode,                  UintR aSendFailRep,                  FailRep::FailCause failCause);  void findNeighbours(Signal* signal);  Uint16 translateDynamicIdToNodeId(Signal* signal, UintR TdynamicId);  void initData(Signal* signal);  void sendCloseComReq(Signal* signal, BlockReference TBRef, Uint16 TfailNo);  void sendPrepFailReq(Signal* signal, Uint16 aNode);  void sendApiFailReq(Signal* signal, Uint16 aFailedNode);  void sendApiRegRef(Signal*, Uint32 ref, ApiRegRef::ErrorCode);  // Generated statement blocks  void startphase1(Signal* signal);  void electionWon(Signal* signal);  void cmInfoconf010Lab(Signal* signal);    void apiHbHandlingLab(Signal* signal);  void timerHandlingLab(Signal* signal);  void hbReceivedLab(Signal* signal);  void sendCmRegrefLab(Signal* signal, BlockReference ref, 		       CmRegRef::ErrorCode);  void systemErrorBecauseOtherNodeFailed(Signal* signal, Uint32 line, NodeId);  void systemErrorLab(Signal* signal, Uint32 line,		      const char* message = NULL);  void prepFailReqLab(Signal* signal);  void prepFailConfLab(Signal* signal);  void prepFailRefLab(Signal* signal);  void commitFailReqLab(Signal* signal);  void commitFailConfLab(Signal* signal);  void failReportLab(Signal* signal, Uint16 aFailedNode, 		     FailRep::FailCause aFailCause);  void sendCommitFailReq(Signal* signal);  void presToConfLab(Signal* signal);  void sendSttorryLab(Signal* signal);  void sttor020Lab(Signal* signal);  void closeComConfLab(Signal* signal);  void apiRegReqLab(Signal* signal);  void regreqTimeLimitLab(Signal* signal);  void regreqTimeMasterLimitLab(Signal* signal);  void cmRegreq010Lab(Signal* signal);  void cmRegconf010Lab(Signal* signal);  void sttor010Lab(Signal* signal);  void sendHeartbeat(Signal* signal);  void checkHeartbeat(Signal* signal);  void setHbDelay(UintR aHbDelay);  void setHbApiDelay(UintR aHbApiDelay);  void setArbitTimeout(UintR aArbitTimeout);  // Interface to arbitration module  void handleArbitStart(Signal* signal);  void handleArbitApiFail(Signal* signal, Uint16 nodeId);  void handleArbitNdbAdd(Signal* signal, Uint16 nodeId);  void handleArbitCheck(Signal* signal);  // Private arbitration routines  Uint32 getArbitDelay();  Uint32 getArbitTimeout();  void startArbitThread(Signal* signal);  void runArbitThread(Signal* signal);  void stateArbitInit(Signal* signal);  void stateArbitFind(Signal* signal);  void stateArbitPrep(Signal* signal);  void stateArbitStart(Signal* signal);  void stateArbitRun(Signal* signal);  void stateArbitChoose(Signal* signal);  void stateArbitCrash(Signal* signal);  void computeArbitNdbMask(NodeBitmask& aMask);  void reportArbitEvent(Signal* signal, Ndb_logevent_type type);  // Initialisation  void initData();  void initRecords();  // Transit signals  // Variables    bool checkAPIVersion(NodeId, Uint32 nodeVersion, Uint32 ownVersion) const;  bool checkNDBVersion(NodeId, Uint32 nodeVersion, Uint32 ownVersion) const;  void cmAddPrepare(Signal* signal, NodeRecPtr nodePtr, const NodeRec* self);  void sendCmAckAdd(Signal *, Uint32 nodeId, CmAdd::RequestType);  void joinedCluster(Signal* signal, NodeRecPtr nodePtr);  void sendCmRegReq(Signal * signal, Uint32 nodeId);  void sendCmNodeInfoReq(Signal* signal, Uint32 nodeId, const NodeRec * self);private:  void sendPrepFailReqRef(Signal* signal, 			  Uint32 dstBlockRef,			  GlobalSignalNumber gsn,			  Uint32 blockRef,			  Uint32 failNo,			  Uint32 noOfNodes,			  const NodeId theNodes[]);        /* Wait this time until we try to join the       */  /* cluster again                                 */  /**** Common stored variables ****/  NodeRec *nodeRec;  ArbitRec arbitRec;  /* Block references ------------------------------*/  BlockReference cpdistref;	 /* Dist. ref of president   */  /* Node numbers. ---------------------------------*/  Uint16 cneighbourl; 		 /* Node no. of lower neighbour  */  Uint16 cneighbourh; 		 /* Node no. of higher neighbour */  Uint16 cpresident; 		 /* Node no. of president        */  /* Counters --------------------------------------*/  Uint16 cnoOfNodes; 		 /* Static node counter          */  /* Status flags ----------------------------------*/  Uint32 c_restartPartialTimeout;  Uint32 c_restartPartionedTimeout;  Uint32 c_restartFailureTimeout;  Uint64 c_start_election_time;  Uint16 creadyDistCom;  Uint16 cdelayRegreq;  Uint16 cpresidentAlive;  Uint16 cnoFailedNodes;  Uint16 cnoPrepFailedNodes;  Uint16 cnoCommitFailedNodes;  Uint16 cactivateApiCheck;  UintR chbApiDelay;  UintR ccommitFailureNr;  UintR cprepareFailureNr;  UintR ctoFailureNr;  UintR cfailureNr;  QmgrState ctoStatus;  UintR cLqhTimeSignalCount;  bool cHbSent;  NDB_TICKS clatestTransactionCheck;  class Timer interface_check_timer;  class Timer hb_check_timer;  class Timer hb_send_timer;  class Timer hb_api_timer;  Uint16 cfailedNodes[MAX_NDB_NODES];  Uint16 cprepFailedNodes[MAX_NDB_NODES];  Uint16 ccommitFailedNodes[MAX_NDB_NODES];    StopReq c_stopReq;  bool check_multi_node_shutdown(Signal* signal);};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -