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

📄 dbdih.hpp

📁 mysql-5.0.22.tar.gz源码包
💻 HPP
📖 第 1 页 / 共 4 页
字号:
/* 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 DBDIH_H#define DBDIH_H#include <ndb_limits.h>#include <pc.hpp>#include <SimulatedBlock.hpp>#include "Sysfile.hpp"#include <ArrayList.hpp>#include <SignalCounter.hpp>#include <signaldata/MasterLCP.hpp>#include <signaldata/CopyGCIReq.hpp>#include <blocks/mutexes.hpp>#ifdef DBDIH_C/*###################*//* FILE SYSTEM FLAGS *//*###################*/#define ZLIST_OF_PAIRS 0#define ZLIST_OF_PAIRS_SYNCH 16#define ZOPEN_READ_WRITE 2#define ZCREATE_READ_WRITE 0x302#define ZCLOSE_NO_DELETE 0#define ZCLOSE_DELETE 1/*###############*//* NODE STATES   *//*###############*/#define ZIDLE 0#define ZACTIVE 1/*#########*//* GENERAL *//*#########*/#define ZVAR_NO_WORD 1#define ZVAR_NO_CRESTART_INFO 20#define ZVAR_NO_CRESTART_INFO_TO_FILE 21#define ZVALID 1#define ZINVALID 2/*###############*//*  ERROR CODES  *//*###############*/// ------------------------------------------// Error Codes for Transactions (None sofar)// ------------------------------------------// --------------------------------------// Error Codes for Add Table// --------------------------------------#define ZREPLERROR1 306#define ZNOTIMPLEMENTED 307#define ZTABLEINSTALLED 310// --------------------------------------// Error Codes for Scan Table// --------------------------------------#define ZERRONOUSSTATE 308// --------------------------------------// Crash Codes// --------------------------------------#define ZCOULD_NOT_OCCUR_ERROR 300#define ZNOT_MASTER_ERROR 301#define ZWRONG_FAILURE_NUMBER_ERROR 302#define ZWRONG_START_NODE_ERROR 303#define ZNO_REPLICA_FOUND_ERROR 304#define ZNODE_START_DISALLOWED_ERROR 309// --------------------------------------// Codes from LQH// --------------------------------------#define ZNODE_FAILURE_ERROR 400/*#########*//* PHASES  *//*#########*/#define ZNDB_SPH1 1#define ZNDB_SPH2 2#define ZNDB_SPH3 3#define ZNDB_SPH4 4#define ZNDB_SPH5 5#define ZNDB_SPH6 6#define ZNDB_SPH7 7#define ZNDB_SPH8 8/*#########*//* SIZES   *//*#########*/#define ZPAGEREC 100#define ZCREATE_REPLICA_FILE_SIZE 4#define ZPROXY_MASTER_FILE_SIZE 10#define ZPROXY_FILE_SIZE 10#endifclass Dbdih: public SimulatedBlock {public:  // Records  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい   * THE API CONNECT RECORD IS THE SAME RECORD POINTER AS USED IN THE TC BLOCK   *   *  IT KEEPS TRACK OF ALL THE OPERATIONS CONNECTED TO THIS TRANSACTION.   *  IT IS LINKED INTO A QUEUE IN CASE THE GLOBAL CHECKPOINT IS CURRENTLY    * ONGOING */  struct ApiConnectRecord {    Uint32 apiGci;    Uint32 nextApi;  };  typedef Ptr<ApiConnectRecord> ApiConnectRecordPtr;  /*############## CONNECT_RECORD ##############*/  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /* THE CONNECT RECORD IS CREATED WHEN A TRANSACTION HAS TO START. IT KEEPS      ALL INTERMEDIATE INFORMATION NECESSARY FOR THE TRANSACTION FROM THE      DISTRIBUTED MANAGER. THE RECORD KEEPS INFORMATION ABOUT THE     OPERATIONS THAT HAVE TO BE CARRIED OUT BY THE TRANSACTION AND     ALSO THE TRAIL OF NODES FOR EACH OPERATION IN THE THE     TRANSACTION.   */  struct ConnectRecord {    enum ConnectState {      INUSE = 0,      FREE = 1,      STARTED = 2    };    Uint32 nodes[MAX_REPLICAS];    ConnectState connectState;    Uint32 nfConnect;    Uint32 table;    Uint32 userpointer;    BlockReference userblockref;  };  typedef Ptr<ConnectRecord> ConnectRecordPtr;  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /*       THESE RECORDS ARE USED WHEN CREATING REPLICAS DURING SYSTEM      */  /*       RESTART. I NEED A COMPLEX DATA STRUCTURE DESCRIBING THE REPLICAS */  /*       I WILL TRY TO CREATE FOR EACH FRAGMENT.                          */  /*                                                                        */  /*       I STORE A REFERENCE TO THE FOUR POSSIBLE CREATE REPLICA RECORDS  */  /*       IN A COMMON STORED VARIABLE. I ALLOW A MAXIMUM OF 4 REPLICAS TO  */  /*       BE RESTARTED PER FRAGMENT.                                       */  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  struct CreateReplicaRecord {    Uint32 logStartGci[MAX_LOG_EXEC];    Uint32 logStopGci[MAX_LOG_EXEC];    Uint16 logNodeId[MAX_LOG_EXEC];    Uint32 createLcpId;    bool hotSpareUse;    Uint32 replicaRec;    Uint16 dataNodeId;    Uint16 lcpNo;    Uint16 noLogNodes;  };  typedef Ptr<CreateReplicaRecord> CreateReplicaRecordPtr;  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /*       THIS RECORD CONTAINS A FILE DESCRIPTION. THERE ARE TWO           */  /*       FILES PER TABLE TO RAISE SECURITY LEVEL AGAINST DISK CRASHES.    */   /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  struct FileRecord {    enum FileStatus {      CLOSED = 0,      CRASHED = 1,      OPEN = 2    };    enum FileType {      TABLE_FILE = 0,      GCP_FILE = 1    };    enum ReqStatus {      IDLE = 0,      CREATING_GCP = 1,      OPENING_GCP = 2,      OPENING_COPY_GCI = 3,      WRITING_COPY_GCI = 4,      CREATING_COPY_GCI = 5,      OPENING_TABLE = 6,      READING_GCP = 7,      READING_TABLE = 8,      WRITE_INIT_GCP = 9,      TABLE_CREATE = 10,      TABLE_WRITE = 11,      TABLE_CLOSE = 12,      CLOSING_GCP = 13,      CLOSING_TABLE_CRASH = 14,      CLOSING_TABLE_SR = 15,      CLOSING_GCP_CRASH = 16,      TABLE_OPEN_FOR_DELETE = 17,      TABLE_CLOSE_DELETE = 18    };    Uint32 fileName[4];    Uint32 fileRef;    FileStatus fileStatus;    FileType fileType;    Uint32 nextFile;    ReqStatus reqStatus;    Uint32 tabRef;  };  typedef Ptr<FileRecord> FileRecordPtr;  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /* THIS RECORD KEEPS THE STORAGE AND DECISIONS INFORMATION OF A FRAGMENT  */  /* AND ITS REPLICAS. IF FRAGMENT HAS MORE THAN ONE BACK UP                */  /* REPLICA THEN A LIST OF MORE NODES IS ATTACHED TO THIS RECORD.          */  /* EACH RECORD IN MORE LIST HAS INFORMATION ABOUT ONE BACKUP. THIS RECORD */  /* ALSO HAVE THE STATUS OF THE FRAGMENT.                                  */  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /*                                                                        */  /*       FRAGMENTSTORE RECORD ALIGNED TO BE 64 BYTES                      */  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  struct Fragmentstore {    Uint16 activeNodes[MAX_REPLICAS];    Uint32 preferredPrimary;    Uint32 oldStoredReplicas;    /* "DEAD" STORED REPLICAS */    Uint32 storedReplicas;       /* "ALIVE" STORED REPLICAS */    Uint32 nextFragmentChunk;        Uint8 distributionKey;    Uint8 fragReplicas;    Uint8 noOldStoredReplicas;  /* NUMBER OF "DEAD" STORED REPLICAS */    Uint8 noStoredReplicas;     /* NUMBER OF "ALIVE" STORED REPLICAS*/    Uint8 noLcpReplicas;        ///< No of replicas remaining to be LCP:ed  };  typedef Ptr<Fragmentstore> FragmentstorePtr;  /*########### PAGE RECORD ############*/  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /*       THIS RECORD KEEPS INFORMATION ABOUT NODE GROUPS.             */  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  struct NodeGroupRecord {    Uint32 nodesInGroup[MAX_REPLICAS + 1];    Uint32 nextReplicaNode;    Uint32 nodeCount;    bool activeTakeOver;  };  typedef Ptr<NodeGroupRecord> NodeGroupRecordPtr;  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /*       THIS RECORD KEEPS INFORMATION ABOUT NODES.                   */  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  /*       RECORD ALIGNED TO BE 64 BYTES.                               */  /*いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい*/  enum NodefailHandlingStep {    NF_REMOVE_NODE_FROM_TABLE = 1,    NF_GCP_TAKE_OVER = 2,    NF_LCP_TAKE_OVER = 4  };    struct NodeRecord {    NodeRecord();        enum NodeStatus {      NOT_IN_CLUSTER = 0,      ALIVE = 1,      STARTING = 2,      DIED_NOW = 3,      DYING = 4,      DEAD = 5    };          struct FragmentCheckpointInfo {      Uint32 tableId;      Uint32 fragId;      Uint32 replicaPtr;    };        enum GcpState {      READY = 0,      PREPARE_SENT = 1,      PREPARE_RECEIVED = 2,      COMMIT_SENT = 3,      NODE_FINISHED = 4,      SAVE_REQ_SENT = 5,      SAVE_RECEIVED = 6,      COPY_GCI_SENT = 7    };    GcpState gcpstate;    Sysfile::ActiveStatus activeStatus;        NodeStatus nodeStatus;    bool useInTransactions;    bool allowNodeStart;    bool copyCompleted;    bool m_inclDihLcp;    FragmentCheckpointInfo startedChkpt[2];    FragmentCheckpointInfo queuedChkpt[2];    Bitmask<1> m_nodefailSteps;    Uint32 activeTabptr;    Uint32 nextNode;    Uint32 nodeGroup;    SignalCounter m_NF_COMPLETE_REP;        Uint8 dbtcFailCompleted;    Uint8 dblqhFailCompleted;    Uint8 dbdihFailCompleted;    Uint8 dbdictFailCompleted;    Uint8 recNODE_FAILREP;        Uint8 noOfQueuedChkpt;    Uint8 noOfStartedChkpt;    MasterLCPConf::State lcpStateAtTakeOver;  };  typedef Ptr<NodeRecord> NodeRecordPtr;  /**********************************************************************/  /* THIS RECORD KEEPS THE INFORMATION ABOUT A TABLE AND ITS FRAGMENTS  */  /**********************************************************************/  struct PageRecord {    Uint32 word[2048];    /* 8 KBYTE PAGE*/    Uint32 nextfreepage;  };  typedef Ptr<PageRecord> PageRecordPtr;  /************ REPLICA RECORD *************/  /**********************************************************************/  /* THIS RECORD KEEPS THE INFORMATION ABOUT A REPLICA OF A FRAGMENT    */  /**********************************************************************/  struct ReplicaRecord {    /* -------------------------------------------------------------------- */    /* THE GLOBAL CHECKPOINT IDENTITY WHEN THIS REPLICA WAS CREATED.        */    /* THERE IS ONE INDEX PER REPLICA. A REPLICA INDEX IS CREATED WHEN ANODE*/    /* CRASH OCCURS.                                                        */    /* -------------------------------------------------------------------- */    Uint32 createGci[8];    /* -------------------------------------------------------------------- */    /* THE LAST GLOBAL CHECKPOINT IDENTITY WHICH HAS BEEN SAVED ON DISK.    */    /* THIS VARIABLE IS ONLY VALID FOR REPLICAS WHICH HAVE "DIED". A REPLICA*/    /* "DIES" EITHER WHEN THE NODE CRASHES THAT KEPT THE REPLICA OR BY BEING*/    /* STOPPED IN A CONTROLLED MANNER.                                      */    /* THERE IS ONE INDEX PER REPLICA. A REPLICA INDEX IS CREATED WHEN ANODE*/    /* CRASH OCCURS.                                                        */    /* -------------------------------------------------------------------- */    Uint32 replicaLastGci[8];    /* -------------------------------------------------------------------- */    /* THE LOCAL CHECKPOINT IDENTITY OF A LOCAL CHECKPOINT.                 */    /* -------------------------------------------------------------------- */    Uint32 lcpId[MAX_LCP_STORED];    /* -------------------------------------------------------------------- */    /* THIS VARIABLE KEEPS TRACK OF THE MAXIMUM GLOBAL CHECKPOINT COMPLETED */    /* FOR EACH OF THE LOCAL CHECKPOINTS IN THIS FRAGMENT REPLICA.          */    /* -------------------------------------------------------------------- */    Uint32 maxGciCompleted[MAX_LCP_STORED];    /* -------------------------------------------------------------------- */    /* THIS VARIABLE KEEPS TRACK OF THE MINIMUM GLOBAL CHECKPOINT STARTEDFOR*/    /* EACH OF THE LOCAL CHECKPOINTS IN THIS FRAGMENT REPLICA.              */    /* -------------------------------------------------------------------- */    Uint32 maxGciStarted[MAX_LCP_STORED];    /* -------------------------------------------------------------------- */    /* THE GLOBAL CHECKPOINT IDENTITY WHEN THE TABLE WAS CREATED.           */    /* -------------------------------------------------------------------- */    Uint32 initialGci;    /* -------------------------------------------------------------------- */    /* THE REFERENCE TO THE NEXT REPLICA. EITHER IT REFERS TO THE NEXT IN   */    /* THE FREE LIST OR IT REFERS TO THE NEXT IN A LIST OF REPLICAS ON A    */    /* FRAGMENT.                                                            */    /* -------------------------------------------------------------------- */    Uint32 nextReplica;    /* -------------------------------------------------------------------- */    /*       THE NODE ID WHERE THIS REPLICA IS STORED.                      */    /* -------------------------------------------------------------------- */    Uint16 procNode;    /* -------------------------------------------------------------------- */    /*    The last local checkpoint id started or queued on this replica.   */    /* -------------------------------------------------------------------- */    Uint32 lcpIdStarted;   // Started or queued    /* -------------------------------------------------------------------- */    /* THIS VARIABLE SPECIFIES WHAT THE STATUS OF THE LOCAL CHECKPOINT IS.IT*/    /* CAN EITHER BE VALID OR INVALID. AT CREATION OF A FRAGMENT REPLICA ALL*/    /* LCP'S ARE INVALID. ALSO IF IF INDEX >= NO_LCP THEN THELOCALCHECKPOINT*/    /* IS ALWAYS INVALID. IF THE LCP BEFORE THE NEXT_LCP HAS LCP_ID THAT    */    /* DIFFERS FROM THE LATEST LCP_ID STARTED THEN THE NEXT_LCP IS ALSO     */    /* INVALID */    /* -------------------------------------------------------------------- */

⌨️ 快捷键说明

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