summaryrefslogtreecommitdiff
path: root/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp')
-rw-r--r--storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp376
1 files changed, 376 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp b/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp
new file mode 100644
index 00000000000..639d300d6df
--- /dev/null
+++ b/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp
@@ -0,0 +1,376 @@
+/* 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 NDBCNTR_H
+#define NDBCNTR_H
+
+
+#include <pc.hpp>
+#include <SimulatedBlock.hpp>
+#include <ndb_limits.h>
+#include <signaldata/StopReq.hpp>
+#include <signaldata/ResumeReq.hpp>
+#include <signaldata/DictTabInfo.hpp>
+#include <signaldata/CntrStart.hpp>
+#include <signaldata/CheckNodeGroups.hpp>
+
+#include <signaldata/UpgradeStartup.hpp>
+
+#include <NodeState.hpp>
+#include <NdbTick.h>
+
+#ifdef NDBCNTR_C
+/*
+2.1 GLOBAL SYMBOLS
+------------------
+*/
+/*
+2.2 LOCAL SYMBOLS
+-----------------
+*/
+#define ZNO_NDB_BLOCKS 6 /* ACC, DICT, DIH, LQH, TC, TUP */
+
+#define ZNOT_AVAILABLE 913
+
+//------- OTHERS ---------------------------------------------
+#define ZSTARTUP 1
+#define ZSHUTDOWN 2
+
+#define ZSIZE_NDB_BLOCKS_REC 16 /* MAX BLOCKS IN NDB */
+#define ZSIZE_SYSTAB 2048
+#define ZSTART_PHASE_1 1
+#define ZSTART_PHASE_2 2
+#define ZSTART_PHASE_3 3
+#define ZSTART_PHASE_4 4
+#define ZSTART_PHASE_5 5
+#define ZSTART_PHASE_6 6
+#define ZSTART_PHASE_7 7
+#define ZSTART_PHASE_8 8
+#define ZSTART_PHASE_9 9
+#define ZSTART_PHASE_END 255
+#define ZWAITPOINT_4_1 1
+#define ZWAITPOINT_4_2 2
+#define ZWAITPOINT_5_1 3
+#define ZWAITPOINT_5_2 4
+#define ZWAITPOINT_6_1 5
+#define ZWAITPOINT_6_2 6
+#define ZWAITPOINT_7_1 7
+#define ZWAITPOINT_7_2 8
+#define ZSYSTAB_VERSION 1
+#endif
+
+class Ndbcntr: public SimulatedBlock {
+public:
+// Records
+
+/* FSREADREQ FSWRITEREQ */
+/**
+ * 2.3 RECORDS AND FILESIZES
+ * ------------------------------------------------------------
+ */
+
+ struct StartRecord {
+ Uint64 m_startTime;
+
+ void reset();
+ NdbNodeBitmask m_starting;
+ NdbNodeBitmask m_waiting; // == (m_withLog | m_withoutLog)
+ NdbNodeBitmask m_withLog;
+ NdbNodeBitmask m_withoutLog;
+ Uint32 m_lastGci;
+ Uint32 m_lastGciNodeId;
+
+ Uint64 m_startPartialTimeout;
+ Uint64 m_startPartitionedTimeout;
+ Uint64 m_startFailureTimeout;
+ struct {
+ Uint32 m_nodeId;
+ Uint32 m_lastGci;
+ } m_logNodes[MAX_NDB_NODES];
+ Uint32 m_logNodesCount;
+ } c_start;
+
+ struct NdbBlocksRec {
+ BlockReference blockref;
+ }; /* p2c: size = 2 bytes */
+
+ typedef Ptr<NdbBlocksRec> NdbBlocksRecPtr;
+
+ /**
+ * Ndbcntr creates and initializes system tables on initial system start.
+ * The tables are defined in static structs in NdbcntrSysTable.cpp.
+ */
+ struct SysColumn {
+ unsigned pos;
+ const char* name;
+ // DictTabInfo
+ DictTabInfo::ExtType type;
+ Uint32 length;
+ bool keyFlag;
+ bool nullable;
+ };
+ struct SysTable {
+ const char* name;
+ unsigned columnCount;
+ const SysColumn* columnList;
+ // DictTabInfo
+ DictTabInfo::TableType tableType;
+ DictTabInfo::FragmentType fragmentType;
+ bool tableLoggedFlag;
+ // saved table id
+ mutable Uint32 tableId;
+ };
+ struct SysIndex {
+ const char* name;
+ const SysTable* primaryTable;
+ Uint32 columnCount;
+ Uint32 columnList[4];
+ // DictTabInfo
+ DictTabInfo::TableType indexType;
+ DictTabInfo::FragmentType fragmentType;
+ bool indexLoggedFlag;
+ // saved index table id
+ mutable Uint32 indexId;
+ };
+ static const SysTable* g_sysTableList[];
+ static const unsigned g_sysTableCount;
+ // the system tables
+ static const SysTable g_sysTable_SYSTAB_0;
+ static const SysTable g_sysTable_NDBEVENTS_0;
+
+public:
+ Ndbcntr(const class Configuration &);
+ virtual ~Ndbcntr();
+
+private:
+ BLOCK_DEFINES(Ndbcntr);
+
+ // Transit signals
+ void execCONTINUEB(Signal* signal);
+ void execREAD_NODESCONF(Signal* signal);
+ void execREAD_NODESREF(Signal* signal);
+ void execCM_ADD_REP(Signal* signal);
+ void execCNTR_START_REQ(Signal* signal);
+ void execCNTR_START_REF(Signal* signal);
+ void execCNTR_START_CONF(Signal* signal);
+ void execCNTR_START_REP(Signal* signal);
+ void execCNTR_WAITREP(Signal* signal);
+ void execNODE_FAILREP(Signal* signal);
+ void execSYSTEM_ERROR(Signal* signal);
+
+ // Received signals
+ void execDUMP_STATE_ORD(Signal* signal);
+ void execSTTOR(Signal* signal);
+ void execTCSEIZECONF(Signal* signal);
+ void execTCSEIZEREF(Signal* signal);
+ void execTCRELEASECONF(Signal* signal);
+ void execTCRELEASEREF(Signal* signal);
+ void execTCKEYCONF(Signal* signal);
+ void execTCKEYREF(Signal* signal);
+ void execTCROLLBACKREP(Signal* signal);
+ void execGETGCICONF(Signal* signal);
+ void execDIH_RESTARTCONF(Signal* signal);
+ void execDIH_RESTARTREF(Signal* signal);
+ void execCREATE_TABLE_REF(Signal* signal);
+ void execCREATE_TABLE_CONF(Signal* signal);
+ void execNDB_STTORRY(Signal* signal);
+ void execNDB_STARTCONF(Signal* signal);
+ void execREAD_NODESREQ(Signal* signal);
+ void execNDB_STARTREF(Signal* signal);
+ void execSET_VAR_REQ(Signal* signal);
+
+ void execSTOP_PERM_REF(Signal* signal);
+ void execSTOP_PERM_CONF(Signal* signal);
+
+ void execSTOP_ME_REF(Signal* signal);
+ void execSTOP_ME_CONF(Signal* signal);
+
+ void execWAIT_GCP_REF(Signal* signal);
+ void execWAIT_GCP_CONF(Signal* signal);
+
+ void execSTOP_REQ(Signal* signal);
+ void execRESUME_REQ(Signal* signal);
+
+ void execCHANGE_NODE_STATE_CONF(Signal* signal);
+
+ void execABORT_ALL_REF(Signal* signal);
+ void execABORT_ALL_CONF(Signal* signal);
+
+ // Statement blocks
+ void sendCreateTabReq(Signal* signal, const char* buffer, Uint32 bufLen);
+ void startInsertTransactions(Signal* signal);
+ void initData(Signal* signal);
+ void resetStartVariables(Signal* signal);
+ void sendCntrStartReq(Signal* signal);
+ void sendCntrStartRef(Signal*, Uint32 nodeId, CntrStartRef::ErrorCode);
+ void sendNdbSttor(Signal* signal);
+ void sendSttorry(Signal* signal);
+
+ bool trySystemRestart(Signal* signal);
+ void startWaitingNodes(Signal* signal);
+ CheckNodeGroups::Output checkNodeGroups(Signal*, const NdbNodeBitmask &);
+
+ // Generated statement blocks
+ void systemErrorLab(Signal* signal);
+
+ void createSystableLab(Signal* signal, unsigned index);
+ void crSystab7Lab(Signal* signal);
+ void crSystab8Lab(Signal* signal);
+ void crSystab9Lab(Signal* signal);
+
+ void startPhase1Lab(Signal* signal);
+ void startPhase2Lab(Signal* signal);
+ void startPhase3Lab(Signal* signal);
+ void startPhase4Lab(Signal* signal);
+ void startPhase5Lab(Signal* signal);
+ // jump 2 to resync phase counters
+ void startPhase8Lab(Signal* signal);
+ void startPhase9Lab(Signal* signal);
+ void ph2ALab(Signal* signal);
+ void ph2CLab(Signal* signal);
+ void ph2ELab(Signal* signal);
+ void ph2FLab(Signal* signal);
+ void ph2GLab(Signal* signal);
+ void ph3ALab(Signal* signal);
+ void ph4ALab(Signal* signal);
+ void ph4BLab(Signal* signal);
+ void ph4CLab(Signal* signal);
+ void ph5ALab(Signal* signal);
+ void ph6ALab(Signal* signal);
+ void ph6BLab(Signal* signal);
+ void ph7ALab(Signal* signal);
+ void ph8ALab(Signal* signal);
+
+
+ void waitpoint41Lab(Signal* signal);
+ void waitpoint51Lab(Signal* signal);
+ void waitpoint52Lab(Signal* signal);
+ void waitpoint61Lab(Signal* signal);
+ void waitpoint71Lab(Signal* signal);
+
+ void updateNodeState(Signal* signal, const NodeState & newState) const ;
+ void getNodeGroup(Signal* signal);
+
+ // Initialisation
+ void initData();
+ void initRecords();
+
+ // Variables
+ /**------------------------------------------------------------------------
+ * CONTAIN INFO ABOUT ALL NODES IN CLUSTER. NODE_PTR ARE USED AS NODE NUMBER
+ * IF THE STATE ARE ZDELETE THEN THE NODE DOESN'T EXIST. NODES ARE ALLOWED
+ * TO REGISTER (ZADD) DURING RESTART.
+ *
+ * WHEN THE SYSTEM IS RUNNING THE MASTER WILL CHECK IF ANY NODE HAS MADE
+ * A CNTR_MASTERREQ AND TAKE CARE OF THE REQUEST.
+ * TO CONFIRM THE REQ, THE MASTER DEMANDS THAT ALL RUNNING NODES HAS VOTED
+ * FOR THE NEW NODE.
+ * NODE_PTR:MASTER_REQ IS USED DURING RESTART TO LOG
+ * POSTPONED CNTR_MASTERREQ'S
+ *------------------------------------------------------------------------*/
+ NdbBlocksRec *ndbBlocksRec;
+
+ /*
+ 2.4 COMMON STORED VARIABLES
+ */
+ UintR cgciSystab;
+ UintR ckey;
+ //UintR csystabId;
+ UintR cnoWaitrep6;
+ UintR cnoWaitrep7;
+ UintR ctcConnectionP;
+ UintR ctcReqInfo;
+ Uint8 ctransidPhase;
+ Uint16 cresponses;
+
+ Uint8 cstartPhase;
+ Uint16 cinternalStartphase;
+
+ Uint16 cmasterNodeId;
+ Uint16 cndbBlocksCount;
+ Uint16 cnoStartNodes;
+ UintR cnoWaitrep;
+ NodeState::StartType ctypeOfStart;
+ Uint16 cdynamicNodeId;
+
+ Uint32 c_fsRemoveCount;
+ Uint32 c_nodeGroup;
+ void clearFilesystem(Signal* signal);
+ void execFSREMOVEREF(Signal* signal);
+ void execFSREMOVECONF(Signal* signal);
+
+ NdbNodeBitmask c_allDefinedNodes;
+ NdbNodeBitmask c_clusterNodes; // All members of qmgr cluster
+ NdbNodeBitmask c_startedNodes; // All cntr started nodes
+
+public:
+ struct StopRecord {
+ public:
+ StopRecord(Ndbcntr & _cntr) : cntr(_cntr) {
+ stopReq.senderRef = 0;
+ }
+
+ Ndbcntr & cntr;
+ StopReq stopReq; // Signal data
+ NDB_TICKS stopInitiatedTime; // When was the stop initiated
+
+ bool checkNodeFail(Signal* signal);
+ void checkTimeout(Signal* signal);
+ void checkApiTimeout(Signal* signal);
+ void checkTcTimeout(Signal* signal);
+ void checkLqhTimeout_1(Signal* signal);
+ void checkLqhTimeout_2(Signal* signal);
+
+ BlockNumber number() const { return cntr.number(); }
+ void progError(int line, int cause, const char * extra) {
+ cntr.progError(line, cause, extra);
+ }
+ };
+private:
+ StopRecord c_stopRec;
+ friend struct StopRecord;
+
+ struct Missra {
+ Missra(Ndbcntr & ref) : cntr(ref) { }
+
+ Uint32 currentBlockIndex;
+ Uint32 currentStartPhase;
+ Uint32 nextStartPhase[NO_OF_BLOCKS];
+
+ void execSTART_ORD(Signal* signal);
+ void execSTTORRY(Signal* signal);
+ void sendNextSTTOR(Signal* signal);
+ void execREAD_CONFIG_CONF(Signal* signal);
+ void sendNextREAD_CONFIG_REQ(Signal* signal);
+
+ BlockNumber number() const { return cntr.number(); }
+ void progError(int line, int cause, const char * extra) {
+ cntr.progError(line, cause, extra);
+ }
+ Ndbcntr & cntr;
+ };
+
+ Missra c_missra;
+ friend struct Missra;
+
+ void execSTTORRY(Signal* signal);
+ void execSTART_ORD(Signal* signal);
+ void execREAD_CONFIG_CONF(Signal*);
+
+ friend struct UpgradeStartup;
+};
+
+#endif