1
/* Copyright (C) 2003 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
21
#include <SimulatedBlock.hpp>
22
#include <ndb_limits.h>
23
#include <signaldata/StopReq.hpp>
24
#include <signaldata/ResumeReq.hpp>
25
#include <signaldata/DictTabInfo.hpp>
26
#include <signaldata/CntrStart.hpp>
27
#include <signaldata/CheckNodeGroups.hpp>
29
#include <signaldata/UpgradeStartup.hpp>
31
#include <NodeState.hpp>
43
#define ZNO_NDB_BLOCKS 6 /* ACC, DICT, DIH, LQH, TC, TUP */
45
#define ZNOT_AVAILABLE 913
47
//------- OTHERS ---------------------------------------------
51
#define ZSIZE_NDB_BLOCKS_REC 16 /* MAX BLOCKS IN NDB */
52
#define ZSIZE_SYSTAB 2048
53
#define ZSTART_PHASE_1 1
54
#define ZSTART_PHASE_2 2
55
#define ZSTART_PHASE_3 3
56
#define ZSTART_PHASE_4 4
57
#define ZSTART_PHASE_5 5
58
#define ZSTART_PHASE_6 6
59
#define ZSTART_PHASE_7 7
60
#define ZSTART_PHASE_8 8
61
#define ZSTART_PHASE_9 9
62
#define ZSTART_PHASE_END 255
63
#define ZWAITPOINT_4_1 1
64
#define ZWAITPOINT_4_2 2
65
#define ZWAITPOINT_5_1 3
66
#define ZWAITPOINT_5_2 4
67
#define ZWAITPOINT_6_1 5
68
#define ZWAITPOINT_6_2 6
69
#define ZWAITPOINT_7_1 7
70
#define ZWAITPOINT_7_2 8
71
#define ZSYSTAB_VERSION 1
74
class Ndbcntr: public SimulatedBlock {
78
/* FSREADREQ FSWRITEREQ */
80
* 2.3 RECORDS AND FILESIZES
81
* ------------------------------------------------------------
89
NdbNodeBitmask m_starting;
90
NdbNodeBitmask m_waiting; // == (m_withLog | m_withoutLog)
91
NdbNodeBitmask m_withLog;
92
NdbNodeBitmask m_withoutLog;
94
Uint32 m_lastGciNodeId;
96
Uint64 m_startPartialTimeout;
97
Uint64 m_startPartitionedTimeout;
98
Uint64 m_startFailureTimeout;
102
} m_logNodes[MAX_NDB_NODES];
103
Uint32 m_logNodesCount;
106
struct NdbBlocksRec {
107
BlockReference blockref;
108
}; /* p2c: size = 2 bytes */
110
typedef Ptr<NdbBlocksRec> NdbBlocksRecPtr;
113
* Ndbcntr creates and initializes system tables on initial system start.
114
* The tables are defined in static structs in NdbcntrSysTable.cpp.
120
DictTabInfo::ExtType type;
127
unsigned columnCount;
128
const SysColumn* columnList;
130
DictTabInfo::TableType tableType;
131
DictTabInfo::FragmentType fragmentType;
132
bool tableLoggedFlag;
134
mutable Uint32 tableId;
138
const SysTable* primaryTable;
140
Uint32 columnList[4];
142
DictTabInfo::TableType indexType;
143
DictTabInfo::FragmentType fragmentType;
144
bool indexLoggedFlag;
145
// saved index table id
146
mutable Uint32 indexId;
148
static const SysTable* g_sysTableList[];
149
static const unsigned g_sysTableCount;
151
static const SysTable g_sysTable_SYSTAB_0;
152
static const SysTable g_sysTable_NDBEVENTS_0;
155
Ndbcntr(Block_context&);
159
BLOCK_DEFINES(Ndbcntr);
162
void execAPI_START_REP(Signal*);
163
void execCONTINUEB(Signal* signal);
164
void execREAD_NODESCONF(Signal* signal);
165
void execREAD_NODESREF(Signal* signal);
166
void execCM_ADD_REP(Signal* signal);
167
void execCNTR_START_REQ(Signal* signal);
168
void execCNTR_START_REF(Signal* signal);
169
void execCNTR_START_CONF(Signal* signal);
170
void execCNTR_START_REP(Signal* signal);
171
void execCNTR_WAITREP(Signal* signal);
172
void execNODE_FAILREP(Signal* signal);
173
void execSYSTEM_ERROR(Signal* signal);
176
void execDUMP_STATE_ORD(Signal* signal);
177
void execREAD_CONFIG_REQ(Signal* signal);
178
void execSTTOR(Signal* signal);
179
void execTCSEIZECONF(Signal* signal);
180
void execTCSEIZEREF(Signal* signal);
181
void execTCRELEASECONF(Signal* signal);
182
void execTCRELEASEREF(Signal* signal);
183
void execTCKEYCONF(Signal* signal);
184
void execTCKEYREF(Signal* signal);
185
void execTCROLLBACKREP(Signal* signal);
186
void execGETGCICONF(Signal* signal);
187
void execDIH_RESTARTCONF(Signal* signal);
188
void execDIH_RESTARTREF(Signal* signal);
189
void execCREATE_TABLE_REF(Signal* signal);
190
void execCREATE_TABLE_CONF(Signal* signal);
191
void execNDB_STTORRY(Signal* signal);
192
void execNDB_STARTCONF(Signal* signal);
193
void execREAD_NODESREQ(Signal* signal);
194
void execNDB_STARTREF(Signal* signal);
196
void execSTOP_PERM_REF(Signal* signal);
197
void execSTOP_PERM_CONF(Signal* signal);
199
void execSTOP_ME_REF(Signal* signal);
200
void execSTOP_ME_CONF(Signal* signal);
202
void execWAIT_GCP_REF(Signal* signal);
203
void execWAIT_GCP_CONF(Signal* signal);
205
void execSTOP_REQ(Signal* signal);
206
void execSTOP_CONF(Signal* signal);
207
void execRESUME_REQ(Signal* signal);
209
void execCHANGE_NODE_STATE_CONF(Signal* signal);
211
void execABORT_ALL_REF(Signal* signal);
212
void execABORT_ALL_CONF(Signal* signal);
215
void sendCreateTabReq(Signal* signal, const char* buffer, Uint32 bufLen);
216
void startInsertTransactions(Signal* signal);
217
void initData(Signal* signal);
218
void resetStartVariables(Signal* signal);
219
void sendCntrStartReq(Signal* signal);
220
void sendCntrStartRef(Signal*, Uint32 nodeId, CntrStartRef::ErrorCode);
221
void sendNdbSttor(Signal* signal);
222
void sendSttorry(Signal* signal);
224
bool trySystemRestart(Signal* signal);
225
void startWaitingNodes(Signal* signal);
226
CheckNodeGroups::Output checkNodeGroups(Signal*, const NdbNodeBitmask &);
228
// Generated statement blocks
229
void systemErrorLab(Signal* signal, int line);
231
void createSystableLab(Signal* signal, unsigned index);
232
void crSystab7Lab(Signal* signal);
233
void crSystab8Lab(Signal* signal);
234
void crSystab9Lab(Signal* signal);
236
void startPhase1Lab(Signal* signal);
237
void startPhase2Lab(Signal* signal);
238
void startPhase3Lab(Signal* signal);
239
void startPhase4Lab(Signal* signal);
240
void startPhase5Lab(Signal* signal);
241
// jump 2 to resync phase counters
242
void startPhase8Lab(Signal* signal);
243
void startPhase9Lab(Signal* signal);
244
void ph2ALab(Signal* signal);
245
void ph2CLab(Signal* signal);
246
void ph2ELab(Signal* signal);
247
void ph2FLab(Signal* signal);
248
void ph2GLab(Signal* signal);
249
void ph3ALab(Signal* signal);
250
void ph4ALab(Signal* signal);
251
void ph4BLab(Signal* signal);
252
void ph4CLab(Signal* signal);
253
void ph5ALab(Signal* signal);
254
void ph6ALab(Signal* signal);
255
void ph6BLab(Signal* signal);
256
void ph7ALab(Signal* signal);
257
void ph8ALab(Signal* signal);
260
void waitpoint41Lab(Signal* signal);
261
void waitpoint51Lab(Signal* signal);
262
void waitpoint52Lab(Signal* signal);
263
void waitpoint61Lab(Signal* signal);
264
void waitpoint71Lab(Signal* signal);
266
void updateNodeState(Signal* signal, const NodeState & newState) const ;
267
void getNodeGroup(Signal* signal);
274
/**------------------------------------------------------------------------
275
* CONTAIN INFO ABOUT ALL NODES IN CLUSTER. NODE_PTR ARE USED AS NODE NUMBER
276
* IF THE STATE ARE ZDELETE THEN THE NODE DOESN'T EXIST. NODES ARE ALLOWED
277
* TO REGISTER (ZADD) DURING RESTART.
279
* WHEN THE SYSTEM IS RUNNING THE MASTER WILL CHECK IF ANY NODE HAS MADE
280
* A CNTR_MASTERREQ AND TAKE CARE OF THE REQUEST.
281
* TO CONFIRM THE REQ, THE MASTER DEMANDS THAT ALL RUNNING NODES HAS VOTED
283
* NODE_PTR:MASTER_REQ IS USED DURING RESTART TO LOG
284
* POSTPONED CNTR_MASTERREQ'S
285
*------------------------------------------------------------------------*/
286
NdbBlocksRec *ndbBlocksRec;
289
2.4 COMMON STORED VARIABLES
296
UintR ctcConnectionP;
302
Uint16 cinternalStartphase;
304
Uint16 cmasterNodeId;
305
Uint16 cndbBlocksCount;
306
Uint16 cnoStartNodes;
308
NodeState::StartType ctypeOfStart;
309
Uint16 cdynamicNodeId;
311
Uint32 c_fsRemoveCount;
313
void clearFilesystem(Signal* signal);
314
void execFSREMOVECONF(Signal* signal);
316
NdbNodeBitmask c_allDefinedNodes;
317
NdbNodeBitmask c_clusterNodes; // All members of qmgr cluster
318
NdbNodeBitmask c_startedNodes; // All cntr started nodes
323
StopRecord(Ndbcntr & _cntr) : cntr(_cntr) {
324
stopReq.senderRef = 0;
328
StopReq stopReq; // Signal data
329
NDB_TICKS stopInitiatedTime; // When was the stop initiated
331
bool checkNodeFail(Signal* signal);
332
void checkTimeout(Signal* signal);
333
void checkApiTimeout(Signal* signal);
334
void checkTcTimeout(Signal* signal);
335
void checkLqhTimeout_1(Signal* signal);
336
void checkLqhTimeout_2(Signal* signal);
338
BlockNumber number() const { return cntr.number(); }
339
void progError(int line, int cause, const char * extra) {
340
cntr.progError(line, cause, extra);
344
SR_BLOCK_GCP_START_GCP = 0,
345
SR_WAIT_COMPLETE_GCP = 1,
346
SR_UNBLOCK_GCP_START_GCP = 2,
347
SR_QMGR_STOP_REQ = 3,
348
SR_WAIT_NODE_FAILURES = 4,
349
SR_CLUSTER_SHUTDOWN = 12
351
SignalCounter m_stop_req_counter;
354
StopRecord c_stopRec;
355
friend struct StopRecord;
358
Missra(Ndbcntr & ref) : cntr(ref) { }
360
Uint32 currentBlockIndex;
361
Uint32 currentStartPhase;
362
Uint32 nextStartPhase[NO_OF_BLOCKS];
364
void execSTART_ORD(Signal* signal);
365
void execSTTORRY(Signal* signal);
366
void sendNextSTTOR(Signal* signal);
367
void execREAD_CONFIG_CONF(Signal* signal);
368
void sendNextREAD_CONFIG_REQ(Signal* signal);
370
BlockNumber number() const { return cntr.number(); }
371
void progError(int line, int cause, const char * extra) {
372
cntr.progError(line, cause, extra);
378
friend struct Missra;
380
void execSTTORRY(Signal* signal);
381
void execSTART_ORD(Signal* signal);
382
void execREAD_CONFIG_CONF(Signal*);
384
friend struct UpgradeStartup;