MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Ndbcntr.hpp
1 /*
2  Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; version 2 of the License.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #ifndef NDBCNTR_H
19 #define NDBCNTR_H
20 
21 
22 #include <pc.hpp>
23 #include <SimulatedBlock.hpp>
24 #include <ndb_limits.h>
25 #include <signaldata/StopReq.hpp>
26 #include <signaldata/ResumeReq.hpp>
27 #include <signaldata/DictTabInfo.hpp>
28 #include <signaldata/CntrStart.hpp>
29 #include <signaldata/CheckNodeGroups.hpp>
30 
31 #include <NodeState.hpp>
32 #include <NdbTick.h>
33 
34 #ifdef NDBCNTR_C
35 /*
36 2.1 GLOBAL SYMBOLS
37 ------------------
38 */
39 /*
40 2.2 LOCAL SYMBOLS
41 -----------------
42 */
43 #define ZNO_NDB_BLOCKS 6 /* ACC, DICT, DIH, LQH, TC, TUP */
44 
45 #define ZNOT_AVAILABLE 913
46 
47 //------- OTHERS ---------------------------------------------
48 #define ZSTARTUP 1
49 #define ZSHUTDOWN 2
50 #define ZBLOCK_STTOR 3
51 
52 #define ZSIZE_NDB_BLOCKS_REC 16 /* MAX BLOCKS IN NDB */
53 #define ZSIZE_SYSTAB 2048
54 #define ZSTART_PHASE_1 1
55 #define ZSTART_PHASE_2 2
56 #define ZSTART_PHASE_3 3
57 #define ZSTART_PHASE_4 4
58 #define ZSTART_PHASE_5 5
59 #define ZSTART_PHASE_6 6
60 #define ZSTART_PHASE_7 7
61 #define ZSTART_PHASE_8 8
62 #define ZSTART_PHASE_9 9
63 #define ZSTART_PHASE_END 255
64 #endif
65 
66 class Ndbcntr: public SimulatedBlock {
67 public:
68 // Records
69 
70 /* FSREADREQ FSWRITEREQ */
76  struct StartRecord {
77  StartRecord() {}
78  Uint64 m_startTime;
79 
80  void reset();
81  NdbNodeBitmask m_starting;
82  NdbNodeBitmask m_waiting; // == (m_withLog | m_withoutLog | m_waitTO)
83  NdbNodeBitmask m_withLog;
84  NdbNodeBitmask m_withoutLog;
85  NdbNodeBitmask m_waitTO;
86  Uint32 m_lastGci;
87  Uint32 m_lastGciNodeId;
88 
89  Uint64 m_startPartialTimeout;
90  Uint64 m_startPartitionedTimeout;
91  Uint64 m_startFailureTimeout;
92  struct {
93  Uint32 m_nodeId;
94  Uint32 m_lastGci;
95  } m_logNodes[MAX_NDB_NODES];
96  Uint32 m_logNodesCount;
97 
98  Uint32 m_wait_sp[MAX_NDB_NODES];
99  } c_start;
100 
101  struct NdbBlocksRec {
102  BlockReference blockref;
103  }; /* p2c: size = 2 bytes */
104 
106 
111  struct SysColumn {
112  unsigned pos;
113  const char* name;
114  // DictTabInfo
115  DictTabInfo::ExtType type;
116  Uint32 length;
117  bool keyFlag;
118  bool nullable;
119  };
120  struct SysTable {
121  const char* name;
122  unsigned columnCount;
123  const SysColumn* columnList;
124  // DictTabInfo
125  DictTabInfo::TableType tableType;
126  DictTabInfo::FragmentType fragmentType;
127  bool tableLoggedFlag;
128  // saved table id
129  mutable Uint32 tableId;
130  mutable Uint32 tableVersion;
131  };
132  struct SysIndex {
133  const char* name;
134  const SysTable* primaryTable;
135  Uint32 columnCount;
136  Uint32 columnList[4];
137  // DictTabInfo
138  DictTabInfo::TableType indexType;
139  DictTabInfo::FragmentType fragmentType;
140  bool indexLoggedFlag;
141  // saved index table id
142  mutable Uint32 indexId;
143  };
144  static const SysTable* g_sysTableList[];
145  static const unsigned g_sysTableCount;
146  // the system tables
147  static const SysTable g_sysTable_SYSTAB_0;
148  static SysTable g_sysTable_NDBEVENTS_0;
149  // schema trans
150  Uint32 c_schemaTransId;
151  Uint32 c_schemaTransKey;
152  Uint32 c_hashMapId;
153  Uint32 c_hashMapVersion;
154 
155 public:
157  virtual ~Ndbcntr();
158 
159 private:
160  BLOCK_DEFINES(Ndbcntr);
161 
162  // Transit signals
163  void execAPI_START_REP(Signal*);
164  void execCONTINUEB(Signal* signal);
165  void execREAD_NODESCONF(Signal* signal);
166  void execREAD_NODESREF(Signal* signal);
167  void execCM_ADD_REP(Signal* signal);
168  void execCNTR_START_REQ(Signal* signal);
169  void execCNTR_START_REF(Signal* signal);
170  void execCNTR_START_CONF(Signal* signal);
171  void execCNTR_START_REP(Signal* signal);
172  void execCNTR_WAITREP(Signal* signal);
173  void execNODE_FAILREP(Signal* signal);
174  void execSYSTEM_ERROR(Signal* signal);
175 
176  void execSTART_PERMREP(Signal*);
177 
178  // Received signals
179  void execDUMP_STATE_ORD(Signal* signal);
180  void execREAD_CONFIG_REQ(Signal* signal);
181  void execSTTOR(Signal* signal);
182  void execTCSEIZECONF(Signal* signal);
183  void execTCSEIZEREF(Signal* signal);
184  void execTCRELEASECONF(Signal* signal);
185  void execTCRELEASEREF(Signal* signal);
186  void execTCKEYCONF(Signal* signal);
187  void execTCKEYREF(Signal* signal);
188  void execTCROLLBACKREP(Signal* signal);
189  void execGETGCICONF(Signal* signal);
190  void execDIH_RESTARTCONF(Signal* signal);
191  void execDIH_RESTARTREF(Signal* signal);
192  void execSCHEMA_TRANS_BEGIN_CONF(Signal* signal);
193  void execSCHEMA_TRANS_BEGIN_REF(Signal* signal);
194  void execSCHEMA_TRANS_END_CONF(Signal* signal);
195  void execSCHEMA_TRANS_END_REF(Signal* signal);
196  void execCREATE_TABLE_REF(Signal* signal);
197  void execCREATE_TABLE_CONF(Signal* signal);
198  void execCREATE_HASH_MAP_REF(Signal* signal);
199  void execCREATE_HASH_MAP_CONF(Signal* signal);
200  void execCREATE_FILEGROUP_REF(Signal* signal);
201  void execCREATE_FILEGROUP_CONF(Signal* signal);
202  void execCREATE_FILE_REF(Signal* signal);
203  void execCREATE_FILE_CONF(Signal* signal);
204  void execNDB_STTORRY(Signal* signal);
205  void execNDB_STARTCONF(Signal* signal);
206  void execREAD_NODESREQ(Signal* signal);
207  void execNDB_STARTREF(Signal* signal);
208 
209  void execSTOP_PERM_REF(Signal* signal);
210  void execSTOP_PERM_CONF(Signal* signal);
211 
212  void execSTOP_ME_REF(Signal* signal);
213  void execSTOP_ME_CONF(Signal* signal);
214 
215  void execWAIT_GCP_REF(Signal* signal);
216  void execWAIT_GCP_CONF(Signal* signal);
217 
218  void execSTOP_REQ(Signal* signal);
219  void execSTOP_CONF(Signal* signal);
220  void execRESUME_REQ(Signal* signal);
221 
222  void execCHANGE_NODE_STATE_CONF(Signal* signal);
223 
224  void execABORT_ALL_REF(Signal* signal);
225  void execABORT_ALL_CONF(Signal* signal);
226 
227  // Statement blocks
228  void beginSchemaTransLab(Signal* signal);
229  void endSchemaTransLab(Signal* signal);
230  void sendCreateTabReq(Signal* signal, const char* buffer, Uint32 bufLen);
231  void startInsertTransactions(Signal* signal);
232  void initData(Signal* signal);
233  void resetStartVariables(Signal* signal);
234  void sendCntrStartReq(Signal* signal);
235  void sendCntrStartRef(Signal*, Uint32 nodeId, CntrStartRef::ErrorCode);
236  void sendNdbSttor(Signal* signal);
237  void sendSttorry(Signal* signal);
238 
239  bool trySystemRestart(Signal* signal);
240  void startWaitingNodes(Signal* signal);
241  CheckNodeGroups::Output checkNodeGroups(Signal*, const NdbNodeBitmask &);
242 
243  // Generated statement blocks
244  void systemErrorLab(Signal* signal, int line);
245 
246  void createHashMap(Signal*, Uint32 index);
247  void createSystableLab(Signal* signal, unsigned index);
248  void createDDObjects(Signal*, unsigned index);
249  void crSystab7Lab(Signal* signal);
250  void crSystab8Lab(Signal* signal);
251  void crSystab9Lab(Signal* signal);
252 
253  void startPhase1Lab(Signal* signal);
254  void startPhase2Lab(Signal* signal);
255  void startPhase3Lab(Signal* signal);
256  void startPhase4Lab(Signal* signal);
257  void startPhase5Lab(Signal* signal);
258  // jump 2 to resync phase counters
259  void startPhase8Lab(Signal* signal);
260  void startPhase9Lab(Signal* signal);
261  void ph2ALab(Signal* signal);
262  void ph2CLab(Signal* signal);
263  void ph2ELab(Signal* signal);
264  void ph2FLab(Signal* signal);
265  void ph2GLab(Signal* signal);
266  void ph3ALab(Signal* signal);
267  void ph4ALab(Signal* signal);
268  void ph4BLab(Signal* signal);
269  void ph4CLab(Signal* signal);
270  void ph5ALab(Signal* signal);
271  void ph6ALab(Signal* signal);
272  void ph6BLab(Signal* signal);
273  void ph7ALab(Signal* signal);
274  void ph8ALab(Signal* signal);
275 
276  void waitpoint41Lab(Signal* signal);
277  void waitpoint51Lab(Signal* signal);
278  void waitpoint52Lab(Signal* signal);
279  void waitpoint61Lab(Signal* signal);
280  void waitpoint71Lab(Signal* signal);
281  void waitpoint42To(Signal* signal);
282 
287  bool wait_sp(Signal*, Uint32 sp);
288  void wait_sp_rep(Signal*);
289 
290  void execSTART_COPYREF(Signal*);
291  void execSTART_COPYCONF(Signal*);
292 
293  void execCREATE_NODEGROUP_IMPL_REQ(Signal*);
294  void execDROP_NODEGROUP_IMPL_REQ(Signal*);
295 
296  void updateNodeState(Signal* signal, const NodeState & newState) const ;
297  void getNodeGroup(Signal* signal);
298 
299  // Initialisation
300  void initData();
301  void initRecords();
302 
303  // Variables
316  NdbBlocksRec *ndbBlocksRec;
317 
318  /*
319  2.4 COMMON STORED VARIABLES
320  */
321  UintR cgciSystab;
322  UintR ckey;
323  //UintR csystabId;
324  UintR cnoWaitrep6;
325  UintR cnoWaitrep7;
326  UintR ctcConnectionP;
327  Uint32 ctcReference;
328  UintR ctcReqInfo;
329  Uint8 ctransidPhase;
330  Uint16 cresponses;
331 
332  Uint8 cstartPhase;
333  Uint16 cinternalStartphase;
334 
335  bool m_cntr_start_conf;
336  Uint16 cmasterNodeId;
337  Uint16 cndbBlocksCount;
338  Uint16 cnoStartNodes;
339  UintR cnoWaitrep;
340  NodeState::StartType ctypeOfStart;
341  NodeState::StartType cdihStartType;
342  Uint16 cdynamicNodeId;
343 
344  Uint32 c_fsRemoveCount;
345  Uint32 c_nodeGroup;
346  void clearFilesystem(Signal* signal);
347  void execFSREMOVECONF(Signal* signal);
348 
349  NdbNodeBitmask c_allDefinedNodes;
350  NdbNodeBitmask c_clusterNodes; // All members of qmgr cluster
351  NdbNodeBitmask c_startedNodes; // All cntr started nodes
352 
353 public:
354  struct StopRecord {
355  public:
356  StopRecord(Ndbcntr & _cntr) : cntr(_cntr) {
357  stopReq.senderRef = 0;
358  }
359 
360  Ndbcntr & cntr;
361  StopReq stopReq; // Signal data
362  NDB_TICKS stopInitiatedTime; // When was the stop initiated
363 
364  bool checkNodeFail(Signal* signal);
365  void checkTimeout(Signal* signal);
366  void checkApiTimeout(Signal* signal);
367  void checkTcTimeout(Signal* signal);
368  void checkLqhTimeout_1(Signal* signal);
369  void checkLqhTimeout_2(Signal* signal);
370 
371  BlockNumber number() const { return cntr.number(); }
372  EmulatedJamBuffer *jamBuffer() const { return cntr.jamBuffer(); }
373  void progError(int line, int cause, const char * extra) {
374  cntr.progError(line, cause, extra);
375  }
376 
377  enum StopNodesStep {
378  SR_BLOCK_GCP_START_GCP = 0,
379  SR_WAIT_COMPLETE_GCP = 1,
380  SR_UNBLOCK_GCP_START_GCP = 2,
381  SR_QMGR_STOP_REQ = 3,
382  SR_WAIT_NODE_FAILURES = 4,
383  SR_CLUSTER_SHUTDOWN = 12
384  } m_state;
385  SignalCounter m_stop_req_counter;
386  };
387 private:
388  StopRecord c_stopRec;
389  friend struct StopRecord;
390 
391  struct Missra {
392  Missra(Ndbcntr & ref) : cntr(ref) { }
393 
394  Uint32 currentBlockIndex;
395  Uint32 currentStartPhase;
396  Uint32 nextStartPhase[NO_OF_BLOCKS];
397 
398  void execSTART_ORD(Signal* signal);
399  void execSTTORRY(Signal* signal);
400  void sendNextSTTOR(Signal* signal);
401  void execREAD_CONFIG_CONF(Signal* signal);
402  void sendNextREAD_CONFIG_REQ(Signal* signal);
403 
404  BlockNumber number() const { return cntr.number(); }
405  EmulatedJamBuffer *jamBuffer() const { return cntr.jamBuffer(); }
406  void progError(int line, int cause, const char * extra) {
407  cntr.progError(line, cause, extra);
408  }
409  Ndbcntr & cntr;
410  };
411 
412  Missra c_missra;
413  friend struct Missra;
414 
415  void execSTTORRY(Signal* signal);
416  void execSTART_ORD(Signal* signal);
417  void execREAD_CONFIG_CONF(Signal*);
418 };
419 
420 #endif