~ubuntu-branches/ubuntu/precise/mysql-5.1/precise

« back to all changes in this revision

Viewing changes to storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Tretkowski
  • Date: 2010-03-17 14:56:02 UTC
  • Revision ID: james.westby@ubuntu.com-20100317145602-x7e30l1b2sb5s6w6
Tags: upstream-5.1.45
ImportĀ upstreamĀ versionĀ 5.1.45

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 2003 MySQL AB
 
2
 
 
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.
 
6
 
 
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.
 
11
 
 
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 */
 
15
 
 
16
#define NDBCNTR_C
 
17
#include "Ndbcntr.hpp"
 
18
 
 
19
#include <ndb_limits.h>
 
20
#include <ndb_version.h>
 
21
#include <SimpleProperties.hpp>
 
22
#include <signaldata/DictTabInfo.hpp>
 
23
#include <signaldata/CreateTable.hpp>
 
24
#include <signaldata/ReadNodesConf.hpp>
 
25
#include <signaldata/NodeFailRep.hpp>
 
26
#include <signaldata/TcKeyReq.hpp>
 
27
#include <signaldata/TcKeyConf.hpp>
 
28
#include <signaldata/EventReport.hpp>
 
29
#include <signaldata/NodeStateSignalData.hpp>
 
30
#include <signaldata/StopPerm.hpp>
 
31
#include <signaldata/StopMe.hpp>
 
32
#include <signaldata/WaitGCP.hpp>
 
33
#include <signaldata/CheckNodeGroups.hpp>
 
34
#include <signaldata/StartOrd.hpp>
 
35
#include <signaldata/AbortAll.hpp>
 
36
#include <signaldata/SystemError.hpp>
 
37
#include <signaldata/NdbSttor.hpp>
 
38
#include <signaldata/CntrStart.hpp>
 
39
#include <signaldata/DumpStateOrd.hpp>
 
40
 
 
41
#include <signaldata/FsRemoveReq.hpp>
 
42
#include <signaldata/ReadConfig.hpp>
 
43
 
 
44
#include <signaldata/FailRep.hpp>
 
45
 
 
46
#include <AttributeHeader.hpp>
 
47
#include <Configuration.hpp>
 
48
#include <DebuggerNames.hpp>
 
49
 
 
50
#include <NdbOut.hpp>
 
51
#include <NdbTick.h>
 
52
 
 
53
// used during shutdown for reporting current startphase
 
54
// accessed from Emulator.cpp, NdbShutdown()
 
55
Uint32 g_currentStartPhase;
 
56
 
 
57
/**
 
58
 * ALL_BLOCKS Used during start phases and while changing node state
 
59
 *
 
60
 * NDBFS_REF Has to be before NDBCNTR_REF (due to "ndb -i" stuff)
 
61
 */
 
62
struct BlockInfo {
 
63
  BlockReference Ref; // BlockReference
 
64
  Uint32 NextSP;            // Next start phase
 
65
  Uint32 ErrorInsertStart;
 
66
  Uint32 ErrorInsertStop;
 
67
};
 
68
 
 
69
static BlockInfo ALL_BLOCKS[] = { 
 
70
  { NDBFS_REF,   0 ,  2000,  2999 },
 
71
  { DBTC_REF,    1 ,  8000,  8035 },
 
72
  { DBDIH_REF,   1 ,  7000,  7173 },
 
73
  { DBLQH_REF,   1 ,  5000,  5030 },
 
74
  { DBACC_REF,   1 ,  3000,  3999 },
 
75
  { DBTUP_REF,   1 ,  4000,  4007 },
 
76
  { DBDICT_REF,  1 ,  6000,  6003 },
 
77
  { NDBCNTR_REF, 0 ,  1000,  1999 },
 
78
  { CMVMI_REF,   1 ,  9000,  9999 }, // before QMGR
 
79
  { QMGR_REF,    1 ,     1,   999 },
 
80
  { TRIX_REF,    1 ,     0,     0 },
 
81
  { BACKUP_REF,  1 , 10000, 10999 },
 
82
  { DBUTIL_REF,  1 , 11000, 11999 },
 
83
  { SUMA_REF,    1 , 13000, 13999 },
 
84
  { DBTUX_REF,   1 , 12000, 12999 }
 
85
  ,{ TSMAN_REF,  1 ,     0,     0 }
 
86
  ,{ LGMAN_REF,  1 ,     0,     0 }
 
87
  ,{ PGMAN_REF,  1 ,     0,     0 }
 
88
  ,{ RESTORE_REF,1 ,     0,     0 }
 
89
};
 
90
 
 
91
static const Uint32 ALL_BLOCKS_SZ = sizeof(ALL_BLOCKS)/sizeof(BlockInfo);
 
92
 
 
93
static BlockReference readConfigOrder[ALL_BLOCKS_SZ] = {
 
94
  CMVMI_REF,
 
95
  DBTUP_REF,
 
96
  DBACC_REF,
 
97
  DBTC_REF,
 
98
  DBLQH_REF,
 
99
  DBTUX_REF,
 
100
  DBDICT_REF,
 
101
  DBDIH_REF,
 
102
  NDBFS_REF,
 
103
  NDBCNTR_REF,
 
104
  QMGR_REF,
 
105
  TRIX_REF,
 
106
  BACKUP_REF,
 
107
  DBUTIL_REF,
 
108
  SUMA_REF,
 
109
  TSMAN_REF,
 
110
  LGMAN_REF,
 
111
  PGMAN_REF,
 
112
  RESTORE_REF
 
113
};
 
114
 
 
115
/*******************************/
 
116
/*  CONTINUEB                  */
 
117
/*******************************/
 
118
void Ndbcntr::execCONTINUEB(Signal* signal) 
 
119
{
 
120
  jamEntry();
 
121
  UintR Ttemp1 = signal->theData[0];
 
122
  switch (Ttemp1) {
 
123
  case ZSTARTUP:{
 
124
    if(getNodeState().startLevel == NodeState::SL_STARTED){
 
125
      jam();
 
126
      return;
 
127
    }
 
128
    
 
129
    if(cmasterNodeId == getOwnNodeId() && c_start.m_starting.isclear()){
 
130
      jam();
 
131
      trySystemRestart(signal);
 
132
      // Fall-through
 
133
    }
 
134
    
 
135
    Uint64 now = NdbTick_CurrentMillisecond();
 
136
    if(now > c_start.m_startFailureTimeout)
 
137
    {
 
138
      jam();
 
139
      Uint32 to_3= 0;
 
140
      const ndb_mgm_configuration_iterator * p = 
 
141
        m_ctx.m_config.getOwnConfigIterator();
 
142
      ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3);
 
143
      BaseString tmp;
 
144
      tmp.append("Shutting down node as total restart time exceeds "
 
145
                 " StartFailureTimeout as set in config file ");
 
146
      if(to_3 == 0)
 
147
        tmp.append(" 0 (inifinite)");
 
148
      else
 
149
        tmp.appfmt(" %d", to_3);
 
150
      
 
151
      progError(__LINE__, NDBD_EXIT_RESTART_TIMEOUT, tmp.c_str());
 
152
    }
 
153
    
 
154
    signal->theData[0] = ZSTARTUP;
 
155
    sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1);
 
156
    break;
 
157
  }
 
158
  case ZSHUTDOWN:
 
159
    jam();
 
160
    c_stopRec.checkTimeout(signal);
 
161
    break;
 
162
  default:
 
163
    jam();
 
164
    systemErrorLab(signal, __LINE__);
 
165
    return;
 
166
    break;
 
167
  }//switch
 
168
}//Ndbcntr::execCONTINUEB()
 
169
 
 
170
void
 
171
Ndbcntr::execAPI_START_REP(Signal* signal)
 
172
{
 
173
  if(refToBlock(signal->getSendersBlockRef()) == QMGR)
 
174
  {
 
175
    for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
 
176
      sendSignal(ALL_BLOCKS[i].Ref, GSN_API_START_REP, signal, 1, JBB);
 
177
    }
 
178
  }
 
179
}
 
180
/*******************************/
 
181
/*  SYSTEM_ERROR               */
 
182
/*******************************/
 
183
void Ndbcntr::execSYSTEM_ERROR(Signal* signal) 
 
184
{
 
185
  const SystemError * const sysErr = (SystemError *)signal->getDataPtr();
 
186
  char buf[100];
 
187
  int killingNode = refToNode(sysErr->errorRef);
 
188
  Uint32 data1 = sysErr->data1;
 
189
  
 
190
  jamEntry();
 
191
  switch (sysErr->errorCode){
 
192
  case SystemError::GCPStopDetected:
 
193
    BaseString::snprintf(buf, sizeof(buf), 
 
194
             "Node %d killed this node because "
 
195
             "GCP stop was detected",     
 
196
             killingNode);
 
197
    break;
 
198
 
 
199
  case SystemError::CopyFragRefError:
 
200
    CRASH_INSERTION(1000);
 
201
    BaseString::snprintf(buf, sizeof(buf), 
 
202
                         "Killed by node %d as "
 
203
                         "copyfrag failed, error: %u",
 
204
                         killingNode, data1);
 
205
    break;
 
206
 
 
207
  case SystemError::StartFragRefError:
 
208
    BaseString::snprintf(buf, sizeof(buf), 
 
209
                         "Node %d killed this node because "
 
210
                         "it replied StartFragRef error code: %u.",
 
211
                         killingNode, data1);
 
212
    break;
 
213
    
 
214
  case SystemError::CopySubscriptionRef:
 
215
    BaseString::snprintf(buf, sizeof(buf), 
 
216
             "Node %d killed this node because "
 
217
             "it could not copy a subscription during node restart. "
 
218
             "Copy subscription error code: %u.",
 
219
             killingNode, data1);
 
220
    break;
 
221
  case SystemError::CopySubscriberRef:
 
222
    BaseString::snprintf(buf, sizeof(buf), 
 
223
             "Node %d killed this node because "
 
224
             "it could not start a subscriber during node restart. "
 
225
             "Copy subscription error code: %u.",
 
226
             killingNode, data1);
 
227
    break;
 
228
  default:
 
229
    BaseString::snprintf(buf, sizeof(buf), "System error %d, "
 
230
             " this node was killed by node %d", 
 
231
             sysErr->errorCode, killingNode);
 
232
    break;
 
233
  }
 
234
 
 
235
  progError(__LINE__, NDBD_EXIT_SYSTEM_ERROR, buf);
 
236
  return;
 
237
}//Ndbcntr::execSYSTEM_ERROR()
 
238
 
 
239
void 
 
240
Ndbcntr::execREAD_CONFIG_REQ(Signal* signal)
 
241
{
 
242
  jamEntry();
 
243
 
 
244
  const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr();
 
245
 
 
246
  Uint32 ref = req->senderRef;
 
247
  Uint32 senderData = req->senderData;
 
248
 
 
249
  const ndb_mgm_configuration_iterator * p = 
 
250
    m_ctx.m_config.getOwnConfigIterator();
 
251
  ndbrequire(p != 0);
 
252
 
 
253
  ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
 
254
  conf->senderRef = reference();
 
255
  conf->senderData = senderData;
 
256
  sendSignal(ref, GSN_READ_CONFIG_CONF, signal, 
 
257
             ReadConfigConf::SignalLength, JBB);
 
258
}
 
259
 
 
260
void Ndbcntr::execSTTOR(Signal* signal) 
 
261
{
 
262
  jamEntry();
 
263
  cstartPhase = signal->theData[1];
 
264
 
 
265
  cndbBlocksCount = 0;
 
266
  cinternalStartphase = cstartPhase - 1;
 
267
 
 
268
  switch (cstartPhase) {
 
269
  case 0:
 
270
    if(m_ctx.m_config.getInitialStart()){
 
271
      jam();
 
272
      c_fsRemoveCount = 0;
 
273
      clearFilesystem(signal);
 
274
      return;
 
275
    }
 
276
    sendSttorry(signal);
 
277
    break;
 
278
  case ZSTART_PHASE_1:
 
279
    jam();
 
280
    {
 
281
      Uint32 db_watchdog_interval = 0;
 
282
      const ndb_mgm_configuration_iterator * p = 
 
283
        m_ctx.m_config.getOwnConfigIterator();
 
284
      ndb_mgm_get_int_parameter(p, CFG_DB_WATCHDOG_INTERVAL, &db_watchdog_interval);
 
285
      ndbrequire(db_watchdog_interval);
 
286
      update_watch_dog_timer(db_watchdog_interval);
 
287
    }
 
288
    startPhase1Lab(signal);
 
289
    break;
 
290
  case ZSTART_PHASE_2:
 
291
    jam();
 
292
    startPhase2Lab(signal);
 
293
    break;
 
294
  case ZSTART_PHASE_3:
 
295
    jam();
 
296
    startPhase3Lab(signal);
 
297
    break;
 
298
  case ZSTART_PHASE_4:
 
299
    jam();
 
300
    startPhase4Lab(signal);
 
301
    break;
 
302
  case ZSTART_PHASE_5:
 
303
    jam();
 
304
    startPhase5Lab(signal);
 
305
    break;
 
306
  case 6:
 
307
    jam();
 
308
    getNodeGroup(signal);
 
309
    // Fall through
 
310
    break;
 
311
  case ZSTART_PHASE_8:
 
312
    jam();
 
313
    startPhase8Lab(signal);
 
314
    break;
 
315
  case ZSTART_PHASE_9:
 
316
    jam();
 
317
    startPhase9Lab(signal);
 
318
    break;
 
319
  default:
 
320
    jam();
 
321
    sendSttorry(signal);
 
322
    break;
 
323
  }//switch
 
324
}//Ndbcntr::execSTTOR()
 
325
 
 
326
void
 
327
Ndbcntr::getNodeGroup(Signal* signal){
 
328
  jam();
 
329
  CheckNodeGroups * sd = (CheckNodeGroups*)signal->getDataPtrSend();
 
330
  sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::GetNodeGroup;
 
331
  EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, 
 
332
                 CheckNodeGroups::SignalLength);
 
333
  jamEntry();
 
334
  c_nodeGroup = sd->output;
 
335
  sendSttorry(signal);
 
336
}
 
337
 
 
338
/*******************************/
 
339
/*  NDB_STTORRY                */
 
340
/*******************************/
 
341
void Ndbcntr::execNDB_STTORRY(Signal* signal) 
 
342
{
 
343
  jamEntry();
 
344
  switch (cstartPhase) {
 
345
  case ZSTART_PHASE_2:
 
346
    jam();
 
347
    ph2GLab(signal);
 
348
    return;
 
349
    break;
 
350
  case ZSTART_PHASE_3:
 
351
    jam();
 
352
    ph3ALab(signal);
 
353
    return;
 
354
    break;
 
355
  case ZSTART_PHASE_4:
 
356
    jam();
 
357
    ph4BLab(signal);
 
358
    return;
 
359
    break;
 
360
  case ZSTART_PHASE_5:
 
361
    jam();
 
362
    ph5ALab(signal);
 
363
    return;
 
364
    break;
 
365
  case ZSTART_PHASE_6:
 
366
    jam();
 
367
    ph6ALab(signal);
 
368
    return;
 
369
    break;
 
370
  case ZSTART_PHASE_7:
 
371
    jam();
 
372
    ph6BLab(signal);
 
373
    return;
 
374
    break;
 
375
  case ZSTART_PHASE_8:
 
376
    jam();
 
377
    ph7ALab(signal);
 
378
    return;
 
379
    break;
 
380
  case ZSTART_PHASE_9:
 
381
    jam();
 
382
    ph8ALab(signal);
 
383
    return;
 
384
    break;
 
385
  default:
 
386
    jam();
 
387
    systemErrorLab(signal, __LINE__);
 
388
    return;
 
389
    break;
 
390
  }//switch
 
391
}//Ndbcntr::execNDB_STTORRY()
 
392
 
 
393
void Ndbcntr::startPhase1Lab(Signal* signal) 
 
394
{
 
395
  jamEntry();
 
396
 
 
397
  initData(signal);
 
398
 
 
399
  cdynamicNodeId = 0;
 
400
 
 
401
  NdbBlocksRecPtr ndbBlocksPtr;
 
402
  ndbBlocksPtr.i = 0;
 
403
  ptrAss(ndbBlocksPtr, ndbBlocksRec);
 
404
  ndbBlocksPtr.p->blockref = DBLQH_REF;
 
405
  ndbBlocksPtr.i = 1;
 
406
  ptrAss(ndbBlocksPtr, ndbBlocksRec);
 
407
  ndbBlocksPtr.p->blockref = DBDICT_REF;
 
408
  ndbBlocksPtr.i = 2;
 
409
  ptrAss(ndbBlocksPtr, ndbBlocksRec);
 
410
  ndbBlocksPtr.p->blockref = DBTUP_REF;
 
411
  ndbBlocksPtr.i = 3;
 
412
  ptrAss(ndbBlocksPtr, ndbBlocksRec);
 
413
  ndbBlocksPtr.p->blockref = DBACC_REF;
 
414
  ndbBlocksPtr.i = 4;
 
415
  ptrAss(ndbBlocksPtr, ndbBlocksRec);
 
416
  ndbBlocksPtr.p->blockref = DBTC_REF;
 
417
  ndbBlocksPtr.i = 5;
 
418
  ptrAss(ndbBlocksPtr, ndbBlocksRec);
 
419
  ndbBlocksPtr.p->blockref = DBDIH_REF;
 
420
  sendSttorry(signal);
 
421
  return;
 
422
}
 
423
 
 
424
void Ndbcntr::execREAD_NODESREF(Signal* signal) 
 
425
{
 
426
  jamEntry();
 
427
  systemErrorLab(signal, __LINE__);
 
428
  return;
 
429
}//Ndbcntr::execREAD_NODESREF()
 
430
 
 
431
 
 
432
/*******************************/
 
433
/*  NDB_STARTREF               */
 
434
/*******************************/
 
435
void Ndbcntr::execNDB_STARTREF(Signal* signal) 
 
436
{
 
437
  jamEntry();
 
438
  systemErrorLab(signal, __LINE__);
 
439
  return;
 
440
}//Ndbcntr::execNDB_STARTREF()
 
441
 
 
442
/*******************************/
 
443
/*  STTOR                      */
 
444
/*******************************/
 
445
void Ndbcntr::startPhase2Lab(Signal* signal) 
 
446
{
 
447
  c_start.m_lastGci = 0;
 
448
  c_start.m_lastGciNodeId = getOwnNodeId();
 
449
  
 
450
  signal->theData[0] = reference();
 
451
  sendSignal(DBDIH_REF, GSN_DIH_RESTARTREQ, signal, 1, JBB);
 
452
  return;
 
453
}//Ndbcntr::startPhase2Lab()
 
454
 
 
455
/*******************************/
 
456
/*  DIH_RESTARTCONF            */
 
457
/*******************************/
 
458
void Ndbcntr::execDIH_RESTARTCONF(Signal* signal) 
 
459
{
 
460
  jamEntry();
 
461
  //cmasterDihId = signal->theData[0];
 
462
  c_start.m_lastGci = signal->theData[1];
 
463
  ctypeOfStart = NodeState::ST_SYSTEM_RESTART;
 
464
  ph2ALab(signal);
 
465
  return;
 
466
}//Ndbcntr::execDIH_RESTARTCONF()
 
467
 
 
468
/*******************************/
 
469
/*  DIH_RESTARTREF             */
 
470
/*******************************/
 
471
void Ndbcntr::execDIH_RESTARTREF(Signal* signal) 
 
472
{
 
473
  jamEntry();
 
474
  ctypeOfStart = NodeState::ST_INITIAL_START;
 
475
  ph2ALab(signal);
 
476
  return;
 
477
}//Ndbcntr::execDIH_RESTARTREF()
 
478
 
 
479
void Ndbcntr::ph2ALab(Signal* signal) 
 
480
{
 
481
  /******************************/
 
482
  /* request configured nodes   */
 
483
  /* from QMGR                  */
 
484
  /*  READ_NODESREQ             */
 
485
  /******************************/
 
486
  signal->theData[0] = reference();
 
487
  sendSignal(QMGR_REF, GSN_READ_NODESREQ, signal, 1, JBB);
 
488
  return;
 
489
}//Ndbcntr::ph2ALab()
 
490
 
 
491
inline
 
492
Uint64
 
493
setTimeout(Uint64 time, Uint32 timeoutValue){
 
494
  if(timeoutValue == 0)
 
495
    return ~(Uint64)0;
 
496
  return time + timeoutValue;
 
497
}
 
498
 
 
499
/*******************************/
 
500
/*  READ_NODESCONF             */
 
501
/*******************************/
 
502
void Ndbcntr::execREAD_NODESCONF(Signal* signal) 
 
503
{
 
504
  jamEntry();
 
505
  const ReadNodesConf * readNodes = (ReadNodesConf *)&signal->theData[0];
 
506
 
 
507
  cmasterNodeId = readNodes->masterNodeId;
 
508
  cdynamicNodeId = readNodes->ndynamicId;
 
509
 
 
510
  /**
 
511
   * All defined nodes...
 
512
   */
 
513
  c_allDefinedNodes.assign(NdbNodeBitmask::Size, readNodes->allNodes);
 
514
  c_clusterNodes.assign(NdbNodeBitmask::Size, readNodes->clusterNodes);
 
515
 
 
516
  Uint32 to_1 = 30000;
 
517
  Uint32 to_2 = 0;
 
518
  Uint32 to_3 = 0;
 
519
 
 
520
  const ndb_mgm_configuration_iterator * p = 
 
521
    m_ctx.m_config.getOwnConfigIterator();
 
522
  
 
523
  ndbrequire(p != 0);
 
524
  ndb_mgm_get_int_parameter(p, CFG_DB_START_PARTIAL_TIMEOUT, &to_1);
 
525
  ndb_mgm_get_int_parameter(p, CFG_DB_START_PARTITION_TIMEOUT, &to_2);
 
526
  ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3);
 
527
  
 
528
  c_start.m_startTime = NdbTick_CurrentMillisecond();
 
529
  c_start.m_startPartialTimeout = setTimeout(c_start.m_startTime, to_1);
 
530
  c_start.m_startPartitionedTimeout = setTimeout(c_start.m_startTime, to_2);
 
531
  c_start.m_startFailureTimeout = setTimeout(c_start.m_startTime, to_3);
 
532
  
 
533
  UpgradeStartup::sendCmAppChg(* this, signal, 0); // ADD
 
534
  
 
535
  sendCntrStartReq(signal);
 
536
 
 
537
  signal->theData[0] = ZSTARTUP;
 
538
  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1);
 
539
  
 
540
  return;
 
541
}
 
542
 
 
543
void
 
544
Ndbcntr::execCM_ADD_REP(Signal* signal){
 
545
  jamEntry();
 
546
  c_clusterNodes.set(signal->theData[0]);
 
547
}
 
548
 
 
549
void
 
550
Ndbcntr::sendCntrStartReq(Signal * signal){
 
551
  jamEntry();
 
552
 
 
553
  CntrStartReq * req = (CntrStartReq*)signal->getDataPtrSend();
 
554
  req->startType = ctypeOfStart;
 
555
  req->lastGci = c_start.m_lastGci;
 
556
  req->nodeId = getOwnNodeId();
 
557
  sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_START_REQ,
 
558
             signal, CntrStartReq::SignalLength, JBB);
 
559
}
 
560
 
 
561
void
 
562
Ndbcntr::execCNTR_START_REF(Signal * signal){
 
563
  jamEntry();
 
564
  const CntrStartRef * ref = (CntrStartRef*)signal->getDataPtr();
 
565
 
 
566
  switch(ref->errorCode){
 
567
  case CntrStartRef::NotMaster:
 
568
    jam();
 
569
    cmasterNodeId = ref->masterNodeId;
 
570
    sendCntrStartReq(signal);
 
571
    return;
 
572
  case CntrStartRef::StopInProgress:
 
573
    jam();
 
574
    progError(__LINE__, NDBD_EXIT_RESTART_DURING_SHUTDOWN);
 
575
  }
 
576
  ndbrequire(false);
 
577
}
 
578
 
 
579
void
 
580
Ndbcntr::StartRecord::reset(){
 
581
  m_starting.clear();
 
582
  m_waiting.clear();
 
583
  m_withLog.clear();
 
584
  m_withoutLog.clear();
 
585
  m_lastGci = m_lastGciNodeId = 0;
 
586
  m_startPartialTimeout = ~0;
 
587
  m_startPartitionedTimeout = ~0;
 
588
  m_startFailureTimeout = ~0;
 
589
  
 
590
  m_logNodesCount = 0;
 
591
}
 
592
 
 
593
void
 
594
Ndbcntr::execCNTR_START_CONF(Signal * signal){
 
595
  jamEntry();
 
596
  const CntrStartConf * conf = (CntrStartConf*)signal->getDataPtr();
 
597
 
 
598
  cnoStartNodes = conf->noStartNodes;
 
599
  ctypeOfStart = (NodeState::StartType)conf->startType;
 
600
  c_start.m_lastGci = conf->startGci;
 
601
  cmasterNodeId = conf->masterNodeId;
 
602
  NdbNodeBitmask tmp; 
 
603
  tmp.assign(NdbNodeBitmask::Size, conf->startedNodes);
 
604
  c_startedNodes.bitOR(tmp);
 
605
  c_start.m_starting.assign(NdbNodeBitmask::Size, conf->startingNodes);
 
606
  ph2GLab(signal);
 
607
 
 
608
  UpgradeStartup::sendCmAppChg(* this, signal, 2); //START
 
609
}
 
610
 
 
611
/**
 
612
 * Tried with parallell nr, but it crashed in DIH
 
613
 * so I turned it off, as I don't want to debug DIH now...
 
614
 * Jonas 19/11-03
 
615
 *
 
616
 * After trying for 2 hours, I gave up.
 
617
 * DIH is not designed to support it, and
 
618
 * it requires quite of lot of changes to
 
619
 * make it work
 
620
 * Jonas 5/12-03
 
621
 */
 
622
#define PARALLELL_NR 0
 
623
 
 
624
#if PARALLELL_NR
 
625
const bool parallellNR = true;
 
626
#else
 
627
const bool parallellNR = false;
 
628
#endif
 
629
 
 
630
void
 
631
Ndbcntr::execCNTR_START_REP(Signal* signal){
 
632
  jamEntry();
 
633
  Uint32 nodeId = signal->theData[0];
 
634
  c_startedNodes.set(nodeId);
 
635
  c_start.m_starting.clear(nodeId);
 
636
 
 
637
  /**
 
638
   * Inform all interested blocks that node has started
 
639
   */
 
640
  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
 
641
    sendSignal(ALL_BLOCKS[i].Ref, GSN_NODE_START_REP, signal, 1, JBB);
 
642
  }
 
643
  
 
644
  if(!c_start.m_starting.isclear()){
 
645
    jam();
 
646
    return;
 
647
  }
 
648
  
 
649
  if(cmasterNodeId != getOwnNodeId()){
 
650
    jam();
 
651
    c_start.reset();
 
652
    return;
 
653
  }
 
654
 
 
655
  if(c_start.m_waiting.isclear()){
 
656
    jam();
 
657
    c_start.reset();
 
658
    return;
 
659
  }
 
660
 
 
661
  startWaitingNodes(signal);
 
662
}
 
663
 
 
664
void
 
665
Ndbcntr::execCNTR_START_REQ(Signal * signal){
 
666
  jamEntry();
 
667
  const CntrStartReq * req = (CntrStartReq*)signal->getDataPtr();
 
668
  
 
669
  const Uint32 nodeId = req->nodeId;
 
670
  const Uint32 lastGci = req->lastGci;
 
671
  const NodeState::StartType st = (NodeState::StartType)req->startType;
 
672
 
 
673
  if(cmasterNodeId == 0){
 
674
    jam();
 
675
    // Has not completed READNODES yet
 
676
    sendSignalWithDelay(reference(), GSN_CNTR_START_REQ, signal, 100, 
 
677
                        signal->getLength());
 
678
    return;
 
679
  }
 
680
  
 
681
  if(cmasterNodeId != getOwnNodeId()){
 
682
    jam();
 
683
    sendCntrStartRef(signal, nodeId, CntrStartRef::NotMaster);
 
684
    return;
 
685
  }
 
686
  
 
687
  const NodeState & nodeState = getNodeState();
 
688
  switch(nodeState.startLevel){
 
689
  case NodeState::SL_NOTHING:
 
690
  case NodeState::SL_CMVMI:
 
691
    jam();
 
692
    ndbrequire(false);
 
693
  case NodeState::SL_STARTING:
 
694
  case NodeState::SL_STARTED:
 
695
    jam();
 
696
    break;
 
697
    
 
698
  case NodeState::SL_STOPPING_1:
 
699
  case NodeState::SL_STOPPING_2:
 
700
  case NodeState::SL_STOPPING_3:
 
701
  case NodeState::SL_STOPPING_4:
 
702
    jam();
 
703
    sendCntrStartRef(signal, nodeId, CntrStartRef::StopInProgress);
 
704
    return;
 
705
  }
 
706
 
 
707
  /**
 
708
   * Am I starting (or started)
 
709
   */
 
710
  const bool starting = (nodeState.startLevel != NodeState::SL_STARTED);
 
711
  
 
712
  c_start.m_waiting.set(nodeId);
 
713
  switch(st){
 
714
  case NodeState::ST_INITIAL_START:
 
715
    jam();
 
716
    c_start.m_withoutLog.set(nodeId);
 
717
    break;
 
718
  case NodeState::ST_SYSTEM_RESTART:
 
719
    jam();
 
720
    c_start.m_withLog.set(nodeId);
 
721
    if(starting && lastGci > c_start.m_lastGci){
 
722
      jam();
 
723
      CntrStartRef * ref = (CntrStartRef*)signal->getDataPtrSend();
 
724
      ref->errorCode = CntrStartRef::NotMaster;
 
725
      ref->masterNodeId = nodeId;
 
726
      NodeReceiverGroup rg (NDBCNTR, c_start.m_waiting);
 
727
      sendSignal(rg, GSN_CNTR_START_REF, signal,
 
728
                 CntrStartRef::SignalLength, JBB);
 
729
      return;
 
730
    }
 
731
    if(starting){
 
732
      jam();
 
733
      Uint32 i = c_start.m_logNodesCount++;
 
734
      c_start.m_logNodes[i].m_nodeId = nodeId;
 
735
      c_start.m_logNodes[i].m_lastGci = req->lastGci;
 
736
    }
 
737
    break;
 
738
  case NodeState::ST_NODE_RESTART:
 
739
  case NodeState::ST_INITIAL_NODE_RESTART:
 
740
  case NodeState::ST_ILLEGAL_TYPE:
 
741
    ndbrequire(false);
 
742
  }
 
743
 
 
744
  const bool startInProgress = !c_start.m_starting.isclear();
 
745
 
 
746
  if((starting && startInProgress) || (startInProgress && !parallellNR)){
 
747
    jam();
 
748
    // We're already starting together with a bunch of nodes
 
749
    // Let this node wait...
 
750
    return;
 
751
  }
 
752
  
 
753
  if(starting){
 
754
    jam();
 
755
    trySystemRestart(signal);
 
756
  } else {
 
757
    jam();
 
758
    startWaitingNodes(signal);
 
759
  }
 
760
  return;
 
761
}
 
762
 
 
763
void
 
764
Ndbcntr::startWaitingNodes(Signal * signal){
 
765
 
 
766
#if ! PARALLELL_NR
 
767
  const Uint32 nodeId = c_start.m_waiting.find(0);
 
768
  const Uint32 Tref = calcNdbCntrBlockRef(nodeId);
 
769
  ndbrequire(nodeId != c_start.m_waiting.NotFound);
 
770
 
 
771
  NodeState::StartType nrType = NodeState::ST_NODE_RESTART;
 
772
  if(c_start.m_withoutLog.get(nodeId)){
 
773
    jam();
 
774
    nrType = NodeState::ST_INITIAL_NODE_RESTART;
 
775
  }
 
776
  
 
777
  /**
 
778
   * Let node perform restart
 
779
   */
 
780
  CntrStartConf * conf = (CntrStartConf*)signal->getDataPtrSend();
 
781
  conf->noStartNodes = 1;
 
782
  conf->startType = nrType;
 
783
  conf->startGci = ~0; // Not used
 
784
  conf->masterNodeId = getOwnNodeId();
 
785
  BitmaskImpl::clear(NdbNodeBitmask::Size, conf->startingNodes);
 
786
  BitmaskImpl::set(NdbNodeBitmask::Size, conf->startingNodes, nodeId);
 
787
  c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
 
788
  sendSignal(Tref, GSN_CNTR_START_CONF, signal, 
 
789
             CntrStartConf::SignalLength, JBB);
 
790
 
 
791
  c_start.m_waiting.clear(nodeId);
 
792
  c_start.m_withLog.clear(nodeId);
 
793
  c_start.m_withoutLog.clear(nodeId);
 
794
  c_start.m_starting.set(nodeId);
 
795
#else
 
796
  // Parallell nr
 
797
  
 
798
  c_start.m_starting = c_start.m_waiting;
 
799
  c_start.m_waiting.clear();
 
800
  
 
801
  CntrStartConf * conf = (CntrStartConf*)signal->getDataPtrSend();
 
802
  conf->noStartNodes = 1;
 
803
  conf->startGci = ~0; // Not used
 
804
  conf->masterNodeId = getOwnNodeId();
 
805
  c_start.m_starting.copyto(NdbNodeBitmask::Size, conf->startingNodes);
 
806
  c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
 
807
  
 
808
  char buf[100];
 
809
  if(!c_start.m_withLog.isclear()){
 
810
    jam();
 
811
    ndbout_c("Starting nodes w/ log: %s", c_start.m_withLog.getText(buf));
 
812
 
 
813
    NodeReceiverGroup rg(NDBCNTR, c_start.m_withLog);
 
814
    conf->startType = NodeState::ST_NODE_RESTART;
 
815
    
 
816
    sendSignal(rg, GSN_CNTR_START_CONF, signal, 
 
817
               CntrStartConf::SignalLength, JBB);
 
818
  }
 
819
 
 
820
  if(!c_start.m_withoutLog.isclear()){
 
821
    jam();
 
822
    ndbout_c("Starting nodes wo/ log: %s", c_start.m_withoutLog.getText(buf));
 
823
    NodeReceiverGroup rg(NDBCNTR, c_start.m_withoutLog);
 
824
    conf->startType = NodeState::ST_INITIAL_NODE_RESTART;
 
825
    
 
826
    sendSignal(rg, GSN_CNTR_START_CONF, signal, 
 
827
               CntrStartConf::SignalLength, JBB);
 
828
  }
 
829
 
 
830
  c_start.m_waiting.clear();
 
831
  c_start.m_withLog.clear();
 
832
  c_start.m_withoutLog.clear();
 
833
#endif
 
834
}
 
835
 
 
836
void
 
837
Ndbcntr::sendCntrStartRef(Signal * signal, 
 
838
                          Uint32 nodeId, CntrStartRef::ErrorCode code){
 
839
  CntrStartRef * ref = (CntrStartRef*)signal->getDataPtrSend();
 
840
  ref->errorCode = code;
 
841
  ref->masterNodeId = cmasterNodeId;
 
842
  sendSignal(calcNdbCntrBlockRef(nodeId), GSN_CNTR_START_REF, signal,
 
843
             CntrStartRef::SignalLength, JBB);
 
844
}
 
845
 
 
846
CheckNodeGroups::Output
 
847
Ndbcntr::checkNodeGroups(Signal* signal, const NdbNodeBitmask & mask){
 
848
  CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
 
849
  sd->blockRef = reference();
 
850
  sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::ArbitCheck;
 
851
  sd->mask = mask;
 
852
  EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, 
 
853
                 CheckNodeGroups::SignalLength);
 
854
  jamEntry();
 
855
  return (CheckNodeGroups::Output)sd->output;
 
856
}
 
857
 
 
858
bool
 
859
Ndbcntr::trySystemRestart(Signal* signal){
 
860
  /**
 
861
   * System restart something
 
862
   */
 
863
  const bool allNodes = c_start.m_waiting.equal(c_allDefinedNodes);
 
864
  const bool allClusterNodes = c_start.m_waiting.equal(c_clusterNodes);
 
865
 
 
866
  if(!allClusterNodes){
 
867
    jam();
 
868
    return false;
 
869
  }
 
870
  
 
871
  NodeState::StartType srType = NodeState::ST_SYSTEM_RESTART;
 
872
  if(c_start.m_waiting.equal(c_start.m_withoutLog))
 
873
  {
 
874
    jam();
 
875
    srType = NodeState::ST_INITIAL_START;
 
876
    c_start.m_starting = c_start.m_withoutLog; // Used for starting...
 
877
    c_start.m_withoutLog.clear();
 
878
  } else {
 
879
 
 
880
    CheckNodeGroups::Output wLog = checkNodeGroups(signal, c_start.m_withLog);
 
881
 
 
882
    switch (wLog) {
 
883
    case CheckNodeGroups::Win:
 
884
      jam();
 
885
      break;
 
886
    case CheckNodeGroups::Lose:
 
887
      jam();
 
888
      // If we lose with all nodes, then we're in trouble
 
889
      ndbrequire(!allNodes);
 
890
      return false;
 
891
    case CheckNodeGroups::Partitioning:
 
892
      jam();
 
893
      bool allowPartition = (c_start.m_startPartitionedTimeout != (Uint64)~0);
 
894
      
 
895
      if(allNodes){
 
896
        if(allowPartition){
 
897
          jam();
 
898
          break;
 
899
        }
 
900
        ndbrequire(false); // All nodes -> partitioning, which is not allowed
 
901
      }
 
902
      
 
903
      break;
 
904
    }    
 
905
    
 
906
    // For now only with the "logged"-ones.
 
907
    // Let the others do node restart afterwards...
 
908
    c_start.m_starting = c_start.m_withLog;
 
909
    c_start.m_withLog.clear();
 
910
  }
 
911
      
 
912
  /**
 
913
   * Okidoki, we try to start
 
914
   */
 
915
  CntrStartConf * conf = (CntrStartConf*)signal->getDataPtr();
 
916
  conf->noStartNodes = c_start.m_starting.count();
 
917
  conf->startType = srType;
 
918
  conf->startGci = c_start.m_lastGci;
 
919
  conf->masterNodeId = c_start.m_lastGciNodeId;
 
920
  c_start.m_starting.copyto(NdbNodeBitmask::Size, conf->startingNodes);
 
921
  c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
 
922
  
 
923
  ndbrequire(c_start.m_lastGciNodeId == getOwnNodeId());
 
924
  
 
925
  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
 
926
  sendSignal(rg, GSN_CNTR_START_CONF, signal, CntrStartConf::SignalLength,JBB);
 
927
  
 
928
  c_start.m_waiting.bitANDC(c_start.m_starting);
 
929
  
 
930
  return true;
 
931
}
 
932
 
 
933
void Ndbcntr::ph2GLab(Signal* signal) 
 
934
{
 
935
  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
 
936
    jam();
 
937
    sendNdbSttor(signal);
 
938
    return;
 
939
  }//if
 
940
  sendSttorry(signal);
 
941
  return;
 
942
}//Ndbcntr::ph2GLab()
 
943
 
 
944
/*
 
945
4.4  START PHASE 3 */
 
946
/*###########################################################################*/
 
947
// SEND SIGNAL NDBSTTOR TO ALL BLOCKS, ACC, DICT, DIH, LQH, TC AND TUP
 
948
// WHEN ALL BLOCKS HAVE RETURNED THEIR NDB_STTORRY ALL BLOCK HAVE FINISHED
 
949
// THEIR LOCAL CONNECTIONs SUCESSFULLY
 
950
// AND THEN WE CAN SEND APPL_STARTREG TO INFORM QMGR THAT WE ARE READY TO
 
951
// SET UP DISTRIBUTED CONNECTIONS.
 
952
/*--------------------------------------------------------------*/
 
953
// THIS IS NDB START PHASE 3.
 
954
/*--------------------------------------------------------------*/
 
955
/*******************************/
 
956
/*  STTOR                      */
 
957
/*******************************/
 
958
void Ndbcntr::startPhase3Lab(Signal* signal) 
 
959
{
 
960
  ph3ALab(signal);
 
961
  return;
 
962
}//Ndbcntr::startPhase3Lab()
 
963
 
 
964
/*******************************/
 
965
/*  NDB_STTORRY                */
 
966
/*******************************/
 
967
void Ndbcntr::ph3ALab(Signal* signal) 
 
968
{
 
969
  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
 
970
    jam();
 
971
    sendNdbSttor(signal);
 
972
    return;
 
973
  }//if
 
974
 
 
975
  sendSttorry(signal);
 
976
  return;
 
977
}//Ndbcntr::ph3ALab()
 
978
 
 
979
/*
 
980
4.5  START PHASE 4      */
 
981
/*###########################################################################*/
 
982
// WAIT FOR ALL NODES IN CLUSTER TO CHANGE STATE INTO ZSTART ,
 
983
// APPL_CHANGEREP IS ALWAYS SENT WHEN SOMEONE HAVE
 
984
// CHANGED THEIR STATE. APPL_STARTCONF INDICATES THAT ALL NODES ARE IN START 
 
985
// STATE SEND NDB_STARTREQ TO DIH AND THEN WAIT FOR NDB_STARTCONF
 
986
/*---------------------------------------------------------------------------*/
 
987
/*******************************/
 
988
/*  STTOR                      */
 
989
/*******************************/
 
990
void Ndbcntr::startPhase4Lab(Signal* signal) 
 
991
{
 
992
  ph4ALab(signal);
 
993
}//Ndbcntr::startPhase4Lab()
 
994
 
 
995
 
 
996
void Ndbcntr::ph4ALab(Signal* signal) 
 
997
{
 
998
  ph4BLab(signal);
 
999
  return;
 
1000
}//Ndbcntr::ph4ALab()
 
1001
 
 
1002
/*******************************/
 
1003
/*  NDB_STTORRY                */
 
1004
/*******************************/
 
1005
void Ndbcntr::ph4BLab(Signal* signal) 
 
1006
{
 
1007
/*--------------------------------------*/
 
1008
/* CASE: CSTART_PHASE = ZSTART_PHASE_4  */
 
1009
/*--------------------------------------*/
 
1010
  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
 
1011
    jam();
 
1012
    sendNdbSttor(signal);
 
1013
    return;
 
1014
  }//if
 
1015
  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
 
1016
      (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
 
1017
    jam();
 
1018
    sendSttorry(signal);
 
1019
    return;
 
1020
  }//if
 
1021
  waitpoint41Lab(signal);
 
1022
  return;
 
1023
}//Ndbcntr::ph4BLab()
 
1024
 
 
1025
void Ndbcntr::waitpoint41Lab(Signal* signal) 
 
1026
{
 
1027
  if (getOwnNodeId() == cmasterNodeId) {
 
1028
    jam();
 
1029
/*--------------------------------------*/
 
1030
/* MASTER WAITS UNTIL ALL SLAVES HAS    */
 
1031
/* SENT THE REPORTS                     */
 
1032
/*--------------------------------------*/
 
1033
    cnoWaitrep++;
 
1034
    if (cnoWaitrep == cnoStartNodes) {
 
1035
      jam();
 
1036
      cnoWaitrep = 0;
 
1037
/*---------------------------------------------------------------------------*/
 
1038
// NDB_STARTREQ STARTS UP ALL SET UP OF DISTRIBUTION INFORMATION IN DIH AND
 
1039
// DICT. AFTER SETTING UP THIS
 
1040
// DATA IT USES THAT DATA TO SET UP WHICH FRAGMENTS THAT ARE TO START AND
 
1041
// WHERE THEY ARE TO START. THEN
 
1042
// IT SETS UP THE FRAGMENTS AND RECOVERS THEM BY:
 
1043
//  1) READING A LOCAL CHECKPOINT FROM DISK.
 
1044
//  2) EXECUTING THE UNDO LOG ON INDEX AND DATA.
 
1045
//  3) EXECUTING THE FRAGMENT REDO LOG FROM ONE OR SEVERAL NODES TO
 
1046
//     RESTORE THE RESTART CONFIGURATION OF DATA IN NDB CLUSTER.
 
1047
/*---------------------------------------------------------------------------*/
 
1048
      signal->theData[0] = reference();
 
1049
      signal->theData[1] = ctypeOfStart;
 
1050
      sendSignal(DBDIH_REF, GSN_NDB_STARTREQ, signal, 2, JBB);
 
1051
    }//if
 
1052
  } else {
 
1053
    jam();
 
1054
/*--------------------------------------*/
 
1055
/* SLAVE NODES WILL PASS HERE ONCE AND  */
 
1056
/* SEND A WAITPOINT REPORT TO MASTER.   */
 
1057
/* SLAVES WONT DO ANYTHING UNTIL THEY   */
 
1058
/* RECEIVE A WAIT REPORT FROM THE MASTER*/
 
1059
/*--------------------------------------*/
 
1060
    signal->theData[0] = getOwnNodeId();
 
1061
    signal->theData[1] = ZWAITPOINT_4_1;
 
1062
    sendSignal(calcNdbCntrBlockRef(cmasterNodeId), 
 
1063
               GSN_CNTR_WAITREP, signal, 2, JBB);
 
1064
  }//if
 
1065
  return;
 
1066
}//Ndbcntr::waitpoint41Lab()
 
1067
 
 
1068
/*******************************/
 
1069
/*  NDB_STARTCONF              */
 
1070
/*******************************/
 
1071
void Ndbcntr::execNDB_STARTCONF(Signal* signal) 
 
1072
{
 
1073
  jamEntry();
 
1074
 
 
1075
  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
 
1076
  signal->theData[0] = getOwnNodeId();
 
1077
  signal->theData[1] = ZWAITPOINT_4_2;
 
1078
  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
 
1079
  return;
 
1080
}//Ndbcntr::execNDB_STARTCONF()
 
1081
 
 
1082
/*
 
1083
4.6  START PHASE 5      */
 
1084
/*###########################################################################*/
 
1085
// SEND APPL_RUN TO THE QMGR IN THIS BLOCK
 
1086
// SEND NDB_STTOR ALL BLOCKS ACC, DICT, DIH, LQH, TC AND TUP THEN WAIT FOR
 
1087
// THEIR NDB_STTORRY
 
1088
/*---------------------------------------------------------------------------*/
 
1089
/*******************************/
 
1090
/*  STTOR                      */
 
1091
/*******************************/
 
1092
void Ndbcntr::startPhase5Lab(Signal* signal) 
 
1093
{
 
1094
  ph5ALab(signal);
 
1095
  return;
 
1096
}//Ndbcntr::startPhase5Lab()
 
1097
 
 
1098
/*******************************/
 
1099
/*  NDB_STTORRY                */
 
1100
/*******************************/
 
1101
/*---------------------------------------------------------------------------*/
 
1102
// THIS IS NDB START PHASE 5.
 
1103
/*---------------------------------------------------------------------------*/
 
1104
// IN THIS START PHASE TUP INITIALISES DISK FILES FOR DISK STORAGE IF INITIAL
 
1105
// START. DIH WILL START UP
 
1106
// THE GLOBAL CHECKPOINT PROTOCOL AND WILL CONCLUDE ANY UNFINISHED TAKE OVERS 
 
1107
// THAT STARTED BEFORE THE SYSTEM CRASH.
 
1108
/*---------------------------------------------------------------------------*/
 
1109
void Ndbcntr::ph5ALab(Signal* signal) 
 
1110
{
 
1111
  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
 
1112
    jam();
 
1113
    sendNdbSttor(signal);
 
1114
    return;
 
1115
  }//if
 
1116
 
 
1117
  cstartPhase = cstartPhase + 1;
 
1118
  cinternalStartphase = cstartPhase - 1;
 
1119
  if (getOwnNodeId() == cmasterNodeId) {
 
1120
    switch(ctypeOfStart){
 
1121
    case NodeState::ST_INITIAL_START:
 
1122
      jam();
 
1123
      /*--------------------------------------*/
 
1124
      /* MASTER CNTR IS RESPONSIBLE FOR       */
 
1125
      /* CREATING SYSTEM TABLES               */
 
1126
      /*--------------------------------------*/
 
1127
      createSystableLab(signal, 0);
 
1128
      return;
 
1129
    case NodeState::ST_SYSTEM_RESTART:
 
1130
      jam();
 
1131
      waitpoint52Lab(signal);
 
1132
      return;
 
1133
    case NodeState::ST_NODE_RESTART:
 
1134
    case NodeState::ST_INITIAL_NODE_RESTART:
 
1135
      jam();
 
1136
      break;
 
1137
    case NodeState::ST_ILLEGAL_TYPE:
 
1138
      jam();
 
1139
      break;
 
1140
    }
 
1141
    ndbrequire(false);
 
1142
  }
 
1143
  
 
1144
  /**
 
1145
   * Not master
 
1146
   */
 
1147
  NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
 
1148
  switch(ctypeOfStart){
 
1149
  case NodeState::ST_NODE_RESTART:
 
1150
  case NodeState::ST_INITIAL_NODE_RESTART:
 
1151
    jam();
 
1152
    /*----------------------------------------------------------------------*/
 
1153
    // SEND NDB START PHASE 5 IN NODE RESTARTS TO COPY DATA TO THE NEWLY
 
1154
    // STARTED NODE.
 
1155
    /*----------------------------------------------------------------------*/
 
1156
    req->senderRef = reference();
 
1157
    req->nodeId = getOwnNodeId();
 
1158
    req->internalStartPhase = cinternalStartphase;
 
1159
    req->typeOfStart = ctypeOfStart;
 
1160
    req->masterNodeId = cmasterNodeId;
 
1161
    
 
1162
    //#define TRACE_STTOR
 
1163
#ifdef TRACE_STTOR
 
1164
    ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);
 
1165
#endif
 
1166
    sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal, 
 
1167
               NdbSttor::SignalLength, JBB);
 
1168
    return;
 
1169
  case NodeState::ST_INITIAL_START:
 
1170
  case NodeState::ST_SYSTEM_RESTART:
 
1171
    jam();
 
1172
    /*--------------------------------------*/
 
1173
    /* DURING SYSTEMRESTART AND INITALSTART:*/
 
1174
    /* SLAVE NODES WILL PASS HERE ONCE AND  */
 
1175
    /* SEND A WAITPOINT REPORT TO MASTER.   */
 
1176
    /* SLAVES WONT DO ANYTHING UNTIL THEY   */
 
1177
    /* RECEIVE A WAIT REPORT FROM THE MASTER*/
 
1178
    /* WHEN THE MASTER HAS FINISHED HIS WORK*/
 
1179
    /*--------------------------------------*/
 
1180
    signal->theData[0] = getOwnNodeId();
 
1181
    signal->theData[1] = ZWAITPOINT_5_2;
 
1182
    sendSignal(calcNdbCntrBlockRef(cmasterNodeId), 
 
1183
               GSN_CNTR_WAITREP, signal, 2, JBB);
 
1184
    return;
 
1185
  default:
 
1186
    ndbrequire(false);
 
1187
  }
 
1188
}//Ndbcntr::ph5ALab()
 
1189
 
 
1190
void Ndbcntr::waitpoint52Lab(Signal* signal) 
 
1191
{
 
1192
  cnoWaitrep = cnoWaitrep + 1;
 
1193
/*---------------------------------------------------------------------------*/
 
1194
// THIS WAITING POINT IS ONLY USED BY A MASTER NODE. WE WILL EXECUTE NDB START 
 
1195
// PHASE 5 FOR DIH IN THE
 
1196
// MASTER. THIS WILL START UP LOCAL CHECKPOINTS AND WILL ALSO CONCLUDE ANY
 
1197
// UNFINISHED LOCAL CHECKPOINTS
 
1198
// BEFORE THE SYSTEM CRASH. THIS WILL ENSURE THAT WE ALWAYS RESTART FROM A
 
1199
// WELL KNOWN STATE.
 
1200
/*---------------------------------------------------------------------------*/
 
1201
/*--------------------------------------*/
 
1202
/* MASTER WAITS UNTIL HE RECEIVED WAIT  */
 
1203
/* REPORTS FROM ALL SLAVE CNTR          */
 
1204
/*--------------------------------------*/
 
1205
  if (cnoWaitrep == cnoStartNodes) {
 
1206
    jam();
 
1207
    cnoWaitrep = 0;
 
1208
 
 
1209
    NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
 
1210
    req->senderRef = reference();
 
1211
    req->nodeId = getOwnNodeId();
 
1212
    req->internalStartPhase = cinternalStartphase;
 
1213
    req->typeOfStart = ctypeOfStart;
 
1214
    req->masterNodeId = cmasterNodeId;
 
1215
#ifdef TRACE_STTOR
 
1216
    ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);
 
1217
#endif
 
1218
    sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal, 
 
1219
               NdbSttor::SignalLength, JBB);
 
1220
  }//if
 
1221
  return;
 
1222
}//Ndbcntr::waitpoint52Lab()
 
1223
 
 
1224
/*******************************/
 
1225
/*  NDB_STTORRY                */
 
1226
/*******************************/
 
1227
void Ndbcntr::ph6ALab(Signal* signal) 
 
1228
{
 
1229
  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
 
1230
      (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
 
1231
    jam();
 
1232
    waitpoint51Lab(signal);
 
1233
    return;
 
1234
  }//if
 
1235
 
 
1236
  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
 
1237
  rg.m_nodes.clear(getOwnNodeId());
 
1238
  signal->theData[0] = getOwnNodeId();
 
1239
  signal->theData[1] = ZWAITPOINT_5_1;
 
1240
  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
 
1241
 
 
1242
  waitpoint51Lab(signal);
 
1243
  return;
 
1244
}//Ndbcntr::ph6ALab()
 
1245
 
 
1246
void Ndbcntr::waitpoint51Lab(Signal* signal) 
 
1247
{
 
1248
  cstartPhase = cstartPhase + 1;
 
1249
/*---------------------------------------------------------------------------*/
 
1250
// A FINAL STEP IS NOW TO SEND NDB_STTOR TO TC. THIS MAKES IT POSSIBLE TO 
 
1251
// CONNECT TO TC FOR APPLICATIONS.
 
1252
// THIS IS NDB START PHASE 6 WHICH IS FOR ALL BLOCKS IN ALL NODES.
 
1253
/*---------------------------------------------------------------------------*/
 
1254
  cinternalStartphase = cstartPhase - 1;
 
1255
  cndbBlocksCount = 0;
 
1256
  ph6BLab(signal);
 
1257
  return;
 
1258
}//Ndbcntr::waitpoint51Lab()
 
1259
 
 
1260
void Ndbcntr::ph6BLab(Signal* signal) 
 
1261
{
 
1262
  // c_missra.currentStartPhase - cstartPhase - cinternalStartphase =
 
1263
  // 5 - 7 - 6
 
1264
  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
 
1265
    jam();
 
1266
    sendNdbSttor(signal);
 
1267
    return;
 
1268
  }//if
 
1269
  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
 
1270
      (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
 
1271
    jam();
 
1272
    sendSttorry(signal);
 
1273
    return;
 
1274
  }
 
1275
  waitpoint61Lab(signal);
 
1276
}
 
1277
 
 
1278
void Ndbcntr::waitpoint61Lab(Signal* signal)
 
1279
{
 
1280
  if (getOwnNodeId() == cmasterNodeId) {
 
1281
    jam();
 
1282
    cnoWaitrep6++;
 
1283
    if (cnoWaitrep6 == cnoStartNodes) {
 
1284
      jam();
 
1285
      NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
 
1286
      rg.m_nodes.clear(getOwnNodeId());
 
1287
      signal->theData[0] = getOwnNodeId();
 
1288
      signal->theData[1] = ZWAITPOINT_6_2;
 
1289
      sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
 
1290
      sendSttorry(signal);
 
1291
    }
 
1292
  } else {
 
1293
    jam();
 
1294
    signal->theData[0] = getOwnNodeId();
 
1295
    signal->theData[1] = ZWAITPOINT_6_1;
 
1296
    sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB);
 
1297
  }
 
1298
}
 
1299
 
 
1300
// Start phase 8 (internal 7)
 
1301
void Ndbcntr::startPhase8Lab(Signal* signal)
 
1302
{
 
1303
  cinternalStartphase = cstartPhase - 1;
 
1304
  cndbBlocksCount = 0;
 
1305
  ph7ALab(signal);
 
1306
}
 
1307
 
 
1308
void Ndbcntr::ph7ALab(Signal* signal)
 
1309
{
 
1310
  while (cndbBlocksCount < ZNO_NDB_BLOCKS) {
 
1311
    jam();
 
1312
    sendNdbSttor(signal);
 
1313
    return;
 
1314
  }
 
1315
  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
 
1316
      (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
 
1317
    jam();
 
1318
    sendSttorry(signal);
 
1319
    return;
 
1320
  }
 
1321
  waitpoint71Lab(signal);
 
1322
}
 
1323
 
 
1324
void Ndbcntr::waitpoint71Lab(Signal* signal)
 
1325
{
 
1326
  if (getOwnNodeId() == cmasterNodeId) {
 
1327
    jam();
 
1328
    cnoWaitrep7++;
 
1329
    if (cnoWaitrep7 == cnoStartNodes) {
 
1330
      jam();
 
1331
      NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
 
1332
      rg.m_nodes.clear(getOwnNodeId());
 
1333
      signal->theData[0] = getOwnNodeId();
 
1334
      signal->theData[1] = ZWAITPOINT_7_2;
 
1335
      sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
 
1336
      sendSttorry(signal);
 
1337
    }
 
1338
  } else {
 
1339
    jam();
 
1340
    signal->theData[0] = getOwnNodeId();
 
1341
    signal->theData[1] = ZWAITPOINT_7_1;
 
1342
    sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB);
 
1343
  }
 
1344
}
 
1345
 
 
1346
// Start phase 9 (internal 8)
 
1347
void Ndbcntr::startPhase9Lab(Signal* signal)
 
1348
{
 
1349
  cinternalStartphase = cstartPhase - 1;
 
1350
  cndbBlocksCount = 0;
 
1351
  ph8ALab(signal);
 
1352
}
 
1353
 
 
1354
void Ndbcntr::ph8ALab(Signal* signal)
 
1355
{
 
1356
/*---------------------------------------------------------------------------*/
 
1357
// NODES WHICH PERFORM A NODE RESTART NEEDS TO GET THE DYNAMIC ID'S
 
1358
// OF THE OTHER NODES HERE.
 
1359
/*---------------------------------------------------------------------------*/
 
1360
  sendSttorry(signal);
 
1361
  resetStartVariables(signal);
 
1362
  return;
 
1363
}//Ndbcntr::ph8BLab()
 
1364
 
 
1365
/*******************************/
 
1366
/*  CNTR_WAITREP               */
 
1367
/*******************************/
 
1368
void Ndbcntr::execCNTR_WAITREP(Signal* signal) 
 
1369
{
 
1370
  Uint16 twaitPoint;
 
1371
 
 
1372
  jamEntry();
 
1373
  twaitPoint = signal->theData[1];
 
1374
  switch (twaitPoint) {
 
1375
  case ZWAITPOINT_4_1:
 
1376
    jam();
 
1377
    waitpoint41Lab(signal);
 
1378
    break;
 
1379
  case ZWAITPOINT_4_2:
 
1380
    jam();
 
1381
    sendSttorry(signal);
 
1382
    break;
 
1383
  case ZWAITPOINT_5_1:
 
1384
    jam();
 
1385
    waitpoint51Lab(signal);
 
1386
    break;
 
1387
  case ZWAITPOINT_5_2:
 
1388
    jam();
 
1389
    waitpoint52Lab(signal);
 
1390
    break;
 
1391
  case ZWAITPOINT_6_1:
 
1392
    jam();
 
1393
    waitpoint61Lab(signal);
 
1394
    break;
 
1395
  case ZWAITPOINT_6_2:
 
1396
    jam();
 
1397
    sendSttorry(signal);
 
1398
    break;
 
1399
  case ZWAITPOINT_7_1:
 
1400
    jam();
 
1401
    waitpoint71Lab(signal);
 
1402
    break;
 
1403
  case ZWAITPOINT_7_2:
 
1404
    jam();
 
1405
    sendSttorry(signal);
 
1406
    break;
 
1407
  default:
 
1408
    jam();
 
1409
    systemErrorLab(signal, __LINE__);
 
1410
    break;
 
1411
  }//switch
 
1412
}//Ndbcntr::execCNTR_WAITREP()
 
1413
 
 
1414
/*******************************/
 
1415
/*  NODE_FAILREP               */
 
1416
/*******************************/
 
1417
void Ndbcntr::execNODE_FAILREP(Signal* signal) 
 
1418
{
 
1419
  jamEntry();
 
1420
 
 
1421
  if (ERROR_INSERTED(1001))
 
1422
  {
 
1423
    sendSignalWithDelay(reference(), GSN_NODE_FAILREP, signal, 100, 
 
1424
                        signal->getLength());
 
1425
    return;
 
1426
  }
 
1427
  
 
1428
  const NodeFailRep * nodeFail = (NodeFailRep *)&signal->theData[0];
 
1429
  NdbNodeBitmask allFailed; 
 
1430
  allFailed.assign(NdbNodeBitmask::Size, nodeFail->theNodes);
 
1431
 
 
1432
  NdbNodeBitmask failedStarted = c_startedNodes;
 
1433
  NdbNodeBitmask failedStarting = c_start.m_starting;
 
1434
  NdbNodeBitmask failedWaiting = c_start.m_waiting;
 
1435
 
 
1436
  failedStarted.bitAND(allFailed);
 
1437
  failedStarting.bitAND(allFailed);
 
1438
  failedWaiting.bitAND(allFailed);
 
1439
  
 
1440
  const bool tMasterFailed = allFailed.get(cmasterNodeId);
 
1441
  const bool tStarted = !failedStarted.isclear();
 
1442
  const bool tStarting = !failedStarting.isclear();
 
1443
 
 
1444
  if(tMasterFailed){
 
1445
    jam();
 
1446
    /**
 
1447
     * If master has failed choose qmgr president as master
 
1448
     */
 
1449
    cmasterNodeId = nodeFail->masterNodeId;
 
1450
  }
 
1451
  
 
1452
  /**
 
1453
   * Clear node bitmasks from failed nodes
 
1454
   */
 
1455
  c_start.m_starting.bitANDC(allFailed);
 
1456
  c_start.m_waiting.bitANDC(allFailed);
 
1457
  c_start.m_withLog.bitANDC(allFailed);
 
1458
  c_start.m_withoutLog.bitANDC(allFailed);
 
1459
  c_clusterNodes.bitANDC(allFailed);
 
1460
  c_startedNodes.bitANDC(allFailed);
 
1461
 
 
1462
  const NodeState & st = getNodeState();
 
1463
  if(st.startLevel == st.SL_STARTING){
 
1464
    jam();
 
1465
 
 
1466
    const Uint32 phase = st.starting.startPhase;
 
1467
    
 
1468
    const bool tStartConf = (phase > 2) || (phase == 2 && cndbBlocksCount > 0);
 
1469
 
 
1470
    if(tMasterFailed){
 
1471
      progError(__LINE__, NDBD_EXIT_SR_OTHERNODEFAILED,
 
1472
                "Unhandled node failure during restart");
 
1473
    }
 
1474
    
 
1475
    if(tStartConf && tStarting){
 
1476
      // One of other starting nodes has crashed...
 
1477
      progError(__LINE__, NDBD_EXIT_SR_OTHERNODEFAILED,
 
1478
                "Unhandled node failure of starting node during restart");
 
1479
    }
 
1480
 
 
1481
    if(tStartConf && tStarted){
 
1482
      // One of other started nodes has crashed...      
 
1483
      progError(__LINE__, NDBD_EXIT_SR_OTHERNODEFAILED,
 
1484
                "Unhandled node failure of started node during restart");
 
1485
    }
 
1486
    
 
1487
    Uint32 nodeId = 0;
 
1488
    while(!allFailed.isclear()){
 
1489
      nodeId = allFailed.find(nodeId + 1);
 
1490
      allFailed.clear(nodeId);
 
1491
      signal->theData[0] = nodeId;
 
1492
      sendSignal(QMGR_REF, GSN_NDB_FAILCONF, signal, 1, JBB);
 
1493
    }//for
 
1494
    
 
1495
    return;
 
1496
  }
 
1497
  
 
1498
  ndbrequire(!allFailed.get(getOwnNodeId()));
 
1499
 
 
1500
  NodeFailRep * rep = (NodeFailRep *)&signal->theData[0];  
 
1501
  rep->masterNodeId = cmasterNodeId;
 
1502
 
 
1503
  sendSignal(DBTC_REF, GSN_NODE_FAILREP, signal, 
 
1504
             NodeFailRep::SignalLength, JBB);
 
1505
  
 
1506
  sendSignal(DBLQH_REF, GSN_NODE_FAILREP, signal, 
 
1507
             NodeFailRep::SignalLength, JBB);
 
1508
  
 
1509
  sendSignal(DBDIH_REF, GSN_NODE_FAILREP, signal, 
 
1510
             NodeFailRep::SignalLength, JBB);
 
1511
  
 
1512
  sendSignal(DBDICT_REF, GSN_NODE_FAILREP, signal, 
 
1513
             NodeFailRep::SignalLength, JBB);
 
1514
  
 
1515
  sendSignal(BACKUP_REF, GSN_NODE_FAILREP, signal,
 
1516
             NodeFailRep::SignalLength, JBB);
 
1517
 
 
1518
  sendSignal(SUMA_REF, GSN_NODE_FAILREP, signal,
 
1519
             NodeFailRep::SignalLength, JBB);
 
1520
 
 
1521
  sendSignal(QMGR_REF, GSN_NODE_FAILREP, signal,
 
1522
             NodeFailRep::SignalLength, JBB);
 
1523
 
 
1524
  if (c_stopRec.stopReq.senderRef)
 
1525
  {
 
1526
    jam();
 
1527
    switch(c_stopRec.m_state){
 
1528
    case StopRecord::SR_WAIT_NODE_FAILURES:
 
1529
    {
 
1530
      jam();
 
1531
      NdbNodeBitmask tmp;
 
1532
      tmp.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
1533
      tmp.bitANDC(allFailed);      
 
1534
      tmp.copyto(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
1535
      
 
1536
      if (tmp.isclear())
 
1537
      {
 
1538
        jam();
 
1539
        if (c_stopRec.stopReq.senderRef != RNIL)
 
1540
        {
 
1541
          jam();
 
1542
          StopConf * const stopConf = (StopConf *)&signal->theData[0];
 
1543
          stopConf->senderData = c_stopRec.stopReq.senderData;
 
1544
          stopConf->nodeState  = (Uint32) NodeState::SL_SINGLEUSER;
 
1545
          sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_CONF, signal, 
 
1546
                     StopConf::SignalLength, JBB);
 
1547
        }
 
1548
 
 
1549
        c_stopRec.stopReq.senderRef = 0;
 
1550
        WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
 
1551
        req->senderRef = reference();
 
1552
        req->senderData = StopRecord::SR_UNBLOCK_GCP_START_GCP;
 
1553
        req->requestType = WaitGCPReq::UnblockStartGcp;
 
1554
        sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
 
1555
                   WaitGCPReq::SignalLength, JBA);
 
1556
      }
 
1557
      break;
 
1558
    }
 
1559
    case StopRecord::SR_QMGR_STOP_REQ:
 
1560
    {
 
1561
      NdbNodeBitmask tmp;
 
1562
      tmp.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
1563
      tmp.bitANDC(allFailed);      
 
1564
 
 
1565
      if (tmp.isclear())
 
1566
      {
 
1567
        Uint32 nodeId = allFailed.find(0);
 
1568
        tmp.set(nodeId);
 
1569
 
 
1570
        StopConf* conf = (StopConf*)signal->getDataPtrSend();
 
1571
        conf->senderData = c_stopRec.stopReq.senderData;
 
1572
        conf->nodeId = nodeId;
 
1573
        sendSignal(reference(), 
 
1574
                   GSN_STOP_CONF, signal, StopConf::SignalLength, JBB);
 
1575
      }
 
1576
 
 
1577
      tmp.copyto(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
1578
      
 
1579
      break;
 
1580
    }
 
1581
    case StopRecord::SR_BLOCK_GCP_START_GCP:
 
1582
    case StopRecord::SR_WAIT_COMPLETE_GCP:
 
1583
    case StopRecord::SR_UNBLOCK_GCP_START_GCP:
 
1584
    case StopRecord::SR_CLUSTER_SHUTDOWN:
 
1585
      break;
 
1586
    }
 
1587
  }
 
1588
  
 
1589
  signal->theData[0] = NDB_LE_NODE_FAILREP;
 
1590
  signal->theData[2] = 0;
 
1591
  
 
1592
  Uint32 nodeId = 0;
 
1593
  while(!allFailed.isclear()){
 
1594
    nodeId = allFailed.find(nodeId + 1);
 
1595
    allFailed.clear(nodeId);
 
1596
    signal->theData[1] = nodeId;
 
1597
    sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
 
1598
  }//for
 
1599
 
 
1600
  return;
 
1601
}//Ndbcntr::execNODE_FAILREP()
 
1602
 
 
1603
/*******************************/
 
1604
/*  READ_NODESREQ              */
 
1605
/*******************************/
 
1606
void Ndbcntr::execREAD_NODESREQ(Signal* signal) 
 
1607
{
 
1608
  jamEntry();
 
1609
 
 
1610
  /*----------------------------------------------------------------------*/
 
1611
  // ANY BLOCK MAY SEND A REQUEST ABOUT NDB NODES AND VERSIONS IN THE
 
1612
  // SYSTEM. THIS REQUEST CAN ONLY BE HANDLED IN
 
1613
  // ABSOLUTE STARTPHASE 3 OR LATER
 
1614
  /*----------------------------------------------------------------------*/
 
1615
  BlockReference TuserBlockref = signal->theData[0];
 
1616
  ReadNodesConf * const readNodes = (ReadNodesConf *)&signal->theData[0];
 
1617
  
 
1618
  /**
 
1619
   * Prepare inactiveNodes bitmask.
 
1620
   * The concept as such is by the way pretty useless.
 
1621
   * It makes parallell starts more or less impossible...
 
1622
   */
 
1623
  NdbNodeBitmask tmp1; 
 
1624
  tmp1.bitOR(c_startedNodes);
 
1625
  if(!getNodeState().getNodeRestartInProgress()){
 
1626
    tmp1.bitOR(c_start.m_starting);
 
1627
  } else {
 
1628
    tmp1.set(getOwnNodeId());
 
1629
  }
 
1630
 
 
1631
  NdbNodeBitmask tmp2;
 
1632
  tmp2.bitOR(c_allDefinedNodes);
 
1633
  tmp2.bitANDC(tmp1);
 
1634
  /**
 
1635
   * Fill in return signal
 
1636
   */
 
1637
  tmp2.copyto(NdbNodeBitmask::Size, readNodes->inactiveNodes);
 
1638
  c_allDefinedNodes.copyto(NdbNodeBitmask::Size, readNodes->allNodes);
 
1639
  c_clusterNodes.copyto(NdbNodeBitmask::Size, readNodes->clusterNodes);
 
1640
  c_startedNodes.copyto(NdbNodeBitmask::Size, readNodes->startedNodes);
 
1641
  c_start.m_starting.copyto(NdbNodeBitmask::Size, readNodes->startingNodes);
 
1642
 
 
1643
  readNodes->noOfNodes = c_allDefinedNodes.count();
 
1644
  readNodes->masterNodeId = cmasterNodeId;
 
1645
  readNodes->ndynamicId = cdynamicNodeId;
 
1646
  if (cstartPhase > ZSTART_PHASE_2) {
 
1647
    jam();
 
1648
    sendSignal(TuserBlockref, GSN_READ_NODESCONF, signal, 
 
1649
               ReadNodesConf::SignalLength, JBB);
 
1650
    
 
1651
  } else {
 
1652
    jam();
 
1653
    signal->theData[0] = ZNOT_AVAILABLE;
 
1654
    sendSignal(TuserBlockref, GSN_READ_NODESREF, signal, 1, JBB);
 
1655
  }//if
 
1656
}//Ndbcntr::execREAD_NODESREQ()
 
1657
 
 
1658
/*----------------------------------------------------------------------*/
 
1659
// SENDS APPL_ERROR TO QMGR AND THEN SET A POINTER OUT OF BOUNDS
 
1660
/*----------------------------------------------------------------------*/
 
1661
void Ndbcntr::systemErrorLab(Signal* signal, int line) 
 
1662
{
 
1663
  progError(line, NDBD_EXIT_NDBREQUIRE); /* BUG INSERTION */
 
1664
  return;
 
1665
}//Ndbcntr::systemErrorLab()
 
1666
 
 
1667
/*###########################################################################*/
 
1668
/* CNTR MASTER CREATES AND INITIALIZES A SYSTEMTABLE AT INITIALSTART         */
 
1669
/*       |-2048| # 1 00000001    |                                           */
 
1670
/*       |  :  |   :             |                                           */
 
1671
/*       | -1  | # 1 00000001    |                                           */
 
1672
/*       |  1  |   0             | tupleid sequence now created on first use */
 
1673
/*       |  :  |   :             |                   v                       */
 
1674
/*       | 2048|   0             |                   v                       */
 
1675
/*---------------------------------------------------------------------------*/
 
1676
void Ndbcntr::createSystableLab(Signal* signal, unsigned index)
 
1677
{
 
1678
  if (index >= g_sysTableCount) {
 
1679
    ndbassert(index == g_sysTableCount);
 
1680
    startInsertTransactions(signal);
 
1681
    return;
 
1682
  }
 
1683
  const SysTable& table = *g_sysTableList[index];
 
1684
  Uint32 propPage[256];
 
1685
  LinearWriter w(propPage, 256);
 
1686
 
 
1687
  // XXX remove commented-out lines later
 
1688
 
 
1689
  w.first();
 
1690
  w.add(DictTabInfo::TableName, table.name);
 
1691
  w.add(DictTabInfo::TableLoggedFlag, table.tableLoggedFlag);
 
1692
  //w.add(DictTabInfo::TableKValue, 6);
 
1693
  //w.add(DictTabInfo::MinLoadFactor, 70);
 
1694
  //w.add(DictTabInfo::MaxLoadFactor, 80);
 
1695
  w.add(DictTabInfo::FragmentTypeVal, (Uint32)table.fragmentType);
 
1696
  //w.add(DictTabInfo::NoOfKeyAttr, 1);
 
1697
  w.add(DictTabInfo::NoOfAttributes, (Uint32)table.columnCount);
 
1698
  //w.add(DictTabInfo::NoOfNullable, (Uint32)0);
 
1699
  //w.add(DictTabInfo::NoOfVariable, (Uint32)0);
 
1700
  //w.add(DictTabInfo::KeyLength, 1);
 
1701
  w.add(DictTabInfo::TableTypeVal, (Uint32)table.tableType);
 
1702
  w.add(DictTabInfo::SingleUserMode, (Uint32)NDB_SUM_READ_WRITE);
 
1703
 
 
1704
  for (unsigned i = 0; i < table.columnCount; i++) {
 
1705
    const SysColumn& column = table.columnList[i];
 
1706
    ndbassert(column.pos == i);
 
1707
    w.add(DictTabInfo::AttributeName, column.name);
 
1708
    w.add(DictTabInfo::AttributeId, (Uint32)i);
 
1709
    w.add(DictTabInfo::AttributeKeyFlag, (Uint32)column.keyFlag);
 
1710
    w.add(DictTabInfo::AttributeStorageType, 
 
1711
          (Uint32)NDB_STORAGETYPE_MEMORY);
 
1712
    w.add(DictTabInfo::AttributeArrayType, 
 
1713
          (Uint32)NDB_ARRAYTYPE_FIXED);
 
1714
    w.add(DictTabInfo::AttributeNullableFlag, (Uint32)column.nullable);
 
1715
    w.add(DictTabInfo::AttributeExtType, (Uint32)column.type);
 
1716
    w.add(DictTabInfo::AttributeExtLength, (Uint32)column.length);
 
1717
    w.add(DictTabInfo::AttributeEnd, (Uint32)true);
 
1718
  }
 
1719
  w.add(DictTabInfo::TableEnd, (Uint32)true);
 
1720
  
 
1721
  Uint32 length = w.getWordsUsed();
 
1722
  LinearSectionPtr ptr[3];
 
1723
  ptr[0].p = &propPage[0];
 
1724
  ptr[0].sz = length;
 
1725
 
 
1726
  CreateTableReq* const req = (CreateTableReq*)signal->getDataPtrSend();
 
1727
  req->senderData = index;
 
1728
  req->senderRef = reference();
 
1729
  sendSignal(DBDICT_REF, GSN_CREATE_TABLE_REQ, signal,
 
1730
             CreateTableReq::SignalLength, JBB, ptr, 1);
 
1731
  return;
 
1732
}//Ndbcntr::createSystableLab()
 
1733
 
 
1734
void Ndbcntr::execCREATE_TABLE_REF(Signal* signal) 
 
1735
{
 
1736
  jamEntry();
 
1737
  progError(__LINE__,NDBD_EXIT_NDBREQUIRE, "CREATE_TABLE_REF");
 
1738
  return;
 
1739
}//Ndbcntr::execDICTTABREF()
 
1740
 
 
1741
void Ndbcntr::execCREATE_TABLE_CONF(Signal* signal) 
 
1742
{
 
1743
  jamEntry();
 
1744
  CreateTableConf * const conf = (CreateTableConf*)signal->getDataPtrSend();
 
1745
  //csystabId = conf->tableId;
 
1746
  ndbrequire(conf->senderData < g_sysTableCount);
 
1747
  const SysTable& table = *g_sysTableList[conf->senderData];
 
1748
  table.tableId = conf->tableId;
 
1749
  createSystableLab(signal, conf->senderData + 1);
 
1750
  //startInsertTransactions(signal);
 
1751
  return;
 
1752
}//Ndbcntr::execDICTTABCONF()
 
1753
 
 
1754
/*******************************/
 
1755
/*  DICTRELEASECONF            */
 
1756
/*******************************/
 
1757
void Ndbcntr::startInsertTransactions(Signal* signal) 
 
1758
{
 
1759
  jamEntry();
 
1760
 
 
1761
  ckey = 1;
 
1762
  ctransidPhase = ZTRUE;
 
1763
  signal->theData[0] = 0;
 
1764
  signal->theData[1] = reference();
 
1765
  sendSignal(DBTC_REF, GSN_TCSEIZEREQ, signal, 2, JBB);
 
1766
  return;
 
1767
}//Ndbcntr::startInsertTransactions()
 
1768
 
 
1769
/*******************************/
 
1770
/*  TCSEIZECONF                */
 
1771
/*******************************/
 
1772
void Ndbcntr::execTCSEIZECONF(Signal* signal) 
 
1773
{
 
1774
  jamEntry();
 
1775
  ctcConnectionP = signal->theData[1];
 
1776
  crSystab7Lab(signal);
 
1777
  return;
 
1778
}//Ndbcntr::execTCSEIZECONF()
 
1779
 
 
1780
const unsigned int RowsPerCommit = 16;
 
1781
void Ndbcntr::crSystab7Lab(Signal* signal) 
 
1782
{
 
1783
  UintR tkey;
 
1784
  UintR Tmp;
 
1785
  
 
1786
  TcKeyReq * const tcKeyReq = (TcKeyReq *)&signal->theData[0];
 
1787
  
 
1788
  UintR reqInfo_Start = 0;
 
1789
  tcKeyReq->setOperationType(reqInfo_Start, ZINSERT); // Insert
 
1790
  tcKeyReq->setKeyLength    (reqInfo_Start, 1);
 
1791
  tcKeyReq->setAIInTcKeyReq (reqInfo_Start, 5);
 
1792
  tcKeyReq->setAbortOption  (reqInfo_Start, TcKeyReq::AbortOnError);
 
1793
 
 
1794
/* KEY LENGTH = 1, ATTRINFO LENGTH IN TCKEYREQ = 5 */
 
1795
  cresponses = 0;
 
1796
  const UintR guard0 = ckey + (RowsPerCommit - 1);
 
1797
  for (Tmp = ckey; Tmp <= guard0; Tmp++) {
 
1798
    UintR reqInfo = reqInfo_Start;
 
1799
    if (Tmp == ckey) { // First iteration, Set start flag
 
1800
      jam();
 
1801
      tcKeyReq->setStartFlag(reqInfo, 1);
 
1802
    } //if
 
1803
    if (Tmp == guard0) { // Last iteration, Set commit flag
 
1804
      jam();
 
1805
      tcKeyReq->setCommitFlag(reqInfo, 1);      
 
1806
      tcKeyReq->setExecuteFlag(reqInfo, 1);
 
1807
    } //if
 
1808
    if (ctransidPhase == ZTRUE) {
 
1809
      jam();
 
1810
      tkey = 0;
 
1811
      tkey = tkey - Tmp;
 
1812
    } else {
 
1813
      jam();
 
1814
      tkey = Tmp;
 
1815
    }//if
 
1816
 
 
1817
    tcKeyReq->apiConnectPtr      = ctcConnectionP;
 
1818
    tcKeyReq->attrLen            = 5;
 
1819
    tcKeyReq->tableId            = g_sysTable_SYSTAB_0.tableId;
 
1820
    tcKeyReq->requestInfo        = reqInfo;
 
1821
    tcKeyReq->tableSchemaVersion = ZSYSTAB_VERSION;
 
1822
    tcKeyReq->transId1           = 0;
 
1823
    tcKeyReq->transId2           = ckey;
 
1824
 
 
1825
//-------------------------------------------------------------
 
1826
// There is no optional part in this TCKEYREQ. There is one
 
1827
// key word and five ATTRINFO words.
 
1828
//-------------------------------------------------------------
 
1829
    Uint32* tKeyDataPtr          = &tcKeyReq->scanInfo;
 
1830
    Uint32* tAIDataPtr           = &tKeyDataPtr[1];
 
1831
 
 
1832
    tKeyDataPtr[0]               = tkey;
 
1833
 
 
1834
    AttributeHeader::init(&tAIDataPtr[0], 0, 1 << 2);
 
1835
    tAIDataPtr[1]                = tkey;
 
1836
    AttributeHeader::init(&tAIDataPtr[2], 1, 2 << 2);
 
1837
    tAIDataPtr[3]                = (tkey << 16);
 
1838
    tAIDataPtr[4]                = 1;    
 
1839
    sendSignal(DBTC_REF, GSN_TCKEYREQ, signal, 
 
1840
               TcKeyReq::StaticLength + 6, JBB);
 
1841
  }//for
 
1842
  ckey = ckey + RowsPerCommit;
 
1843
  return;
 
1844
}//Ndbcntr::crSystab7Lab()
 
1845
 
 
1846
/*******************************/
 
1847
/*  TCKEYCONF09                */
 
1848
/*******************************/
 
1849
void Ndbcntr::execTCKEYCONF(Signal* signal) 
 
1850
{
 
1851
  const TcKeyConf * const keyConf = (TcKeyConf *)&signal->theData[0];
 
1852
  
 
1853
  jamEntry();
 
1854
  cgciSystab = keyConf->gci;
 
1855
  UintR confInfo = keyConf->confInfo;
 
1856
  
 
1857
  if (TcKeyConf::getMarkerFlag(confInfo)){
 
1858
    Uint32 transId1 = keyConf->transId1;
 
1859
    Uint32 transId2 = keyConf->transId2;
 
1860
    signal->theData[0] = transId1;
 
1861
    signal->theData[1] = transId2;
 
1862
    sendSignal(DBTC_REF, GSN_TC_COMMIT_ACK, signal, 2, JBB);    
 
1863
  }//if
 
1864
  
 
1865
  cresponses = cresponses + TcKeyConf::getNoOfOperations(confInfo);
 
1866
  if (TcKeyConf::getCommitFlag(confInfo)){
 
1867
    jam();
 
1868
    ndbrequire(cresponses == RowsPerCommit);
 
1869
 
 
1870
    crSystab8Lab(signal);
 
1871
    return;
 
1872
  }
 
1873
  return;
 
1874
}//Ndbcntr::tckeyConfLab()
 
1875
 
 
1876
void Ndbcntr::crSystab8Lab(Signal* signal) 
 
1877
{
 
1878
  if (ckey < ZSIZE_SYSTAB) {
 
1879
    jam();
 
1880
    crSystab7Lab(signal);
 
1881
    return;
 
1882
  } else if (ctransidPhase == ZTRUE) {
 
1883
    jam();
 
1884
    ckey = 1;
 
1885
    ctransidPhase = ZFALSE;
 
1886
    // skip 2nd loop - tupleid sequence now created on first use
 
1887
  }//if
 
1888
  signal->theData[0] = ctcConnectionP;
 
1889
  signal->theData[1] = reference();
 
1890
  signal->theData[2] = 0;
 
1891
  sendSignal(DBTC_REF, GSN_TCRELEASEREQ, signal, 2, JBB);
 
1892
  return;
 
1893
}//Ndbcntr::crSystab8Lab()
 
1894
 
 
1895
/*******************************/
 
1896
/*  TCRELEASECONF              */
 
1897
/*******************************/
 
1898
void Ndbcntr::execTCRELEASECONF(Signal* signal) 
 
1899
{
 
1900
  jamEntry();
 
1901
  waitpoint52Lab(signal);
 
1902
  return;
 
1903
}//Ndbcntr::execTCRELEASECONF()
 
1904
 
 
1905
void Ndbcntr::crSystab9Lab(Signal* signal) 
 
1906
{
 
1907
  signal->theData[1] = reference();
 
1908
  sendSignalWithDelay(DBDIH_REF, GSN_GETGCIREQ, signal, 100, 2);
 
1909
  return;
 
1910
}//Ndbcntr::crSystab9Lab()
 
1911
 
 
1912
/*******************************/
 
1913
/*  GETGCICONF                 */
 
1914
/*******************************/
 
1915
void Ndbcntr::execGETGCICONF(Signal* signal) 
 
1916
{
 
1917
  jamEntry();
 
1918
 
 
1919
#ifndef NO_GCP
 
1920
  if (signal->theData[1] < cgciSystab) {
 
1921
    jam();
 
1922
/*--------------------------------------*/
 
1923
/* MAKE SURE THAT THE SYSTABLE IS       */
 
1924
/* NOW SAFE ON DISK                     */
 
1925
/*--------------------------------------*/
 
1926
    crSystab9Lab(signal);
 
1927
    return;
 
1928
  }//if
 
1929
#endif
 
1930
  waitpoint52Lab(signal);
 
1931
  return;
 
1932
}//Ndbcntr::execGETGCICONF()
 
1933
 
 
1934
void Ndbcntr::execTCKEYREF(Signal* signal) 
 
1935
{
 
1936
  jamEntry();
 
1937
  systemErrorLab(signal, __LINE__);
 
1938
  return;
 
1939
}//Ndbcntr::execTCKEYREF()
 
1940
 
 
1941
void Ndbcntr::execTCROLLBACKREP(Signal* signal) 
 
1942
{
 
1943
  jamEntry();
 
1944
  systemErrorLab(signal, __LINE__);
 
1945
  return;
 
1946
}//Ndbcntr::execTCROLLBACKREP()
 
1947
 
 
1948
void Ndbcntr::execTCRELEASEREF(Signal* signal) 
 
1949
{
 
1950
  jamEntry();
 
1951
  systemErrorLab(signal, __LINE__);
 
1952
  return;
 
1953
}//Ndbcntr::execTCRELEASEREF()
 
1954
 
 
1955
void Ndbcntr::execTCSEIZEREF(Signal* signal) 
 
1956
{
 
1957
  jamEntry();
 
1958
  systemErrorLab(signal, __LINE__);
 
1959
  return;
 
1960
}//Ndbcntr::execTCSEIZEREF()
 
1961
 
 
1962
 
 
1963
/*---------------------------------------------------------------------------*/
 
1964
/*INITIALIZE VARIABLES AND RECORDS                                           */
 
1965
/*---------------------------------------------------------------------------*/
 
1966
void Ndbcntr::initData(Signal* signal) 
 
1967
{
 
1968
  c_start.reset();
 
1969
  cmasterNodeId = 0;
 
1970
  cnoStartNodes = 0;
 
1971
  cnoWaitrep = 0;
 
1972
}//Ndbcntr::initData()
 
1973
 
 
1974
 
 
1975
/*---------------------------------------------------------------------------*/
 
1976
/*RESET VARIABLES USED DURING THE START                                      */
 
1977
/*---------------------------------------------------------------------------*/
 
1978
void Ndbcntr::resetStartVariables(Signal* signal) 
 
1979
{
 
1980
  cnoStartNodes = 0;
 
1981
  cnoWaitrep6 = cnoWaitrep7 = 0;
 
1982
}//Ndbcntr::resetStartVariables()
 
1983
 
 
1984
 
 
1985
/*---------------------------------------------------------------------------*/
 
1986
// SEND THE SIGNAL
 
1987
// INPUT                  CNDB_BLOCKS_COUNT
 
1988
/*---------------------------------------------------------------------------*/
 
1989
void Ndbcntr::sendNdbSttor(Signal* signal) 
 
1990
{
 
1991
  NdbBlocksRecPtr ndbBlocksPtr;
 
1992
 
 
1993
  ndbBlocksPtr.i = cndbBlocksCount;
 
1994
  ptrCheckGuard(ndbBlocksPtr, ZSIZE_NDB_BLOCKS_REC, ndbBlocksRec);
 
1995
 
 
1996
  NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
 
1997
  req->senderRef = reference();
 
1998
  req->nodeId = getOwnNodeId();
 
1999
  req->internalStartPhase = cinternalStartphase;
 
2000
  req->typeOfStart = ctypeOfStart;
 
2001
  req->masterNodeId = cmasterNodeId;
 
2002
  
 
2003
  for (int i = 0; i < 16; i++) {
 
2004
    // Garbage
 
2005
    req->config[i] = 0x88776655;
 
2006
    //cfgBlockPtr.p->cfgData[i];
 
2007
  }
 
2008
  
 
2009
  //#define MAX_STARTPHASE 2
 
2010
#ifdef TRACE_STTOR
 
2011
  ndbout_c("sending NDB_STTOR(%d) to %s",
 
2012
           cinternalStartphase, 
 
2013
           getBlockName( refToBlock(ndbBlocksPtr.p->blockref)));
 
2014
#endif
 
2015
  sendSignal(ndbBlocksPtr.p->blockref, GSN_NDB_STTOR, signal, 22, JBB);
 
2016
  cndbBlocksCount++;
 
2017
}//Ndbcntr::sendNdbSttor()
 
2018
 
 
2019
/*---------------------------------------------------------------------------*/
 
2020
// JUST SEND THE SIGNAL
 
2021
/*---------------------------------------------------------------------------*/
 
2022
void Ndbcntr::sendSttorry(Signal* signal) 
 
2023
{
 
2024
  signal->theData[3] = ZSTART_PHASE_1;
 
2025
  signal->theData[4] = ZSTART_PHASE_2;
 
2026
  signal->theData[5] = ZSTART_PHASE_3;
 
2027
  signal->theData[6] = ZSTART_PHASE_4;
 
2028
  signal->theData[7] = ZSTART_PHASE_5;
 
2029
  signal->theData[8] = ZSTART_PHASE_6;
 
2030
  // skip simulated phase 7
 
2031
  signal->theData[9] = ZSTART_PHASE_8;
 
2032
  signal->theData[10] = ZSTART_PHASE_9;
 
2033
  signal->theData[11] = ZSTART_PHASE_END;
 
2034
  sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 12, JBB);
 
2035
}//Ndbcntr::sendSttorry()
 
2036
 
 
2037
void
 
2038
Ndbcntr::execDUMP_STATE_ORD(Signal* signal)
 
2039
{
 
2040
  DumpStateOrd * const & dumpState = (DumpStateOrd *)&signal->theData[0];
 
2041
  Uint32 arg = dumpState->args[0];
 
2042
 
 
2043
  if(arg == 13){
 
2044
    infoEvent("Cntr: cstartPhase = %d, cinternalStartphase = %d, block = %d", 
 
2045
              cstartPhase, cinternalStartphase, cndbBlocksCount);
 
2046
    infoEvent("Cntr: cmasterNodeId = %d", cmasterNodeId);
 
2047
  }
 
2048
 
 
2049
  if (arg == DumpStateOrd::NdbcntrTestStopOnError){
 
2050
    if (m_ctx.m_config.stopOnError() == true)
 
2051
      ((Configuration&)m_ctx.m_config).stopOnError(false);
 
2052
    
 
2053
    const BlockReference tblockref = calcNdbCntrBlockRef(getOwnNodeId());
 
2054
      
 
2055
    SystemError * const sysErr = (SystemError*)&signal->theData[0];
 
2056
    sysErr->errorCode = SystemError::TestStopOnError;
 
2057
    sysErr->errorRef = reference();
 
2058
    sendSignal(tblockref, GSN_SYSTEM_ERROR, signal, 
 
2059
               SystemError::SignalLength, JBA);
 
2060
  }
 
2061
 
 
2062
  if (arg == DumpStateOrd::NdbcntrStopNodes)
 
2063
  {
 
2064
    NdbNodeBitmask mask;
 
2065
    for(Uint32 i = 1; i<signal->getLength(); i++)
 
2066
      mask.set(signal->theData[i]);
 
2067
 
 
2068
    StopReq* req = (StopReq*)signal->getDataPtrSend();
 
2069
    req->senderRef = RNIL;
 
2070
    req->senderData = 123;
 
2071
    req->requestInfo = 0;
 
2072
    req->singleuser = 0;
 
2073
    req->singleUserApi = 0;
 
2074
    mask.copyto(NdbNodeBitmask::Size, req->nodes);
 
2075
    StopReq::setPerformRestart(req->requestInfo, 1);
 
2076
    StopReq::setNoStart(req->requestInfo, 1);
 
2077
    StopReq::setStopNodes(req->requestInfo, 1);
 
2078
    StopReq::setStopAbort(req->requestInfo, 1);
 
2079
    
 
2080
    sendSignal(reference(), GSN_STOP_REQ, signal,
 
2081
               StopReq::SignalLength, JBB);
 
2082
    return;
 
2083
  }
 
2084
 
 
2085
}//Ndbcntr::execDUMP_STATE_ORD()
 
2086
 
 
2087
void Ndbcntr::updateNodeState(Signal* signal, const NodeState& newState) const{
 
2088
  NodeStateRep * const stateRep = (NodeStateRep *)&signal->theData[0];
 
2089
 
 
2090
  if (newState.startLevel == NodeState::SL_STARTED)
 
2091
  {
 
2092
    CRASH_INSERTION(1000);
 
2093
  }
 
2094
 
 
2095
  stateRep->nodeState = newState;
 
2096
  stateRep->nodeState.masterNodeId = cmasterNodeId;
 
2097
  stateRep->nodeState.setNodeGroup(c_nodeGroup);
 
2098
  
 
2099
  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
 
2100
    sendSignal(ALL_BLOCKS[i].Ref, GSN_NODE_STATE_REP, signal,
 
2101
               NodeStateRep::SignalLength, JBB);
 
2102
  }
 
2103
}
 
2104
 
 
2105
void
 
2106
Ndbcntr::execRESUME_REQ(Signal* signal){
 
2107
  //ResumeReq * const req = (ResumeReq *)&signal->theData[0];
 
2108
  //ResumeRef * const ref = (ResumeRef *)&signal->theData[0];
 
2109
  
 
2110
  jamEntry();
 
2111
 
 
2112
  signal->theData[0] = NDB_LE_SingleUser;
 
2113
  signal->theData[1] = 2;
 
2114
  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
 
2115
 
 
2116
  //Uint32 senderData = req->senderData;
 
2117
  //BlockReference senderRef = req->senderRef;
 
2118
  NodeState newState(NodeState::SL_STARTED);              
 
2119
  updateNodeState(signal, newState);
 
2120
  c_stopRec.stopReq.senderRef=0;
 
2121
}
 
2122
 
 
2123
void
 
2124
Ndbcntr::execSTOP_REQ(Signal* signal){
 
2125
  StopReq * const req = (StopReq *)&signal->theData[0];
 
2126
  StopRef * const ref = (StopRef *)&signal->theData[0];
 
2127
  Uint32 singleuser  = req->singleuser;
 
2128
  jamEntry();
 
2129
  Uint32 senderData = req->senderData;
 
2130
  BlockReference senderRef = req->senderRef;
 
2131
  bool abort = StopReq::getStopAbort(req->requestInfo);
 
2132
  bool stopnodes = StopReq::getStopNodes(req->requestInfo);
 
2133
 
 
2134
  if(!singleuser && 
 
2135
     (getNodeState().startLevel < NodeState::SL_STARTED || 
 
2136
      (abort && !stopnodes)))
 
2137
  {
 
2138
    /**
 
2139
     * Node is not started yet
 
2140
     *
 
2141
     * So stop it quickly
 
2142
     */
 
2143
    jam();
 
2144
    const Uint32 reqInfo = req->requestInfo;
 
2145
    if(StopReq::getPerformRestart(reqInfo)){
 
2146
      jam();
 
2147
      StartOrd * startOrd = (StartOrd *)&signal->theData[0];
 
2148
      startOrd->restartInfo = reqInfo;
 
2149
      sendSignal(CMVMI_REF, GSN_START_ORD, signal, 1, JBA);
 
2150
    } else {
 
2151
      jam();
 
2152
      sendSignal(CMVMI_REF, GSN_STOP_ORD, signal, 1, JBA);
 
2153
    }
 
2154
    return;
 
2155
  }
 
2156
 
 
2157
  if(c_stopRec.stopReq.senderRef != 0 ||
 
2158
     (cmasterNodeId == getOwnNodeId() && !c_start.m_starting.isclear()))
 
2159
  {
 
2160
    /**
 
2161
     * Requested a system shutdown
 
2162
     */
 
2163
    if(!singleuser && StopReq::getSystemStop(req->requestInfo)){
 
2164
      jam();
 
2165
      sendSignalWithDelay(reference(), GSN_STOP_REQ, signal, 100,
 
2166
                          StopReq::SignalLength);
 
2167
      return;
 
2168
    }
 
2169
 
 
2170
    /**
 
2171
     * Requested a node shutdown
 
2172
     */
 
2173
    if(c_stopRec.stopReq.senderRef &&
 
2174
       StopReq::getSystemStop(c_stopRec.stopReq.requestInfo))
 
2175
      ref->errorCode = StopRef::SystemShutdownInProgress;
 
2176
    else
 
2177
      ref->errorCode = StopRef::NodeShutdownInProgress;
 
2178
    ref->senderData = senderData;
 
2179
    ref->masterNodeId = cmasterNodeId;
 
2180
    
 
2181
    if (senderRef != RNIL)
 
2182
      sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
 
2183
    return;
 
2184
  }
 
2185
 
 
2186
  if (stopnodes && !abort)
 
2187
  {
 
2188
    jam();
 
2189
    ref->errorCode = StopRef::UnsupportedNodeShutdown;
 
2190
    ref->senderData = senderData;
 
2191
    ref->masterNodeId = cmasterNodeId;
 
2192
    if (senderRef != RNIL)
 
2193
      sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
 
2194
    return;
 
2195
  }
 
2196
 
 
2197
  if (stopnodes && cmasterNodeId != getOwnNodeId())
 
2198
  {
 
2199
    jam();
 
2200
    ref->errorCode = StopRef::MultiNodeShutdownNotMaster;
 
2201
    ref->senderData = senderData;
 
2202
    ref->masterNodeId = cmasterNodeId;
 
2203
    if (senderRef != RNIL)
 
2204
      sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
 
2205
    return;
 
2206
  }
 
2207
  
 
2208
  c_stopRec.stopReq = * req;
 
2209
  c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
 
2210
  
 
2211
  if (stopnodes)
 
2212
  {
 
2213
    jam();
 
2214
 
 
2215
    if(!c_stopRec.checkNodeFail(signal))
 
2216
    {
 
2217
      jam();
 
2218
      return;
 
2219
    }
 
2220
 
 
2221
    char buf[100];
 
2222
    NdbNodeBitmask mask;
 
2223
    mask.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
2224
    infoEvent("Initiating shutdown abort of %s", mask.getText(buf));
 
2225
    ndbout_c("Initiating shutdown abort of %s", mask.getText(buf));    
 
2226
 
 
2227
    WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
 
2228
    req->senderRef = reference();
 
2229
    req->senderData = StopRecord::SR_BLOCK_GCP_START_GCP;
 
2230
    req->requestType = WaitGCPReq::BlockStartGcp;
 
2231
    sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
 
2232
               WaitGCPReq::SignalLength, JBB);
 
2233
    return;
 
2234
  }
 
2235
  else if(!singleuser) 
 
2236
  {
 
2237
    if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo)) 
 
2238
    {
 
2239
      jam();
 
2240
      if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo))
 
2241
      {
 
2242
        ((Configuration&)m_ctx.m_config).stopOnError(false);
 
2243
      }
 
2244
    }
 
2245
    if(!c_stopRec.checkNodeFail(signal))
 
2246
    {
 
2247
      jam();
 
2248
      return;
 
2249
    }
 
2250
    signal->theData[0] = NDB_LE_NDBStopStarted;
 
2251
    signal->theData[1] = StopReq::getSystemStop(c_stopRec.stopReq.requestInfo) ? 1 : 0;
 
2252
    sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
 
2253
  }
 
2254
  else
 
2255
  {
 
2256
    signal->theData[0] = NDB_LE_SingleUser;
 
2257
    signal->theData[1] = 0;
 
2258
    sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
 
2259
  }
 
2260
 
 
2261
  NodeState newState(NodeState::SL_STOPPING_1, 
 
2262
                     StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
 
2263
  
 
2264
   if(singleuser) {
 
2265
     newState.setSingleUser(true);
 
2266
     newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
 
2267
   }
 
2268
  updateNodeState(signal, newState);
 
2269
  signal->theData[0] = ZSHUTDOWN;
 
2270
  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
 
2271
}
 
2272
 
 
2273
void
 
2274
Ndbcntr::StopRecord::checkTimeout(Signal* signal){
 
2275
  jamEntry();
 
2276
 
 
2277
  if(!cntr.getNodeState().getSingleUserMode())
 
2278
    if(!checkNodeFail(signal)){
 
2279
      jam();
 
2280
      return;
 
2281
    }
 
2282
 
 
2283
  switch(cntr.getNodeState().startLevel){
 
2284
  case NodeState::SL_STOPPING_1:
 
2285
    checkApiTimeout(signal);
 
2286
    break;
 
2287
  case NodeState::SL_STOPPING_2:
 
2288
    checkTcTimeout(signal);
 
2289
    break;
 
2290
  case NodeState::SL_STOPPING_3:
 
2291
    checkLqhTimeout_1(signal);
 
2292
    break;
 
2293
  case NodeState::SL_STOPPING_4:
 
2294
    checkLqhTimeout_2(signal);
 
2295
    break;
 
2296
  case NodeState::SL_SINGLEUSER:
 
2297
    break;
 
2298
  default:
 
2299
    ndbrequire(false);
 
2300
  }
 
2301
}
 
2302
 
 
2303
bool
 
2304
Ndbcntr::StopRecord::checkNodeFail(Signal* signal){
 
2305
  jam();
 
2306
  if(StopReq::getSystemStop(stopReq.requestInfo)){
 
2307
    jam();
 
2308
    return true;
 
2309
  }
 
2310
 
 
2311
  /**
 
2312
   * Check if I can survive me stopping
 
2313
   */
 
2314
  NodeBitmask ndbMask; 
 
2315
  ndbMask.assign(cntr.c_startedNodes);
 
2316
 
 
2317
  if (StopReq::getStopNodes(stopReq.requestInfo))
 
2318
  {
 
2319
    NdbNodeBitmask tmp;
 
2320
    tmp.assign(NdbNodeBitmask::Size, stopReq.nodes);
 
2321
 
 
2322
    NdbNodeBitmask ndbStopNodes;
 
2323
    ndbStopNodes.assign(NdbNodeBitmask::Size, stopReq.nodes);
 
2324
    ndbStopNodes.bitAND(ndbMask);
 
2325
    ndbStopNodes.copyto(NdbNodeBitmask::Size, stopReq.nodes);
 
2326
 
 
2327
    ndbMask.bitANDC(tmp);
 
2328
 
 
2329
    bool allNodesStopped = true;
 
2330
    int i ;
 
2331
    for( i = 0; i < (int) NdbNodeBitmask::Size; i++ ){
 
2332
      if ( stopReq.nodes[i] != 0 ){
 
2333
        allNodesStopped = false;
 
2334
        break;
 
2335
      }
 
2336
    }
 
2337
  
 
2338
    if ( allNodesStopped ) {
 
2339
      StopConf * const stopConf = (StopConf *)&signal->theData[0];
 
2340
      stopConf->senderData = stopReq.senderData;
 
2341
      stopConf->nodeState  = (Uint32) NodeState::SL_NOTHING;
 
2342
      cntr.sendSignal(stopReq.senderRef, GSN_STOP_CONF, signal,
 
2343
                       StopConf::SignalLength, JBB);
 
2344
      stopReq.senderRef = 0;
 
2345
      return false;
 
2346
    }
 
2347
 
 
2348
  }
 
2349
  else
 
2350
  {
 
2351
    ndbMask.clear(cntr.getOwnNodeId());
 
2352
  }
 
2353
  
 
2354
  CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
 
2355
  sd->blockRef = cntr.reference();
 
2356
  sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::ArbitCheck;
 
2357
  sd->mask = ndbMask;
 
2358
  cntr.EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, 
 
2359
                      CheckNodeGroups::SignalLength);
 
2360
  jamEntry();
 
2361
  switch (sd->output) {
 
2362
  case CheckNodeGroups::Win:
 
2363
  case CheckNodeGroups::Partitioning:
 
2364
    return true;
 
2365
    break;
 
2366
  }
 
2367
  
 
2368
  StopRef * const ref = (StopRef *)&signal->theData[0];    
 
2369
  
 
2370
  ref->senderData = stopReq.senderData;
 
2371
  ref->errorCode = StopRef::NodeShutdownWouldCauseSystemCrash;
 
2372
  ref->masterNodeId = cntr.cmasterNodeId;
 
2373
  
 
2374
  const BlockReference bref = stopReq.senderRef;
 
2375
  if (bref != RNIL)
 
2376
    cntr.sendSignal(bref, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
 
2377
  
 
2378
  stopReq.senderRef = 0;
 
2379
 
 
2380
  if (cntr.getNodeState().startLevel != NodeState::SL_SINGLEUSER)
 
2381
  {
 
2382
    NodeState newState(NodeState::SL_STARTED); 
 
2383
    cntr.updateNodeState(signal, newState);
 
2384
  }
 
2385
 
 
2386
  signal->theData[0] = NDB_LE_NDBStopAborted;
 
2387
  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 1, JBB);
 
2388
  
 
2389
  return false;
 
2390
}
 
2391
 
 
2392
void
 
2393
Ndbcntr::StopRecord::checkApiTimeout(Signal* signal){
 
2394
  const Int32 timeout = stopReq.apiTimeout; 
 
2395
  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
 
2396
  const NDB_TICKS now = NdbTick_CurrentMillisecond();
 
2397
  if((timeout >= 0 && now >= alarm)){
 
2398
    // || checkWithApiInSomeMagicWay)
 
2399
    jam();
 
2400
    NodeState newState(NodeState::SL_STOPPING_2, 
 
2401
                       StopReq::getSystemStop(stopReq.requestInfo));
 
2402
    if(stopReq.singleuser) {
 
2403
      newState.setSingleUser(true);
 
2404
      newState.setSingleUserApi(stopReq.singleUserApi);
 
2405
    }
 
2406
    cntr.updateNodeState(signal, newState);
 
2407
 
 
2408
    stopInitiatedTime = now;
 
2409
  }
 
2410
 
 
2411
  signal->theData[0] = ZSHUTDOWN;
 
2412
  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
 
2413
}
 
2414
 
 
2415
void
 
2416
Ndbcntr::StopRecord::checkTcTimeout(Signal* signal){
 
2417
  const Int32 timeout = stopReq.transactionTimeout;
 
2418
  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
 
2419
  const NDB_TICKS now = NdbTick_CurrentMillisecond();
 
2420
  if((timeout >= 0 && now >= alarm)){
 
2421
    // || checkWithTcInSomeMagicWay)
 
2422
    jam();
 
2423
    if(stopReq.getSystemStop(stopReq.requestInfo)  || stopReq.singleuser){
 
2424
      jam();
 
2425
      if(stopReq.singleuser) 
 
2426
      {
 
2427
        jam();
 
2428
        AbortAllReq * req = (AbortAllReq*)&signal->theData[0];
 
2429
        req->senderRef = cntr.reference();
 
2430
        req->senderData = 12;
 
2431
        cntr.sendSignal(DBTC_REF, GSN_ABORT_ALL_REQ, signal, 
 
2432
                        AbortAllReq::SignalLength, JBB);
 
2433
      } 
 
2434
      else
 
2435
      {
 
2436
        WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
 
2437
        req->senderRef = cntr.reference();
 
2438
        req->senderData = StopRecord::SR_CLUSTER_SHUTDOWN;
 
2439
        req->requestType = WaitGCPReq::CompleteForceStart;
 
2440
        cntr.sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
 
2441
                        WaitGCPReq::SignalLength, JBB);
 
2442
      }
 
2443
    } else {
 
2444
      jam();
 
2445
      StopPermReq * req = (StopPermReq*)&signal->theData[0];
 
2446
      req->senderRef = cntr.reference();
 
2447
      req->senderData = 12;
 
2448
      cntr.sendSignal(DBDIH_REF, GSN_STOP_PERM_REQ, signal, 
 
2449
                      StopPermReq::SignalLength, JBB);
 
2450
    }
 
2451
    return;
 
2452
  } 
 
2453
  signal->theData[0] = ZSHUTDOWN;
 
2454
  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
 
2455
}
 
2456
 
 
2457
void Ndbcntr::execSTOP_PERM_REF(Signal* signal){
 
2458
  //StopPermRef* const ref = (StopPermRef*)&signal->theData[0];
 
2459
 
 
2460
  jamEntry();
 
2461
 
 
2462
  signal->theData[0] = ZSHUTDOWN;
 
2463
  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
 
2464
}
 
2465
 
 
2466
void Ndbcntr::execSTOP_PERM_CONF(Signal* signal){
 
2467
  jamEntry();
 
2468
  
 
2469
  AbortAllReq * req = (AbortAllReq*)&signal->theData[0];
 
2470
  req->senderRef = reference();
 
2471
  req->senderData = 12;
 
2472
  sendSignal(DBTC_REF, GSN_ABORT_ALL_REQ, signal, 
 
2473
             AbortAllReq::SignalLength, JBB);
 
2474
}
 
2475
 
 
2476
void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
 
2477
  jamEntry();
 
2478
  if(c_stopRec.stopReq.singleuser) {
 
2479
    jam();
 
2480
 
 
2481
    NodeState newState(NodeState::SL_SINGLEUSER);    
 
2482
    newState.setSingleUser(true);
 
2483
    newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
 
2484
    updateNodeState(signal, newState);    
 
2485
    c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
 
2486
 
 
2487
    StopConf * const stopConf = (StopConf *)&signal->theData[0];
 
2488
    stopConf->senderData = c_stopRec.stopReq.senderData;
 
2489
    stopConf->nodeState  = (Uint32) NodeState::SL_SINGLEUSER;
 
2490
    sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_CONF, signal, StopConf::SignalLength, JBB);
 
2491
 
 
2492
    c_stopRec.stopReq.senderRef = 0; // the command is done
 
2493
 
 
2494
    signal->theData[0] = NDB_LE_SingleUser;
 
2495
    signal->theData[1] = 1;
 
2496
    signal->theData[2] = c_stopRec.stopReq.singleUserApi;
 
2497
    sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
 
2498
  }
 
2499
  else 
 
2500
    {
 
2501
      jam();
 
2502
      NodeState newState(NodeState::SL_STOPPING_3, 
 
2503
                         StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
 
2504
      updateNodeState(signal, newState);
 
2505
  
 
2506
      c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
 
2507
      
 
2508
      signal->theData[0] = ZSHUTDOWN;
 
2509
      sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
 
2510
    }
 
2511
}
 
2512
 
 
2513
void Ndbcntr::execABORT_ALL_REF(Signal* signal){
 
2514
  jamEntry();
 
2515
 
 
2516
  StopRef * const stopRef = (StopRef *)&signal->theData[0];
 
2517
  stopRef->senderData = c_stopRec.stopReq.senderData;
 
2518
  stopRef->errorCode = StopRef::TransactionAbortFailed;
 
2519
  stopRef->masterNodeId = cmasterNodeId;
 
2520
  sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
 
2521
}
 
2522
 
 
2523
void
 
2524
Ndbcntr::StopRecord::checkLqhTimeout_1(Signal* signal){
 
2525
  const Int32 timeout = stopReq.readOperationTimeout;
 
2526
  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
 
2527
  const NDB_TICKS now = NdbTick_CurrentMillisecond();
 
2528
  
 
2529
  if((timeout >= 0 && now >= alarm)){
 
2530
    // || checkWithLqhInSomeMagicWay)
 
2531
    jam();
 
2532
    
 
2533
    ChangeNodeStateReq * req = (ChangeNodeStateReq*)&signal->theData[0];
 
2534
 
 
2535
    NodeState newState(NodeState::SL_STOPPING_4, 
 
2536
                       StopReq::getSystemStop(stopReq.requestInfo));
 
2537
    req->nodeState = newState;
 
2538
    req->senderRef = cntr.reference();
 
2539
    req->senderData = 12;
 
2540
    cntr.sendSignal(DBLQH_REF, GSN_CHANGE_NODE_STATE_REQ, signal, 2, JBB);
 
2541
    return;
 
2542
  }
 
2543
  signal->theData[0] = ZSHUTDOWN;
 
2544
  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
 
2545
}
 
2546
 
 
2547
void Ndbcntr::execCHANGE_NODE_STATE_CONF(Signal* signal){
 
2548
  jamEntry();
 
2549
  signal->theData[0] = reference();
 
2550
  signal->theData[1] = 12;
 
2551
  sendSignal(DBDIH_REF, GSN_STOP_ME_REQ, signal, 2, JBB);
 
2552
}
 
2553
 
 
2554
void Ndbcntr::execSTOP_ME_REF(Signal* signal){
 
2555
  jamEntry();
 
2556
  ndbrequire(false);
 
2557
}
 
2558
 
 
2559
 
 
2560
void Ndbcntr::execSTOP_ME_CONF(Signal* signal){
 
2561
  jamEntry();
 
2562
 
 
2563
  NodeState newState(NodeState::SL_STOPPING_4, 
 
2564
                     StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
 
2565
  updateNodeState(signal, newState);
 
2566
  
 
2567
  c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
 
2568
  signal->theData[0] = ZSHUTDOWN;
 
2569
  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
 
2570
}
 
2571
 
 
2572
void
 
2573
Ndbcntr::StopRecord::checkLqhTimeout_2(Signal* signal){
 
2574
  const Int32 timeout = stopReq.operationTimeout; 
 
2575
  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
 
2576
  const NDB_TICKS now = NdbTick_CurrentMillisecond();
 
2577
 
 
2578
  if((timeout >= 0 && now >= alarm)){
 
2579
    // || checkWithLqhInSomeMagicWay)
 
2580
    jam();
 
2581
    if(StopReq::getPerformRestart(stopReq.requestInfo)){
 
2582
      jam();
 
2583
      StartOrd * startOrd = (StartOrd *)&signal->theData[0];
 
2584
      startOrd->restartInfo = stopReq.requestInfo;
 
2585
      cntr.sendSignal(CMVMI_REF, GSN_START_ORD, signal, 2, JBA);
 
2586
    } else {
 
2587
      jam();
 
2588
      cntr.sendSignal(CMVMI_REF, GSN_STOP_ORD, signal, 1, JBA);
 
2589
    }
 
2590
    return;
 
2591
  }
 
2592
  signal->theData[0] = ZSHUTDOWN;
 
2593
  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
 
2594
}
 
2595
 
 
2596
void Ndbcntr::execWAIT_GCP_REF(Signal* signal){
 
2597
  jamEntry();
 
2598
  
 
2599
  //WaitGCPRef* const ref = (WaitGCPRef*)&signal->theData[0];
 
2600
 
 
2601
  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
 
2602
  req->senderRef = reference();
 
2603
  req->senderData = StopRecord::SR_CLUSTER_SHUTDOWN;
 
2604
  req->requestType = WaitGCPReq::CompleteForceStart;
 
2605
  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
 
2606
             WaitGCPReq::SignalLength, JBB);
 
2607
}
 
2608
 
 
2609
void Ndbcntr::execWAIT_GCP_CONF(Signal* signal){
 
2610
  jamEntry();
 
2611
 
 
2612
  WaitGCPConf* conf = (WaitGCPConf*)signal->getDataPtr();
 
2613
 
 
2614
  switch(conf->senderData){
 
2615
  case StopRecord::SR_BLOCK_GCP_START_GCP:
 
2616
  {
 
2617
    jam();
 
2618
    /**
 
2619
     * 
 
2620
     */
 
2621
    if(!c_stopRec.checkNodeFail(signal))
 
2622
    {
 
2623
      jam();
 
2624
      goto unblock;
 
2625
    }
 
2626
    
 
2627
    WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
 
2628
    req->senderRef = reference();
 
2629
    req->senderData = StopRecord::SR_WAIT_COMPLETE_GCP;
 
2630
    req->requestType = WaitGCPReq::CompleteIfRunning;
 
2631
 
 
2632
    sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
 
2633
               WaitGCPReq::SignalLength, JBB);
 
2634
    return;
 
2635
  }
 
2636
  case StopRecord::SR_UNBLOCK_GCP_START_GCP:
 
2637
  {
 
2638
    jam();
 
2639
    return;
 
2640
  }
 
2641
  case StopRecord::SR_WAIT_COMPLETE_GCP:
 
2642
  {
 
2643
    jam();
 
2644
    if(!c_stopRec.checkNodeFail(signal))
 
2645
    {
 
2646
      jam();
 
2647
      goto unblock;
 
2648
    }
 
2649
 
 
2650
    NdbNodeBitmask tmp;
 
2651
    tmp.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
2652
    c_stopRec.m_stop_req_counter = tmp;
 
2653
    NodeReceiverGroup rg(QMGR, tmp);
 
2654
    StopReq * stopReq = (StopReq *)&signal->theData[0];
 
2655
    * stopReq = c_stopRec.stopReq;
 
2656
    stopReq->senderRef = reference();
 
2657
    sendSignal(rg, GSN_STOP_REQ, signal, StopReq::SignalLength, JBA);
 
2658
    c_stopRec.m_state = StopRecord::SR_QMGR_STOP_REQ; 
 
2659
    return;
 
2660
  }
 
2661
  case StopRecord::SR_CLUSTER_SHUTDOWN:
 
2662
  {
 
2663
    jam();
 
2664
    break;
 
2665
  }
 
2666
  }
 
2667
  
 
2668
  {  
 
2669
    ndbrequire(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
 
2670
    NodeState newState(NodeState::SL_STOPPING_3, true); 
 
2671
    
 
2672
    /**
 
2673
     * Inform QMGR so that arbitrator won't kill us
 
2674
     */
 
2675
    NodeStateRep * rep = (NodeStateRep *)&signal->theData[0];
 
2676
    rep->nodeState = newState;
 
2677
    rep->nodeState.masterNodeId = cmasterNodeId;
 
2678
    rep->nodeState.setNodeGroup(c_nodeGroup);
 
2679
    EXECUTE_DIRECT(QMGR, GSN_NODE_STATE_REP, signal, 
 
2680
                   NodeStateRep::SignalLength);
 
2681
    
 
2682
    if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){
 
2683
      jam();
 
2684
      StartOrd * startOrd = (StartOrd *)&signal->theData[0];
 
2685
      startOrd->restartInfo = c_stopRec.stopReq.requestInfo;
 
2686
      sendSignalWithDelay(CMVMI_REF, GSN_START_ORD, signal, 500, 
 
2687
                          StartOrd::SignalLength);
 
2688
    } else {
 
2689
      jam();
 
2690
      sendSignalWithDelay(CMVMI_REF, GSN_STOP_ORD, signal, 500, 1);
 
2691
    }
 
2692
    return;
 
2693
  }
 
2694
  
 
2695
unblock:
 
2696
  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
 
2697
  req->senderRef = reference();
 
2698
  req->senderData = StopRecord::SR_UNBLOCK_GCP_START_GCP;
 
2699
  req->requestType = WaitGCPReq::UnblockStartGcp;
 
2700
  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal, 
 
2701
             WaitGCPReq::SignalLength, JBB);
 
2702
}
 
2703
 
 
2704
void
 
2705
Ndbcntr::execSTOP_CONF(Signal* signal)
 
2706
{
 
2707
  jamEntry();
 
2708
  StopConf *conf = (StopConf*)signal->getDataPtr();
 
2709
  ndbrequire(c_stopRec.m_state == StopRecord::SR_QMGR_STOP_REQ);
 
2710
  c_stopRec.m_stop_req_counter.clearWaitingFor(conf->nodeId);
 
2711
  if (c_stopRec.m_stop_req_counter.done())
 
2712
  {
 
2713
    char buf[100];
 
2714
    NdbNodeBitmask mask;
 
2715
    mask.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
 
2716
    infoEvent("Stopping of %s", mask.getText(buf));
 
2717
    ndbout_c("Stopping of %s", mask.getText(buf));    
 
2718
 
 
2719
    /**
 
2720
     * Kill any node...
 
2721
     */
 
2722
    FailRep * const failRep = (FailRep *)&signal->theData[0];
 
2723
    failRep->failCause = FailRep::ZMULTI_NODE_SHUTDOWN;
 
2724
    NodeReceiverGroup rg(QMGR, c_clusterNodes);
 
2725
    Uint32 nodeId = 0;
 
2726
    while ((nodeId = NdbNodeBitmask::find(c_stopRec.stopReq.nodes, nodeId+1))
 
2727
           != NdbNodeBitmask::NotFound)
 
2728
    {
 
2729
      failRep->failNodeId = nodeId;
 
2730
      sendSignal(rg, GSN_FAIL_REP, signal, FailRep::SignalLength, JBA);
 
2731
    }
 
2732
    c_stopRec.m_state = StopRecord::SR_WAIT_NODE_FAILURES;
 
2733
    return;
 
2734
  }
 
2735
}
 
2736
 
 
2737
void Ndbcntr::execSTTORRY(Signal* signal){
 
2738
  jamEntry();
 
2739
  c_missra.execSTTORRY(signal);
 
2740
}
 
2741
 
 
2742
void Ndbcntr::execREAD_CONFIG_CONF(Signal* signal){
 
2743
  jamEntry();
 
2744
  c_missra.execREAD_CONFIG_CONF(signal);
 
2745
}
 
2746
 
 
2747
void Ndbcntr::execSTART_ORD(Signal* signal){
 
2748
  jamEntry();
 
2749
  c_missra.execSTART_ORD(signal);
 
2750
}
 
2751
 
 
2752
#define CLEAR_DX 13
 
2753
#define CLEAR_LCP 3
 
2754
 
 
2755
void
 
2756
Ndbcntr::clearFilesystem(Signal* signal)
 
2757
{
 
2758
  const Uint32 lcp = c_fsRemoveCount >= CLEAR_DX;
 
2759
  
 
2760
  FsRemoveReq * req  = (FsRemoveReq *)signal->getDataPtrSend();
 
2761
  req->userReference = reference();
 
2762
  req->userPointer   = 0;
 
2763
  req->directory     = 1;
 
2764
  req->ownDirectory  = 1;
 
2765
 
 
2766
  if (lcp == 0)
 
2767
  {
 
2768
    FsOpenReq::setVersion(req->fileNumber, 3);
 
2769
    FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL); // Can by any...
 
2770
    FsOpenReq::v1_setDisk(req->fileNumber, c_fsRemoveCount);
 
2771
  }
 
2772
  else
 
2773
  {
 
2774
    FsOpenReq::setVersion(req->fileNumber, 5);
 
2775
    FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
 
2776
    FsOpenReq::v5_setLcpNo(req->fileNumber, c_fsRemoveCount - CLEAR_DX);
 
2777
    FsOpenReq::v5_setTableId(req->fileNumber, 0);
 
2778
    FsOpenReq::v5_setFragmentId(req->fileNumber, 0);
 
2779
  }
 
2780
  sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, 
 
2781
             FsRemoveReq::SignalLength, JBA);
 
2782
  c_fsRemoveCount++;
 
2783
}
 
2784
 
 
2785
void
 
2786
Ndbcntr::execFSREMOVECONF(Signal* signal){
 
2787
  jamEntry();
 
2788
  if(c_fsRemoveCount == CLEAR_DX + CLEAR_LCP){
 
2789
    jam();
 
2790
    sendSttorry(signal);
 
2791
  } else {
 
2792
    jam();
 
2793
    ndbrequire(c_fsRemoveCount < CLEAR_DX + CLEAR_LCP);
 
2794
    clearFilesystem(signal);
 
2795
  }//if
 
2796
}
 
2797
 
 
2798
void Ndbcntr::Missra::execSTART_ORD(Signal* signal){
 
2799
  signal->theData[0] = NDB_LE_NDBStartStarted;
 
2800
  signal->theData[1] = NDB_VERSION;
 
2801
  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
 
2802
 
 
2803
  currentBlockIndex = 0;
 
2804
  sendNextREAD_CONFIG_REQ(signal);
 
2805
}
 
2806
 
 
2807
void Ndbcntr::Missra::sendNextREAD_CONFIG_REQ(Signal* signal){
 
2808
 
 
2809
  if(currentBlockIndex < ALL_BLOCKS_SZ){
 
2810
    jam();
 
2811
 
 
2812
    ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtrSend();    
 
2813
    req->senderData = 0;
 
2814
    req->senderRef = cntr.reference();
 
2815
    req->noOfParameters = 0;
 
2816
    
 
2817
    const BlockReference ref = readConfigOrder[currentBlockIndex];
 
2818
 
 
2819
#if 0 
 
2820
    ndbout_c("sending READ_CONFIG_REQ to %s(ref=%x index=%d)", 
 
2821
             getBlockName( refToBlock(ref)),
 
2822
             ref,
 
2823
             currentBlockIndex);
 
2824
#endif
 
2825
    
 
2826
    cntr.sendSignal(ref, GSN_READ_CONFIG_REQ, signal, 
 
2827
                    ReadConfigReq::SignalLength, JBB);
 
2828
    return;
 
2829
  }
 
2830
  
 
2831
  /**
 
2832
   * Finished...
 
2833
   */
 
2834
  currentStartPhase = 0;
 
2835
  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
 
2836
    if(ALL_BLOCKS[i].NextSP < currentStartPhase)
 
2837
      currentStartPhase = ALL_BLOCKS[i].NextSP;
 
2838
  }
 
2839
  
 
2840
  currentBlockIndex = 0;
 
2841
  sendNextSTTOR(signal);
 
2842
}
 
2843
 
 
2844
void Ndbcntr::Missra::execREAD_CONFIG_CONF(Signal* signal){
 
2845
  const ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtr();
 
2846
 
 
2847
  const Uint32 ref = conf->senderRef;
 
2848
  ndbrequire(refToBlock(readConfigOrder[currentBlockIndex])
 
2849
             == refToBlock(ref));
 
2850
 
 
2851
  currentBlockIndex++;
 
2852
  sendNextREAD_CONFIG_REQ(signal);
 
2853
}
 
2854
 
 
2855
void Ndbcntr::Missra::execSTTORRY(Signal* signal){
 
2856
  const BlockReference ref = signal->senderBlockRef();
 
2857
  ndbrequire(refToBlock(ref) == refToBlock(ALL_BLOCKS[currentBlockIndex].Ref));
 
2858
  
 
2859
  /**
 
2860
   * Update next start phase
 
2861
   */
 
2862
  for (Uint32 i = 3; i < 25; i++){
 
2863
    jam();
 
2864
    if (signal->theData[i] > currentStartPhase){
 
2865
      jam();
 
2866
      ALL_BLOCKS[currentBlockIndex].NextSP = signal->theData[i];
 
2867
      break;
 
2868
    }
 
2869
  }    
 
2870
  
 
2871
  currentBlockIndex++;
 
2872
  sendNextSTTOR(signal);
 
2873
}
 
2874
 
 
2875
void Ndbcntr::Missra::sendNextSTTOR(Signal* signal){
 
2876
 
 
2877
  for(; currentStartPhase < 255 ;
 
2878
      currentStartPhase++, g_currentStartPhase = currentStartPhase){
 
2879
    jam();
 
2880
    
 
2881
    const Uint32 start = currentBlockIndex;
 
2882
 
 
2883
    if (currentStartPhase == ZSTART_PHASE_6)
 
2884
    {
 
2885
      // Ndbd has passed the critical startphases.
 
2886
      // Change error handler from "startup" state
 
2887
      // to normal state.
 
2888
      ErrorReporter::setErrorHandlerShutdownType();
 
2889
    }
 
2890
 
 
2891
    for(; currentBlockIndex < ALL_BLOCKS_SZ; currentBlockIndex++){
 
2892
      jam();
 
2893
      if(ALL_BLOCKS[currentBlockIndex].NextSP == currentStartPhase){
 
2894
        jam();
 
2895
        signal->theData[0] = 0;
 
2896
        signal->theData[1] = currentStartPhase;
 
2897
        signal->theData[2] = 0;
 
2898
        signal->theData[3] = 0;
 
2899
        signal->theData[4] = 0;
 
2900
        signal->theData[5] = 0;
 
2901
        signal->theData[6] = 0;
 
2902
        signal->theData[7] = cntr.ctypeOfStart;
 
2903
        
 
2904
        const BlockReference ref = ALL_BLOCKS[currentBlockIndex].Ref;
 
2905
 
 
2906
#ifdef MAX_STARTPHASE
 
2907
        ndbrequire(currentStartPhase <= MAX_STARTPHASE);
 
2908
#endif
 
2909
 
 
2910
#ifdef TRACE_STTOR
 
2911
        ndbout_c("sending STTOR(%d) to %s(ref=%x index=%d)", 
 
2912
                 currentStartPhase,
 
2913
                 getBlockName( refToBlock(ref)),
 
2914
                 ref,
 
2915
                 currentBlockIndex);
 
2916
#endif
 
2917
        
 
2918
        cntr.sendSignal(ref, GSN_STTOR, signal, 8, JBB);
 
2919
        
 
2920
        return;
 
2921
      }
 
2922
    }
 
2923
    
 
2924
    currentBlockIndex = 0;
 
2925
 
 
2926
    NodeState newState(NodeState::SL_STARTING, currentStartPhase, 
 
2927
                       (NodeState::StartType)cntr.ctypeOfStart);
 
2928
    cntr.updateNodeState(signal, newState);
 
2929
    
 
2930
    if(start != 0){
 
2931
      /**
 
2932
       * At least one wanted this start phase,  report it
 
2933
       */
 
2934
      jam();
 
2935
      signal->theData[0] = NDB_LE_StartPhaseCompleted;
 
2936
      signal->theData[1] = currentStartPhase;
 
2937
      signal->theData[2] = cntr.ctypeOfStart;    
 
2938
      cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
 
2939
    }
 
2940
  }
 
2941
 
 
2942
  signal->theData[0] = NDB_LE_NDBStartCompleted;
 
2943
  signal->theData[1] = NDB_VERSION;
 
2944
  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
 
2945
  
 
2946
  NodeState newState(NodeState::SL_STARTED);
 
2947
  cntr.updateNodeState(signal, newState);
 
2948
 
 
2949
  /**
 
2950
   * Backward
 
2951
   */
 
2952
  UpgradeStartup::sendCmAppChg(cntr, signal, 3); //RUN
 
2953
 
 
2954
  NdbNodeBitmask nodes = cntr.c_clusterNodes;
 
2955
  Uint32 node = 0;
 
2956
  while((node = nodes.find(node+1)) != NdbNodeBitmask::NotFound){
 
2957
    if(cntr.getNodeInfo(node).m_version < MAKE_VERSION(3,5,0)){
 
2958
      nodes.clear(node);
 
2959
    }
 
2960
  }
 
2961
  
 
2962
  NodeReceiverGroup rg(NDBCNTR, nodes);
 
2963
  signal->theData[0] = cntr.getOwnNodeId();
 
2964
  cntr.sendSignal(rg, GSN_CNTR_START_REP, signal, 1, JBB);
 
2965
}
 
2966
 
 
2967
/**
 
2968
 * Backward compatible code
 
2969
 */
 
2970
void
 
2971
UpgradeStartup::sendCmAppChg(Ndbcntr& cntr, Signal* signal, Uint32 startLevel){
 
2972
  
 
2973
  if(cntr.getNodeInfo(cntr.cmasterNodeId).m_version >= MAKE_VERSION(3,5,0)){
 
2974
    jam();
 
2975
    return;
 
2976
  }
 
2977
 
 
2978
  /**
 
2979
   * Old NDB running
 
2980
   */
 
2981
  
 
2982
  signal->theData[0] = startLevel;
 
2983
  signal->theData[1] = cntr.getOwnNodeId();
 
2984
  signal->theData[2] = 3 | ('N' << 8);
 
2985
  signal->theData[3] = 'D' | ('B' << 8);
 
2986
  signal->theData[4] = 0;
 
2987
  signal->theData[5] = 0;
 
2988
  signal->theData[6] = 0;
 
2989
  signal->theData[7] = 0;
 
2990
  signal->theData[8] = 0;
 
2991
  signal->theData[9] = 0;
 
2992
  signal->theData[10] = 0;
 
2993
  signal->theData[11] = 0;
 
2994
  
 
2995
  NdbNodeBitmask nodes = cntr.c_clusterNodes;
 
2996
  nodes.clear(cntr.getOwnNodeId());
 
2997
  Uint32 node = 0;
 
2998
  while((node = nodes.find(node+1)) != NdbNodeBitmask::NotFound){
 
2999
    if(cntr.getNodeInfo(node).m_version < MAKE_VERSION(3,5,0)){
 
3000
      cntr.sendSignal(cntr.calcQmgrBlockRef(node),
 
3001
                      GSN_CM_APPCHG, signal, 12, JBB);
 
3002
    } else {
 
3003
      cntr.c_startedNodes.set(node); // Fake started
 
3004
    }
 
3005
  }
 
3006
}
 
3007
 
 
3008
void
 
3009
UpgradeStartup::execCM_APPCHG(SimulatedBlock & block, Signal* signal){
 
3010
  Uint32 state = signal->theData[0];
 
3011
  Uint32 nodeId = signal->theData[1];
 
3012
  if(block.number() == QMGR){
 
3013
    Ndbcntr& cntr = * (Ndbcntr*)globalData.getBlock(CNTR);
 
3014
    switch(state){
 
3015
    case 0: // ZADD
 
3016
      break;
 
3017
    case 2: // ZSTART
 
3018
      break;
 
3019
    case 3: // ZRUN{
 
3020
      cntr.c_startedNodes.set(nodeId);
 
3021
 
 
3022
      Uint32 recv = cntr.c_startedNodes.count();
 
3023
      Uint32 cnt = cntr.c_clusterNodes.count();
 
3024
      if(recv + 1 == cnt){ //+1 == own node
 
3025
        /**
 
3026
         * Check master
 
3027
         */
 
3028
        sendCntrMasterReq(cntr, signal, 0);
 
3029
      }
 
3030
      return;
 
3031
    }
 
3032
  }
 
3033
  block.progError(__LINE__,NDBD_EXIT_NDBREQUIRE,
 
3034
                  "UpgradeStartup::execCM_APPCHG");
 
3035
}
 
3036
 
 
3037
void
 
3038
UpgradeStartup::sendCntrMasterReq(Ndbcntr& cntr, Signal* signal, Uint32 n){
 
3039
  Uint32 node = cntr.c_startedNodes.find(n);
 
3040
  if(node != NdbNodeBitmask::NotFound && 
 
3041
     (node == cntr.getOwnNodeId() || 
 
3042
      cntr.getNodeInfo(node).m_version >= MAKE_VERSION(3,5,0))){
 
3043
    node = cntr.c_startedNodes.find(node+1);
 
3044
  }
 
3045
  
 
3046
  if(node == NdbNodeBitmask::NotFound){
 
3047
    cntr.progError(__LINE__,NDBD_EXIT_NDBREQUIRE,
 
3048
                   "UpgradeStartup::sendCntrMasterReq "
 
3049
                   "NdbNodeBitmask::NotFound");
 
3050
  }
 
3051
 
 
3052
  CntrMasterReq * const cntrMasterReq = (CntrMasterReq*)&signal->theData[0];
 
3053
  cntr.c_clusterNodes.copyto(NdbNodeBitmask::Size, cntrMasterReq->theNodes);
 
3054
  NdbNodeBitmask::clear(cntrMasterReq->theNodes, cntr.getOwnNodeId());
 
3055
  cntrMasterReq->userBlockRef = 0;
 
3056
  cntrMasterReq->userNodeId = cntr.getOwnNodeId();
 
3057
  cntrMasterReq->typeOfStart = NodeState::ST_INITIAL_NODE_RESTART;
 
3058
  cntrMasterReq->noRestartNodes = cntr.c_clusterNodes.count() - 1;
 
3059
  cntr.sendSignal(cntr.calcNdbCntrBlockRef(node), GSN_CNTR_MASTERREQ,
 
3060
                  signal, CntrMasterReq::SignalLength, JBB);
 
3061
}
 
3062
 
 
3063
void
 
3064
UpgradeStartup::execCNTR_MASTER_REPLY(SimulatedBlock & block, Signal* signal){
 
3065
  Uint32 gsn = signal->header.theVerId_signalNumber;
 
3066
  Uint32 node = refToNode(signal->getSendersBlockRef());
 
3067
  if(block.number() == CNTR){
 
3068
    Ndbcntr& cntr = (Ndbcntr&)block;
 
3069
    switch(gsn){
 
3070
    case GSN_CNTR_MASTERREF:
 
3071
      sendCntrMasterReq(cntr, signal, node + 1);
 
3072
      return;
 
3073
      break;
 
3074
    case GSN_CNTR_MASTERCONF:{
 
3075
      CntrStartConf* conf = (CntrStartConf*)signal->getDataPtrSend();
 
3076
      conf->startGci = 0;
 
3077
      conf->masterNodeId = node;
 
3078
      conf->noStartNodes = 1;
 
3079
      conf->startType = NodeState::ST_INITIAL_NODE_RESTART;
 
3080
      NodeBitmask mask;
 
3081
      mask.clear();
 
3082
      mask.copyto(NdbNodeBitmask::Size, conf->startedNodes);
 
3083
      mask.clear();
 
3084
      mask.set(cntr.getOwnNodeId());
 
3085
      mask.copyto(NdbNodeBitmask::Size, conf->startingNodes);
 
3086
      cntr.execCNTR_START_CONF(signal);
 
3087
      return;
 
3088
    }
 
3089
    }
 
3090
  }
 
3091
  block.progError(__LINE__,NDBD_EXIT_NDBREQUIRE,
 
3092
                  "UpgradeStartup::execCNTR_MASTER_REPLY");
 
3093
}