MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
NdbcntrMain.cpp
1 /*
2  Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; version 2 of the License.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #define NDBCNTR_C
19 #include "Ndbcntr.hpp"
20 
21 #include <ndb_limits.h>
22 #include <ndb_version.h>
23 #include <SimpleProperties.hpp>
24 #include <signaldata/DictTabInfo.hpp>
25 #include <signaldata/SchemaTrans.hpp>
26 #include <signaldata/CreateTable.hpp>
27 #include <signaldata/CreateHashMap.hpp>
28 #include <signaldata/ReadNodesConf.hpp>
29 #include <signaldata/NodeFailRep.hpp>
30 #include <signaldata/TcKeyReq.hpp>
31 #include <signaldata/TcKeyConf.hpp>
32 #include <signaldata/EventReport.hpp>
33 #include <signaldata/NodeStateSignalData.hpp>
34 #include <signaldata/StopPerm.hpp>
35 #include <signaldata/StopMe.hpp>
36 #include <signaldata/WaitGCP.hpp>
37 #include <signaldata/CheckNodeGroups.hpp>
38 #include <signaldata/StartOrd.hpp>
39 #include <signaldata/AbortAll.hpp>
40 #include <signaldata/SystemError.hpp>
41 #include <signaldata/NdbSttor.hpp>
42 #include <signaldata/CntrStart.hpp>
43 #include <signaldata/DumpStateOrd.hpp>
44 
45 #include <signaldata/FsRemoveReq.hpp>
46 #include <signaldata/ReadConfig.hpp>
47 
48 #include <signaldata/FailRep.hpp>
49 
50 #include <AttributeHeader.hpp>
51 #include <Configuration.hpp>
52 #include <DebuggerNames.hpp>
53 #include <signaldata/DihRestart.hpp>
54 
55 #include <NdbOut.hpp>
56 #include <NdbTick.h>
57 
58 #include <signaldata/TakeOver.hpp>
59 #include <signaldata/CreateNodegroupImpl.hpp>
60 #include <signaldata/DropNodegroupImpl.hpp>
61 #include <signaldata/CreateFilegroup.hpp>
62 
63 #include <EventLogger.hpp>
64 
65 extern EventLogger * g_eventLogger;
66 
67 // used during shutdown for reporting current startphase
68 // accessed from Emulator.cpp, NdbShutdown()
69 Uint32 g_currentStartPhase;
70 
76 struct BlockInfo {
77  BlockReference Ref; // BlockReference
78  Uint32 NextSP; // Next start phase
79  Uint32 ErrorInsertStart;
80  Uint32 ErrorInsertStop;
81 };
82 
83 static BlockInfo ALL_BLOCKS[] = {
84  { NDBFS_REF, 0 , 2000, 2999 },
85  { DBTC_REF, 1 , 8000, 8035 },
86  { DBDIH_REF, 1 , 7000, 7173 },
87  { DBLQH_REF, 1 , 5000, 5030 },
88  { DBACC_REF, 1 , 3000, 3999 },
89  { DBTUP_REF, 1 , 4000, 4007 },
90  { DBDICT_REF, 1 , 6000, 6003 },
91  { NDBCNTR_REF, 0 , 1000, 1999 },
92  { CMVMI_REF, 1 , 9000, 9999 }, // before QMGR
93  { QMGR_REF, 1 , 1, 999 },
94  { TRIX_REF, 1 , 0, 0 },
95  { BACKUP_REF, 1 , 10000, 10999 },
96  { DBUTIL_REF, 1 , 11000, 11999 },
97  { SUMA_REF, 1 , 13000, 13999 },
98  { DBTUX_REF, 1 , 12000, 12999 }
99  ,{ TSMAN_REF, 1 , 0, 0 }
100  ,{ LGMAN_REF, 1 , 0, 0 }
101  ,{ PGMAN_REF, 1 , 0, 0 }
102  ,{ RESTORE_REF,1 , 0, 0 }
103  ,{ DBINFO_REF,1 , 0, 0 }
104  ,{ DBSPJ_REF,1 , 0, 0 }
105 };
106 
107 static const Uint32 ALL_BLOCKS_SZ = sizeof(ALL_BLOCKS)/sizeof(BlockInfo);
108 
109 static BlockReference readConfigOrder[ALL_BLOCKS_SZ] = {
110  CMVMI_REF,
111  NDBFS_REF,
112  DBINFO_REF,
113  DBTUP_REF,
114  DBACC_REF,
115  DBTC_REF,
116  DBLQH_REF,
117  DBTUX_REF,
118  DBDICT_REF,
119  DBDIH_REF,
120  NDBCNTR_REF,
121  QMGR_REF,
122  TRIX_REF,
123  BACKUP_REF,
124  DBUTIL_REF,
125  SUMA_REF,
126  TSMAN_REF,
127  LGMAN_REF,
128  PGMAN_REF,
129  RESTORE_REF,
130  DBSPJ_REF
131 };
132 
133 /*******************************/
134 /* CONTINUEB */
135 /*******************************/
136 void Ndbcntr::execCONTINUEB(Signal* signal)
137 {
138  jamEntry();
139  UintR Ttemp1 = signal->theData[0];
140  switch (Ttemp1) {
141  case ZSTARTUP:{
142  if(getNodeState().startLevel == NodeState::SL_STARTED){
143  jam();
144  return;
145  }
146 
147  if(cmasterNodeId == getOwnNodeId() && c_start.m_starting.isclear()){
148  jam();
149  trySystemRestart(signal);
150  // Fall-through
151  }
152 
153  Uint64 now = NdbTick_CurrentMillisecond();
154  if(now > c_start.m_startFailureTimeout)
155  {
156  jam();
157  Uint32 to_3= 0;
158  const ndb_mgm_configuration_iterator * p =
159  m_ctx.m_config.getOwnConfigIterator();
160  ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3);
161  BaseString tmp;
162  tmp.append("Shutting down node as total restart time exceeds "
163  " StartFailureTimeout as set in config file ");
164  if(to_3 == 0)
165  tmp.append(" 0 (inifinite)");
166  else
167  tmp.appfmt(" %d", to_3);
168 
169  progError(__LINE__, NDBD_EXIT_RESTART_TIMEOUT, tmp.c_str());
170  }
171 
172  signal->theData[0] = ZSTARTUP;
173  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1);
174  break;
175  }
176  case ZSHUTDOWN:
177  jam();
178  c_stopRec.checkTimeout(signal);
179  break;
180  case ZBLOCK_STTOR:
181  if (ERROR_INSERTED(1002))
182  {
183  signal->theData[0] = ZBLOCK_STTOR;
184  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
185  return;
186  }
187  else
188  {
189  c_missra.sendNextSTTOR(signal);
190  }
191  return;
192  default:
193  jam();
194  systemErrorLab(signal, __LINE__);
195  return;
196  break;
197  }//switch
198 }//Ndbcntr::execCONTINUEB()
199 
200 void
201 Ndbcntr::execAPI_START_REP(Signal* signal)
202 {
203  if(refToBlock(signal->getSendersBlockRef()) == QMGR)
204  {
205  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
206  sendSignal(ALL_BLOCKS[i].Ref, GSN_API_START_REP, signal, 1, JBB);
207  }
208  }
209 }
210 /*******************************/
211 /* SYSTEM_ERROR */
212 /*******************************/
213 void Ndbcntr::execSYSTEM_ERROR(Signal* signal)
214 {
215  const SystemError * const sysErr = (SystemError *)signal->getDataPtr();
216  char buf[100];
217  int killingNode = refToNode(sysErr->errorRef);
218  Uint32 data1 = sysErr->data[0];
219 
220  jamEntry();
221  switch (sysErr->errorCode){
222  case SystemError::GCPStopDetected:
223  {
224  BaseString::snprintf(buf, sizeof(buf),
225  "Node %d killed this node because "
226  "GCP stop was detected",
227  killingNode);
228  signal->theData[0] = 7025;
229  EXECUTE_DIRECT(DBDIH, GSN_DUMP_STATE_ORD, signal, 1);
230  jamEntry();
231 
232  {
233  signal->theData[0] = 12002;
234  EXECUTE_DIRECT(LGMAN, GSN_DUMP_STATE_ORD, signal, 1, 0);
235  }
236 
237  jamEntry();
238  break;
239  }
240  case SystemError::CopyFragRefError:
241  CRASH_INSERTION(1000);
242  BaseString::snprintf(buf, sizeof(buf),
243  "Killed by node %d as "
244  "copyfrag failed, error: %u",
245  killingNode, data1);
246  break;
247 
248  case SystemError::StartFragRefError:
249  BaseString::snprintf(buf, sizeof(buf),
250  "Node %d killed this node because "
251  "it replied StartFragRef error code: %u.",
252  killingNode, data1);
253  break;
254 
255  case SystemError::CopySubscriptionRef:
256  BaseString::snprintf(buf, sizeof(buf),
257  "Node %d killed this node because "
258  "it could not copy a subscription during node restart. "
259  "Copy subscription error code: %u.",
260  killingNode, data1);
261  break;
262  case SystemError::CopySubscriberRef:
263  BaseString::snprintf(buf, sizeof(buf),
264  "Node %d killed this node because "
265  "it could not start a subscriber during node restart. "
266  "Copy subscription error code: %u.",
267  killingNode, data1);
268  break;
269  default:
270  BaseString::snprintf(buf, sizeof(buf), "System error %d, "
271  " this node was killed by node %d",
272  sysErr->errorCode, killingNode);
273  break;
274  }
275 
276  progError(__LINE__, NDBD_EXIT_SYSTEM_ERROR, buf);
277  return;
278 }//Ndbcntr::execSYSTEM_ERROR()
279 
280 
281 struct ddentry
282 {
283  Uint32 type;
284  const char * name;
285  Uint64 size;
286 };
287 
297 Vector<ddentry> f_dd;
298 
299 Uint64
300 parse_size(const char * src)
301 {
302  Uint64 num = 0;
303  char * endptr = 0;
304  num = strtoll(src, &endptr, 10);
305 
306  if (endptr)
307  {
308  switch(* endptr){
309  case 'k':
310  case 'K':
311  num *= 1024;
312  break;
313  case 'm':
314  case 'M':
315  num *= 1024;
316  num *= 1024;
317  break;
318  case 'g':
319  case 'G':
320  num *= 1024;
321  num *= 1024;
322  num *= 1024;
323  break;
324  }
325  }
326  return num;
327 }
328 
329 static
330 int
331 parse_spec(Vector<ddentry> & dst,
332  const char * src,
333  Uint32 type)
334 {
335  const char * key;
336  Uint32 filetype;
337 
338  struct ddentry group;
339  if (type == DictTabInfo::LogfileGroup)
340  {
341  key = "undo_buffer_size=";
342  group.size = 64*1024*1024;
343  group.name = "DEFAULT-LG";
344  group.type = type;
345  filetype = DictTabInfo::Undofile;
346  }
347  else
348  {
349  key = "extent_size=";
350  group.size = 1024*1024;
351  group.name = "DEFAULT-TS";
352  group.type = type;
353  filetype = DictTabInfo::Datafile;
354  }
355  size_t keylen = strlen(key);
356 
357  BaseString arg(src);
358  Vector<BaseString> list;
359  arg.split(list, ";");
360 
361  bool first = true;
362  for (Uint32 i = 0; i<list.size(); i++)
363  {
364  list[i].trim();
365  if (strncasecmp(list[i].c_str(), "name=", sizeof("name=")-1) == 0)
366  {
367  group.name= strdup(list[i].c_str() + sizeof("name=")-1);
368  }
369  else if (strncasecmp(list[i].c_str(), key, keylen) == 0)
370  {
371  group.size = parse_size(list[i].c_str() + keylen);
372  }
373  else if (strlen(list[i].c_str()) == 0 && (i + 1) == list.size())
374  {
378  }
379  else
380  {
384  struct ddentry entry;
385  const char * path = list[i].c_str();
386  char * sizeptr = const_cast<char*>(strchr(path, ':'));
387  if (sizeptr == 0)
388  {
389  return -1;
390  }
391  * sizeptr = 0;
392 
393  entry.name = strdup(path);
394  entry.size = parse_size(sizeptr + 1);
395  entry.type = filetype;
396 
397  if (first)
398  {
402  first = false;
403  dst.push_back(group);
404  }
405  dst.push_back(entry);
406  }
407  }
408  return 0;
409 }
410 
411 void
412 Ndbcntr::execREAD_CONFIG_REQ(Signal* signal)
413 {
414  jamEntry();
415 
416  const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr();
417 
418  Uint32 ref = req->senderRef;
419  Uint32 senderData = req->senderData;
420 
421  const ndb_mgm_configuration_iterator * p =
422  m_ctx.m_config.getOwnConfigIterator();
423  ndbrequire(p != 0);
424 
425  Uint32 dl = 0;
426  ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS, &dl);
427  if (dl == 0)
428  {
429  const char * lgspec = 0;
430  char buf[1024];
431  if (!ndb_mgm_get_string_parameter(p, CFG_DB_DD_LOGFILEGROUP_SPEC, &lgspec))
432  {
433  jam();
434 
435  if (parse_spec(f_dd, lgspec, DictTabInfo::LogfileGroup))
436  {
437  BaseString::snprintf(buf, sizeof(buf),
438  "Unable to parse InitialLogfileGroup: %s", lgspec);
439  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
440  }
441  }
442 
443  const char * tsspec = 0;
444  if (!ndb_mgm_get_string_parameter(p, CFG_DB_DD_TABLEPACE_SPEC, &tsspec))
445  {
446  if (f_dd.size() == 0)
447  {
448  warningEvent("InitialTablespace specified, "
449  "but InitialLogfileGroup is not!");
450  warningEvent("Ignoring InitialTablespace: %s",
451  tsspec);
452  }
453  else
454  {
455  if (parse_spec(f_dd, tsspec, DictTabInfo::Tablespace))
456  {
457  BaseString::snprintf(buf, sizeof(buf),
458  "Unable to parse InitialTablespace: %s", tsspec);
459  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
460  }
461  }
462  }
463  }
464 
465  struct ddentry empty;
466  empty.type = ~0;
467  f_dd.push_back(empty);
468 
469  if (true)
470  {
471  // TODO: add config parameter
472  // remove ATTRIBUTE_MASK2
473  g_sysTable_NDBEVENTS_0.columnCount--;
474  }
475 
476  ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
477  conf->senderRef = reference();
478  conf->senderData = senderData;
479  sendSignal(ref, GSN_READ_CONFIG_CONF, signal,
480  ReadConfigConf::SignalLength, JBB);
481 }
482 
483 void Ndbcntr::execSTTOR(Signal* signal)
484 {
485  jamEntry();
486  cstartPhase = signal->theData[1];
487 
488  cndbBlocksCount = 0;
489  cinternalStartphase = cstartPhase - 1;
490 
491  switch (cstartPhase) {
492  case 0:
493  if(m_ctx.m_config.getInitialStart()){
494  jam();
495  c_fsRemoveCount = 0;
496  clearFilesystem(signal);
497  return;
498  }
499  sendSttorry(signal);
500  break;
501  case ZSTART_PHASE_1:
502  jam();
503  startPhase1Lab(signal);
504  break;
505  case ZSTART_PHASE_2:
506  jam();
507  startPhase2Lab(signal);
508  break;
509  case ZSTART_PHASE_3:
510  jam();
511  startPhase3Lab(signal);
512  break;
513  case ZSTART_PHASE_4:
514  jam();
515  startPhase4Lab(signal);
516  break;
517  case ZSTART_PHASE_5:
518  jam();
519  startPhase5Lab(signal);
520  break;
521  case 6:
522  jam();
523  getNodeGroup(signal);
524  sendSttorry(signal);
525  break;
526  case ZSTART_PHASE_8:
527  jam();
528  startPhase8Lab(signal);
529  break;
530  case ZSTART_PHASE_9:
531  jam();
532  startPhase9Lab(signal);
533  break;
534  default:
535  jam();
536  sendSttorry(signal);
537  break;
538  }//switch
539 }//Ndbcntr::execSTTOR()
540 
541 void
542 Ndbcntr::getNodeGroup(Signal* signal){
543  jam();
544  CheckNodeGroups * sd = (CheckNodeGroups*)signal->getDataPtrSend();
545  sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::GetNodeGroup;
546  EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal,
547  CheckNodeGroups::SignalLength);
548  jamEntry();
549  c_nodeGroup = sd->output;
550 }
551 
552 /*******************************/
553 /* NDB_STTORRY */
554 /*******************************/
555 void Ndbcntr::execNDB_STTORRY(Signal* signal)
556 {
557  jamEntry();
558  switch (cstartPhase) {
559  case ZSTART_PHASE_2:
560  jam();
561  ph2GLab(signal);
562  return;
563  break;
564  case ZSTART_PHASE_3:
565  jam();
566  ph3ALab(signal);
567  return;
568  break;
569  case ZSTART_PHASE_4:
570  jam();
571  ph4BLab(signal);
572  return;
573  break;
574  case ZSTART_PHASE_5:
575  jam();
576  ph5ALab(signal);
577  return;
578  break;
579  case ZSTART_PHASE_6:
580  jam();
581  ph6ALab(signal);
582  return;
583  break;
584  case ZSTART_PHASE_7:
585  jam();
586  ph6BLab(signal);
587  return;
588  break;
589  case ZSTART_PHASE_8:
590  jam();
591  ph7ALab(signal);
592  return;
593  break;
594  case ZSTART_PHASE_9:
595  jam();
596  ph8ALab(signal);
597  return;
598  break;
599  default:
600  jam();
601  systemErrorLab(signal, __LINE__);
602  return;
603  break;
604  }//switch
605 }//Ndbcntr::execNDB_STTORRY()
606 
607 void Ndbcntr::startPhase1Lab(Signal* signal)
608 {
609  jamEntry();
610 
611  initData(signal);
612 
613  cdynamicNodeId = 0;
614 
615  NdbBlocksRecPtr ndbBlocksPtr;
616  ndbBlocksPtr.i = 0;
617  ptrAss(ndbBlocksPtr, ndbBlocksRec);
618  ndbBlocksPtr.p->blockref = DBLQH_REF;
619  ndbBlocksPtr.i = 1;
620  ptrAss(ndbBlocksPtr, ndbBlocksRec);
621  ndbBlocksPtr.p->blockref = DBDICT_REF;
622  ndbBlocksPtr.i = 2;
623  ptrAss(ndbBlocksPtr, ndbBlocksRec);
624  ndbBlocksPtr.p->blockref = DBTUP_REF;
625  ndbBlocksPtr.i = 3;
626  ptrAss(ndbBlocksPtr, ndbBlocksRec);
627  ndbBlocksPtr.p->blockref = DBACC_REF;
628  ndbBlocksPtr.i = 4;
629  ptrAss(ndbBlocksPtr, ndbBlocksRec);
630  ndbBlocksPtr.p->blockref = DBTC_REF;
631  ndbBlocksPtr.i = 5;
632  ptrAss(ndbBlocksPtr, ndbBlocksRec);
633  ndbBlocksPtr.p->blockref = DBDIH_REF;
634  sendSttorry(signal);
635  return;
636 }
637 
638 void Ndbcntr::execREAD_NODESREF(Signal* signal)
639 {
640  jamEntry();
641  systemErrorLab(signal, __LINE__);
642  return;
643 }//Ndbcntr::execREAD_NODESREF()
644 
645 
646 /*******************************/
647 /* NDB_STARTREF */
648 /*******************************/
649 void Ndbcntr::execNDB_STARTREF(Signal* signal)
650 {
651  jamEntry();
652  systemErrorLab(signal, __LINE__);
653  return;
654 }//Ndbcntr::execNDB_STARTREF()
655 
656 /*******************************/
657 /* STTOR */
658 /*******************************/
659 void Ndbcntr::startPhase2Lab(Signal* signal)
660 {
661  c_start.m_lastGci = 0;
662  c_start.m_lastGciNodeId = getOwnNodeId();
663 
664  DihRestartReq * req = CAST_PTR(DihRestartReq, signal->getDataPtrSend());
665  req->senderRef = reference();
666  sendSignal(DBDIH_REF, GSN_DIH_RESTARTREQ, signal,
667  DihRestartReq::SignalLength, JBB);
668  return;
669 }//Ndbcntr::startPhase2Lab()
670 
671 /*******************************/
672 /* DIH_RESTARTCONF */
673 /*******************************/
674 void Ndbcntr::execDIH_RESTARTCONF(Signal* signal)
675 {
676  jamEntry();
677 
678  const DihRestartConf * conf = CAST_CONSTPTR(DihRestartConf,
679  signal->getDataPtrSend());
680  c_start.m_lastGci = conf->latest_gci;
681  ctypeOfStart = NodeState::ST_SYSTEM_RESTART;
682  cdihStartType = ctypeOfStart;
683  ph2ALab(signal);
684  return;
685 }//Ndbcntr::execDIH_RESTARTCONF()
686 
687 /*******************************/
688 /* DIH_RESTARTREF */
689 /*******************************/
690 void Ndbcntr::execDIH_RESTARTREF(Signal* signal)
691 {
692  jamEntry();
693  ctypeOfStart = NodeState::ST_INITIAL_START;
694  cdihStartType = ctypeOfStart;
695  ph2ALab(signal);
696  return;
697 }//Ndbcntr::execDIH_RESTARTREF()
698 
699 void Ndbcntr::ph2ALab(Signal* signal)
700 {
701  /******************************/
702  /* request configured nodes */
703  /* from QMGR */
704  /* READ_NODESREQ */
705  /******************************/
706  signal->theData[0] = reference();
707  sendSignal(QMGR_REF, GSN_READ_NODESREQ, signal, 1, JBB);
708  return;
709 }//Ndbcntr::ph2ALab()
710 
711 inline
712 Uint64
713 setTimeout(Uint64 time, Uint32 timeoutValue){
714  if(timeoutValue == 0)
715  return ~(Uint64)0;
716  return time + timeoutValue;
717 }
718 
719 /*******************************/
720 /* READ_NODESCONF */
721 /*******************************/
722 void Ndbcntr::execREAD_NODESCONF(Signal* signal)
723 {
724  jamEntry();
725  const ReadNodesConf * readNodes = (ReadNodesConf *)&signal->theData[0];
726 
727  cmasterNodeId = readNodes->masterNodeId;
728  cdynamicNodeId = readNodes->ndynamicId;
729 
733  c_allDefinedNodes.assign(NdbNodeBitmask::Size, readNodes->allNodes);
734  c_clusterNodes.assign(NdbNodeBitmask::Size, readNodes->clusterNodes);
735 
736  Uint32 to_1 = 30000;
737  Uint32 to_2 = 0;
738  Uint32 to_3 = 0;
739 
740  const ndb_mgm_configuration_iterator * p =
741  m_ctx.m_config.getOwnConfigIterator();
742 
743  ndbrequire(p != 0);
744  ndb_mgm_get_int_parameter(p, CFG_DB_START_PARTIAL_TIMEOUT, &to_1);
745  ndb_mgm_get_int_parameter(p, CFG_DB_START_PARTITION_TIMEOUT, &to_2);
746  ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3);
747 
748  c_start.m_startTime = NdbTick_CurrentMillisecond();
749  c_start.m_startPartialTimeout = setTimeout(c_start.m_startTime, to_1);
750  c_start.m_startPartitionedTimeout = setTimeout(c_start.m_startTime, to_2);
751  c_start.m_startFailureTimeout = setTimeout(c_start.m_startTime, to_3);
752 
753  sendCntrStartReq(signal);
754 
755  signal->theData[0] = ZSTARTUP;
756  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1);
757 
758  return;
759 }
760 
761 void
762 Ndbcntr::execCM_ADD_REP(Signal* signal){
763  jamEntry();
764  c_clusterNodes.set(signal->theData[0]);
765 }
766 
767 void
768 Ndbcntr::sendCntrStartReq(Signal * signal){
769  jamEntry();
770 
771  CntrStartReq * req = (CntrStartReq*)signal->getDataPtrSend();
772  req->startType = ctypeOfStart;
773  req->lastGci = c_start.m_lastGci;
774  req->nodeId = getOwnNodeId();
775  sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_START_REQ,
776  signal, CntrStartReq::SignalLength, JBB);
777 }
778 
779 void
780 Ndbcntr::execCNTR_START_REF(Signal * signal){
781  jamEntry();
782  const CntrStartRef * ref = (CntrStartRef*)signal->getDataPtr();
783 
784  switch(ref->errorCode){
785  case CntrStartRef::NotMaster:
786  jam();
787  cmasterNodeId = ref->masterNodeId;
788  sendCntrStartReq(signal);
789  return;
790  case CntrStartRef::StopInProgress:
791  jam();
792  progError(__LINE__, NDBD_EXIT_RESTART_DURING_SHUTDOWN);
793  }
794  ndbrequire(false);
795 }
796 
797 void
798 Ndbcntr::StartRecord::reset(){
799  m_starting.clear();
800  m_waiting.clear();
801  m_withLog.clear();
802  m_withoutLog.clear();
803  m_waitTO.clear();
804  m_lastGci = m_lastGciNodeId = 0;
805  m_startPartialTimeout = ~0;
806  m_startPartitionedTimeout = ~0;
807  m_startFailureTimeout = ~0;
808 
809  m_logNodesCount = 0;
810  bzero(m_wait_sp, sizeof(m_wait_sp));
811 }
812 
813 void
814 Ndbcntr::execCNTR_START_CONF(Signal * signal){
815  jamEntry();
816  const CntrStartConf * conf = (CntrStartConf*)signal->getDataPtr();
817 
818  cnoStartNodes = conf->noStartNodes;
819  ctypeOfStart = (NodeState::StartType)conf->startType;
820  cdihStartType = ctypeOfStart;
821  c_start.m_lastGci = conf->startGci;
822  cmasterNodeId = conf->masterNodeId;
823  NdbNodeBitmask tmp;
824  tmp.assign(NdbNodeBitmask::Size, conf->startedNodes);
825  c_startedNodes.bitOR(tmp);
826  c_start.m_starting.assign(NdbNodeBitmask::Size, conf->startingNodes);
827  m_cntr_start_conf = true;
828  ph2GLab(signal);
829 }
830 
842 #define PARALLELL_NR 0
843 
844 #if PARALLELL_NR
845 const bool parallellNR = true;
846 #else
847 const bool parallellNR = false;
848 #endif
849 
850 void
851 Ndbcntr::execCNTR_START_REP(Signal* signal){
852  jamEntry();
853  Uint32 nodeId = signal->theData[0];
854 
855  c_startedNodes.set(nodeId);
856  c_start.m_starting.clear(nodeId);
857 
861  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
862  sendSignal(ALL_BLOCKS[i].Ref, GSN_NODE_START_REP, signal, 1, JBB);
863  }
864 
865  signal->theData[0] = nodeId;
866  execSTART_PERMREP(signal);
867 }
868 
869 void
870 Ndbcntr::execSTART_PERMREP(Signal* signal)
871 {
872  Uint32 nodeId = signal->theData[0];
873  c_startedNodes.set(nodeId);
874  c_start.m_starting.clear(nodeId);
875 
876  if(!c_start.m_starting.isclear()){
877  jam();
878  return;
879  }
880 
881  if(cmasterNodeId != getOwnNodeId()){
882  jam();
883  c_start.reset();
884  return;
885  }
886 
887  if(c_start.m_waiting.isclear()){
888  jam();
889  c_start.reset();
890  return;
891  }
892 
893  startWaitingNodes(signal);
894 }
895 
896 void
897 Ndbcntr::execCNTR_START_REQ(Signal * signal){
898  jamEntry();
899  const CntrStartReq * req = (CntrStartReq*)signal->getDataPtr();
900 
901  const Uint32 nodeId = req->nodeId;
902  const Uint32 lastGci = req->lastGci;
903  const NodeState::StartType st = (NodeState::StartType)req->startType;
904 
905  if(cmasterNodeId == 0){
906  jam();
907  // Has not completed READNODES yet
908  sendSignalWithDelay(reference(), GSN_CNTR_START_REQ, signal, 100,
909  signal->getLength());
910  return;
911  }
912 
913  if(cmasterNodeId != getOwnNodeId()){
914  jam();
915  sendCntrStartRef(signal, nodeId, CntrStartRef::NotMaster);
916  return;
917  }
918 
919  const NodeState & nodeState = getNodeState();
920  switch(nodeState.startLevel){
922  case NodeState::SL_CMVMI:
923  jam();
924  ndbrequire(false);
927  jam();
928  break;
929 
934  jam();
935  sendCntrStartRef(signal, nodeId, CntrStartRef::StopInProgress);
936  return;
937  }
938 
942  const bool starting = (nodeState.startLevel != NodeState::SL_STARTED);
943 
944  c_start.m_waiting.set(nodeId);
945  switch(st){
946  case NodeState::ST_INITIAL_START:
947  jam();
948  c_start.m_withoutLog.set(nodeId);
949  break;
950  case NodeState::ST_SYSTEM_RESTART:
951  jam();
952  c_start.m_withLog.set(nodeId);
953  if(starting && lastGci > c_start.m_lastGci){
954  jam();
955  CntrStartRef * ref = (CntrStartRef*)signal->getDataPtrSend();
956  ref->errorCode = CntrStartRef::NotMaster;
957  ref->masterNodeId = nodeId;
958  NodeReceiverGroup rg (NDBCNTR, c_start.m_waiting);
959  sendSignal(rg, GSN_CNTR_START_REF, signal,
960  CntrStartRef::SignalLength, JBB);
961  return;
962  }
963  if(starting){
964  jam();
965  Uint32 i = c_start.m_logNodesCount++;
966  c_start.m_logNodes[i].m_nodeId = nodeId;
967  c_start.m_logNodes[i].m_lastGci = req->lastGci;
968  }
969  break;
970  case NodeState::ST_NODE_RESTART:
971  case NodeState::ST_INITIAL_NODE_RESTART:
972  case NodeState::ST_ILLEGAL_TYPE:
973  ndbrequire(false);
974  }
975 
976  const bool startInProgress = !c_start.m_starting.isclear();
977 
978  if((starting && startInProgress) || (startInProgress && !parallellNR)){
979  jam();
980  // We're already starting together with a bunch of nodes
981  // Let this node wait...
982  return;
983  }
984 
985  if(starting){
986  jam();
987  trySystemRestart(signal);
988  } else {
989  jam();
990  startWaitingNodes(signal);
991  }
992  return;
993 }
994 
995 void
996 Ndbcntr::startWaitingNodes(Signal * signal){
997 
998 #if ! PARALLELL_NR
999  if (!c_start.m_waitTO.isclear())
1000  {
1001  jam();
1002 
1003  {
1004  char buf[100];
1005  ndbout_c("starting (TO) %s", c_start.m_waitTO.getText(buf));
1006  }
1007 
1012  NodeReceiverGroup rg(NDBCNTR, c_start.m_waitTO);
1013  c_start.m_starting.bitOR(c_start.m_waitTO);
1014  c_start.m_waiting.bitANDC(c_start.m_waitTO);
1015  c_start.m_waitTO.clear();
1016 
1021  CntrWaitRep* rep = (CntrWaitRep*)signal->getDataPtrSend();
1022  rep->nodeId = getOwnNodeId();
1023  rep->waitPoint = CntrWaitRep::ZWAITPOINT_4_2_TO;
1024  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
1025  return;
1026  }
1027 
1028  const Uint32 nodeId = c_start.m_waiting.find(0);
1029  const Uint32 Tref = calcNdbCntrBlockRef(nodeId);
1030  ndbrequire(nodeId != c_start.m_waiting.NotFound);
1031 
1032  NodeState::StartType nrType = NodeState::ST_NODE_RESTART;
1033  if(c_start.m_withoutLog.get(nodeId))
1034  {
1035  jam();
1036  nrType = NodeState::ST_INITIAL_NODE_RESTART;
1037  }
1038 
1042  CntrStartConf * conf = (CntrStartConf*)signal->getDataPtrSend();
1043  conf->noStartNodes = 1;
1044  conf->startType = nrType;
1045  conf->startGci = ~0; // Not used
1046  conf->masterNodeId = getOwnNodeId();
1047  BitmaskImpl::clear(NdbNodeBitmask::Size, conf->startingNodes);
1048  BitmaskImpl::set(NdbNodeBitmask::Size, conf->startingNodes, nodeId);
1049  c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
1050  sendSignal(Tref, GSN_CNTR_START_CONF, signal,
1051  CntrStartConf::SignalLength, JBB);
1052 
1053  c_start.m_waiting.clear(nodeId);
1054  c_start.m_withLog.clear(nodeId);
1055  c_start.m_withoutLog.clear(nodeId);
1056  c_start.m_starting.set(nodeId);
1057 #else
1058  // Parallell nr
1059 
1060  c_start.m_starting = c_start.m_waiting;
1061  c_start.m_waiting.clear();
1062 
1063  CntrStartConf * conf = (CntrStartConf*)signal->getDataPtrSend();
1064  conf->noStartNodes = 1;
1065  conf->startGci = ~0; // Not used
1066  conf->masterNodeId = getOwnNodeId();
1067  c_start.m_starting.copyto(NdbNodeBitmask::Size, conf->startingNodes);
1068  c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
1069 
1070  char buf[100];
1071  if(!c_start.m_withLog.isclear()){
1072  jam();
1073  ndbout_c("Starting nodes w/ log: %s", c_start.m_withLog.getText(buf));
1074 
1075  NodeReceiverGroup rg(NDBCNTR, c_start.m_withLog);
1076  conf->startType = NodeState::ST_NODE_RESTART;
1077 
1078  sendSignal(rg, GSN_CNTR_START_CONF, signal,
1079  CntrStartConf::SignalLength, JBB);
1080  }
1081 
1082  if(!c_start.m_withoutLog.isclear()){
1083  jam();
1084  ndbout_c("Starting nodes wo/ log: %s", c_start.m_withoutLog.getText(buf));
1085  NodeReceiverGroup rg(NDBCNTR, c_start.m_withoutLog);
1086  conf->startType = NodeState::ST_INITIAL_NODE_RESTART;
1087 
1088  sendSignal(rg, GSN_CNTR_START_CONF, signal,
1089  CntrStartConf::SignalLength, JBB);
1090  }
1091 
1092  c_start.m_waiting.clear();
1093  c_start.m_withLog.clear();
1094  c_start.m_withoutLog.clear();
1095 #endif
1096 }
1097 
1098 void
1099 Ndbcntr::sendCntrStartRef(Signal * signal,
1100  Uint32 nodeId, CntrStartRef::ErrorCode code){
1101  CntrStartRef * ref = (CntrStartRef*)signal->getDataPtrSend();
1102  ref->errorCode = code;
1103  ref->masterNodeId = cmasterNodeId;
1104  sendSignal(calcNdbCntrBlockRef(nodeId), GSN_CNTR_START_REF, signal,
1105  CntrStartRef::SignalLength, JBB);
1106 }
1107 
1108 CheckNodeGroups::Output
1109 Ndbcntr::checkNodeGroups(Signal* signal, const NdbNodeBitmask & mask){
1110  CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
1111  sd->blockRef = reference();
1112  sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::ArbitCheck;
1113  sd->mask = mask;
1114  EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal,
1115  CheckNodeGroups::SignalLength);
1116  jamEntry();
1117  return (CheckNodeGroups::Output)sd->output;
1118 }
1119 
1120 bool
1121 Ndbcntr::trySystemRestart(Signal* signal){
1125  const bool allNodes = c_start.m_waiting.equal(c_allDefinedNodes);
1126  const bool allClusterNodes = c_start.m_waiting.equal(c_clusterNodes);
1127 
1128  if(!allClusterNodes){
1129  jam();
1130  return false;
1131  }
1132 
1133  NodeState::StartType srType = NodeState::ST_SYSTEM_RESTART;
1134  if(c_start.m_waiting.equal(c_start.m_withoutLog))
1135  {
1136  jam();
1137  srType = NodeState::ST_INITIAL_START;
1138  c_start.m_starting = c_start.m_withoutLog; // Used for starting...
1139  c_start.m_withoutLog.clear();
1140  } else {
1141 
1142  CheckNodeGroups::Output wLog = checkNodeGroups(signal, c_start.m_withLog);
1143 
1144  switch (wLog) {
1145  case CheckNodeGroups::Win:
1146  jam();
1147  break;
1148  case CheckNodeGroups::Lose:
1149  jam();
1150  // If we lose with all nodes, then we're in trouble
1151  ndbrequire(!allNodes);
1152  return false;
1153  case CheckNodeGroups::Partitioning:
1154  jam();
1155  bool allowPartition = (c_start.m_startPartitionedTimeout != (Uint64)~0);
1156 
1157  if(allNodes){
1158  if(allowPartition){
1159  jam();
1160  break;
1161  }
1162  ndbrequire(false); // All nodes -> partitioning, which is not allowed
1163  }
1164 
1165  break;
1166  }
1167 
1168  // For now only with the "logged"-ones.
1169  // Let the others do node restart afterwards...
1170  c_start.m_starting = c_start.m_withLog;
1171  c_start.m_withLog.clear();
1172  }
1173 
1177  CntrStartConf * conf = (CntrStartConf*)signal->getDataPtr();
1178  conf->noStartNodes = c_start.m_starting.count();
1179  conf->startType = srType;
1180  conf->startGci = c_start.m_lastGci;
1181  conf->masterNodeId = c_start.m_lastGciNodeId;
1182  c_start.m_starting.copyto(NdbNodeBitmask::Size, conf->startingNodes);
1183  c_startedNodes.copyto(NdbNodeBitmask::Size, conf->startedNodes);
1184 
1185  ndbrequire(c_start.m_lastGciNodeId == getOwnNodeId());
1186 
1187  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
1188  sendSignal(rg, GSN_CNTR_START_CONF, signal, CntrStartConf::SignalLength,JBB);
1189 
1190  c_start.m_waiting.bitANDC(c_start.m_starting);
1191 
1192  return true;
1193 }
1194 
1195 void Ndbcntr::ph2GLab(Signal* signal)
1196 {
1197  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
1198  jam();
1199  sendNdbSttor(signal);
1200  return;
1201  }//if
1202  sendSttorry(signal);
1203  return;
1204 }//Ndbcntr::ph2GLab()
1205 
1206 /*
1207 4.4 START PHASE 3 */
1208 /*###########################################################################*/
1209 // SEND SIGNAL NDBSTTOR TO ALL BLOCKS, ACC, DICT, DIH, LQH, TC AND TUP
1210 // WHEN ALL BLOCKS HAVE RETURNED THEIR NDB_STTORRY ALL BLOCK HAVE FINISHED
1211 // THEIR LOCAL CONNECTIONs SUCESSFULLY
1212 // AND THEN WE CAN SEND APPL_STARTREG TO INFORM QMGR THAT WE ARE READY TO
1213 // SET UP DISTRIBUTED CONNECTIONS.
1214 /*--------------------------------------------------------------*/
1215 // THIS IS NDB START PHASE 3.
1216 /*--------------------------------------------------------------*/
1217 /*******************************/
1218 /* STTOR */
1219 /*******************************/
1220 void Ndbcntr::startPhase3Lab(Signal* signal)
1221 {
1222  ph3ALab(signal);
1223  return;
1224 }//Ndbcntr::startPhase3Lab()
1225 
1226 /*******************************/
1227 /* NDB_STTORRY */
1228 /*******************************/
1229 void Ndbcntr::ph3ALab(Signal* signal)
1230 {
1231  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
1232  jam();
1233  sendNdbSttor(signal);
1234  return;
1235  }//if
1236 
1237  sendSttorry(signal);
1238  return;
1239 }//Ndbcntr::ph3ALab()
1240 
1241 /*
1242 4.5 START PHASE 4 */
1243 /*###########################################################################*/
1244 // WAIT FOR ALL NODES IN CLUSTER TO CHANGE STATE INTO ZSTART ,
1245 // APPL_CHANGEREP IS ALWAYS SENT WHEN SOMEONE HAVE
1246 // CHANGED THEIR STATE. APPL_STARTCONF INDICATES THAT ALL NODES ARE IN START
1247 // STATE SEND NDB_STARTREQ TO DIH AND THEN WAIT FOR NDB_STARTCONF
1248 /*---------------------------------------------------------------------------*/
1249 /*******************************/
1250 /* STTOR */
1251 /*******************************/
1252 void Ndbcntr::startPhase4Lab(Signal* signal)
1253 {
1254  ph4ALab(signal);
1255 }//Ndbcntr::startPhase4Lab()
1256 
1257 
1258 void Ndbcntr::ph4ALab(Signal* signal)
1259 {
1260  ph4BLab(signal);
1261  return;
1262 }//Ndbcntr::ph4ALab()
1263 
1264 /*******************************/
1265 /* NDB_STTORRY */
1266 /*******************************/
1267 void Ndbcntr::ph4BLab(Signal* signal)
1268 {
1269 /*--------------------------------------*/
1270 /* CASE: CSTART_PHASE = ZSTART_PHASE_4 */
1271 /*--------------------------------------*/
1272  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
1273  jam();
1274  sendNdbSttor(signal);
1275  return;
1276  }//if
1277  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
1278  (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
1279  jam();
1280  sendSttorry(signal);
1281  return;
1282  }//if
1283  waitpoint41Lab(signal);
1284  return;
1285 }//Ndbcntr::ph4BLab()
1286 
1287 void Ndbcntr::waitpoint41Lab(Signal* signal)
1288 {
1289  if (getOwnNodeId() == cmasterNodeId) {
1290  jam();
1291 /*--------------------------------------*/
1292 /* MASTER WAITS UNTIL ALL SLAVES HAS */
1293 /* SENT THE REPORTS */
1294 /*--------------------------------------*/
1295  cnoWaitrep++;
1296  if (cnoWaitrep == cnoStartNodes) {
1297  jam();
1298  cnoWaitrep = 0;
1299 /*---------------------------------------------------------------------------*/
1300 // NDB_STARTREQ STARTS UP ALL SET UP OF DISTRIBUTION INFORMATION IN DIH AND
1301 // DICT. AFTER SETTING UP THIS
1302 // DATA IT USES THAT DATA TO SET UP WHICH FRAGMENTS THAT ARE TO START AND
1303 // WHERE THEY ARE TO START. THEN
1304 // IT SETS UP THE FRAGMENTS AND RECOVERS THEM BY:
1305 // 1) READING A LOCAL CHECKPOINT FROM DISK.
1306 // 2) EXECUTING THE UNDO LOG ON INDEX AND DATA.
1307 // 3) EXECUTING THE FRAGMENT REDO LOG FROM ONE OR SEVERAL NODES TO
1308 // RESTORE THE RESTART CONFIGURATION OF DATA IN NDB CLUSTER.
1309 /*---------------------------------------------------------------------------*/
1310  signal->theData[0] = reference();
1311  signal->theData[1] = ctypeOfStart;
1312  sendSignal(DBDIH_REF, GSN_NDB_STARTREQ, signal, 2, JBB);
1313  }//if
1314  } else {
1315  jam();
1316 /*--------------------------------------*/
1317 /* SLAVE NODES WILL PASS HERE ONCE AND */
1318 /* SEND A WAITPOINT REPORT TO MASTER. */
1319 /* SLAVES WONT DO ANYTHING UNTIL THEY */
1320 /* RECEIVE A WAIT REPORT FROM THE MASTER*/
1321 /*--------------------------------------*/
1322  signal->theData[0] = getOwnNodeId();
1323  signal->theData[1] = CntrWaitRep::ZWAITPOINT_4_1;
1324  sendSignal(calcNdbCntrBlockRef(cmasterNodeId),
1325  GSN_CNTR_WAITREP, signal, 2, JBB);
1326  }//if
1327  return;
1328 }//Ndbcntr::waitpoint41Lab()
1329 
1330 void
1331 Ndbcntr::waitpoint42To(Signal* signal)
1332 {
1333  jam();
1334 
1341  cdihStartType = NodeState::ST_SYSTEM_RESTART;
1342  ctypeOfStart = NodeState::ST_NODE_RESTART;
1343 
1347  {
1348  NodeStateRep* rep = (NodeStateRep*)signal->getDataPtrSend();
1349  rep->nodeState = getNodeState();
1350  rep->nodeState.masterNodeId = cmasterNodeId;
1351  rep->nodeState.setNodeGroup(c_nodeGroup);
1352  rep->nodeState.starting.restartType = NodeState::ST_NODE_RESTART;
1353 
1354  sendSignal(DBTUX_REF, GSN_NODE_STATE_REP, signal,
1355  NodeStateRep::SignalLength, JBB);
1356  }
1357 
1361  StartCopyReq* req = (StartCopyReq*)signal->getDataPtrSend();
1362  req->senderRef = reference();
1363  req->senderData = RNIL;
1364  req->flags = StartCopyReq::WAIT_LCP;
1365  req->startingNodeId = getOwnNodeId();
1366  sendSignal(DBDIH_REF, GSN_START_COPYREQ, signal,
1367  StartCopyReq::SignalLength, JBB);
1368 }
1369 
1370 void
1371 Ndbcntr::execSTART_COPYREF(Signal* signal)
1372 {
1373 
1374 }
1375 
1376 void
1377 Ndbcntr::execSTART_COPYCONF(Signal* signal)
1378 {
1379  sendSttorry(signal);
1380 }
1381 
1382 
1383 /*******************************/
1384 /* NDB_STARTCONF */
1385 /*******************************/
1386 void Ndbcntr::execNDB_STARTCONF(Signal* signal)
1387 {
1388  jamEntry();
1389 
1390  NdbNodeBitmask tmp;
1391  if (signal->getLength() >= 1 + NdbNodeBitmask::Size)
1392  {
1393  jam();
1394  tmp.assign(NdbNodeBitmask::Size, signal->theData+1);
1395  if (!c_start.m_starting.equal(tmp))
1396  {
1400  char buf0[100], buf1[100];
1401  ndbout_c("execNDB_STARTCONF: changing from %s to %s",
1402  c_start.m_starting.getText(buf0),
1403  tmp.getText(buf1));
1404 
1405  NdbNodeBitmask waiting = c_start.m_starting;
1406  waiting.bitANDC(tmp);
1407 
1408  c_start.m_waiting.bitOR(waiting);
1409  c_start.m_waitTO.bitOR(waiting);
1410 
1411  c_start.m_starting.assign(tmp);
1412  cnoStartNodes = c_start.m_starting.count();
1413  }
1414  }
1415 
1416  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
1417  signal->theData[0] = getOwnNodeId();
1418  signal->theData[1] = CntrWaitRep::ZWAITPOINT_4_2;
1419  c_start.m_starting.copyto(NdbNodeBitmask::Size, signal->theData+2);
1420  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2 + NdbNodeBitmask::Size,
1421  JBB);
1422  return;
1423 }//Ndbcntr::execNDB_STARTCONF()
1424 
1425 /*
1426 4.6 START PHASE 5 */
1427 /*###########################################################################*/
1428 // SEND APPL_RUN TO THE QMGR IN THIS BLOCK
1429 // SEND NDB_STTOR ALL BLOCKS ACC, DICT, DIH, LQH, TC AND TUP THEN WAIT FOR
1430 // THEIR NDB_STTORRY
1431 /*---------------------------------------------------------------------------*/
1432 /*******************************/
1433 /* STTOR */
1434 /*******************************/
1435 void Ndbcntr::startPhase5Lab(Signal* signal)
1436 {
1437  ph5ALab(signal);
1438  return;
1439 }//Ndbcntr::startPhase5Lab()
1440 
1441 /*******************************/
1442 /* NDB_STTORRY */
1443 /*******************************/
1444 /*---------------------------------------------------------------------------*/
1445 // THIS IS NDB START PHASE 5.
1446 /*---------------------------------------------------------------------------*/
1447 // IN THIS START PHASE TUP INITIALISES DISK FILES FOR DISK STORAGE IF INITIAL
1448 // START. DIH WILL START UP
1449 // THE GLOBAL CHECKPOINT PROTOCOL AND WILL CONCLUDE ANY UNFINISHED TAKE OVERS
1450 // THAT STARTED BEFORE THE SYSTEM CRASH.
1451 /*---------------------------------------------------------------------------*/
1452 void Ndbcntr::ph5ALab(Signal* signal)
1453 {
1454  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
1455  jam();
1456  sendNdbSttor(signal);
1457  return;
1458  }//if
1459 
1460  cstartPhase = cstartPhase + 1;
1461  cinternalStartphase = cstartPhase - 1;
1462  if (getOwnNodeId() == cmasterNodeId) {
1463  switch(ctypeOfStart){
1464  case NodeState::ST_INITIAL_START:
1465  jam();
1466  /*--------------------------------------*/
1467  /* MASTER CNTR IS RESPONSIBLE FOR */
1468  /* CREATING SYSTEM TABLES */
1469  /*--------------------------------------*/
1470  beginSchemaTransLab(signal);
1471  return;
1472  case NodeState::ST_SYSTEM_RESTART:
1473  jam();
1474  waitpoint52Lab(signal);
1475  return;
1476  case NodeState::ST_NODE_RESTART:
1477  case NodeState::ST_INITIAL_NODE_RESTART:
1478  jam();
1479  break;
1480  case NodeState::ST_ILLEGAL_TYPE:
1481  jam();
1482  break;
1483  }
1484  ndbrequire(false);
1485  }
1486 
1490  NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
1491  switch(ctypeOfStart){
1492  case NodeState::ST_NODE_RESTART:
1493  case NodeState::ST_INITIAL_NODE_RESTART:
1494  jam();
1495  /*----------------------------------------------------------------------*/
1496  // SEND NDB START PHASE 5 IN NODE RESTARTS TO COPY DATA TO THE NEWLY
1497  // STARTED NODE.
1498  /*----------------------------------------------------------------------*/
1499  req->senderRef = reference();
1500  req->nodeId = getOwnNodeId();
1501  req->internalStartPhase = cinternalStartphase;
1502  req->typeOfStart = cdihStartType;
1503  req->masterNodeId = cmasterNodeId;
1504 
1505  //#define TRACE_STTOR
1506 #ifdef TRACE_STTOR
1507  ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);
1508 #endif
1509  sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal,
1510  NdbSttor::SignalLength, JBB);
1511  return;
1512  case NodeState::ST_INITIAL_START:
1513  case NodeState::ST_SYSTEM_RESTART:
1514  jam();
1515  /*--------------------------------------*/
1516  /* DURING SYSTEMRESTART AND INITALSTART:*/
1517  /* SLAVE NODES WILL PASS HERE ONCE AND */
1518  /* SEND A WAITPOINT REPORT TO MASTER. */
1519  /* SLAVES WONT DO ANYTHING UNTIL THEY */
1520  /* RECEIVE A WAIT REPORT FROM THE MASTER*/
1521  /* WHEN THE MASTER HAS FINISHED HIS WORK*/
1522  /*--------------------------------------*/
1523  signal->theData[0] = getOwnNodeId();
1524  signal->theData[1] = CntrWaitRep::ZWAITPOINT_5_2;
1525  sendSignal(calcNdbCntrBlockRef(cmasterNodeId),
1526  GSN_CNTR_WAITREP, signal, 2, JBB);
1527  return;
1528  default:
1529  ndbrequire(false);
1530  }
1531 }//Ndbcntr::ph5ALab()
1532 
1533 void Ndbcntr::waitpoint52Lab(Signal* signal)
1534 {
1535  cnoWaitrep = cnoWaitrep + 1;
1536 /*---------------------------------------------------------------------------*/
1537 // THIS WAITING POINT IS ONLY USED BY A MASTER NODE. WE WILL EXECUTE NDB START
1538 // PHASE 5 FOR DIH IN THE
1539 // MASTER. THIS WILL START UP LOCAL CHECKPOINTS AND WILL ALSO CONCLUDE ANY
1540 // UNFINISHED LOCAL CHECKPOINTS
1541 // BEFORE THE SYSTEM CRASH. THIS WILL ENSURE THAT WE ALWAYS RESTART FROM A
1542 // WELL KNOWN STATE.
1543 /*---------------------------------------------------------------------------*/
1544 /*--------------------------------------*/
1545 /* MASTER WAITS UNTIL HE RECEIVED WAIT */
1546 /* REPORTS FROM ALL SLAVE CNTR */
1547 /*--------------------------------------*/
1548  if (cnoWaitrep == cnoStartNodes) {
1549  jam();
1550  cnoWaitrep = 0;
1551 
1552  NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
1553  req->senderRef = reference();
1554  req->nodeId = getOwnNodeId();
1555  req->internalStartPhase = cinternalStartphase;
1556  req->typeOfStart = cdihStartType;
1557  req->masterNodeId = cmasterNodeId;
1558 #ifdef TRACE_STTOR
1559  ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);
1560 #endif
1561  sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal,
1562  NdbSttor::SignalLength, JBB);
1563  }//if
1564  return;
1565 }//Ndbcntr::waitpoint52Lab()
1566 
1567 /*******************************/
1568 /* NDB_STTORRY */
1569 /*******************************/
1570 void Ndbcntr::ph6ALab(Signal* signal)
1571 {
1572  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
1573  (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
1574  jam();
1575  waitpoint51Lab(signal);
1576  return;
1577  }//if
1578 
1579  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
1580  rg.m_nodes.clear(getOwnNodeId());
1581  signal->theData[0] = getOwnNodeId();
1582  signal->theData[1] = CntrWaitRep::ZWAITPOINT_5_1;
1583  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
1584 
1585  waitpoint51Lab(signal);
1586  return;
1587 }//Ndbcntr::ph6ALab()
1588 
1589 void Ndbcntr::waitpoint51Lab(Signal* signal)
1590 {
1591  cstartPhase = cstartPhase + 1;
1592 /*---------------------------------------------------------------------------*/
1593 // A FINAL STEP IS NOW TO SEND NDB_STTOR TO TC. THIS MAKES IT POSSIBLE TO
1594 // CONNECT TO TC FOR APPLICATIONS.
1595 // THIS IS NDB START PHASE 6 WHICH IS FOR ALL BLOCKS IN ALL NODES.
1596 /*---------------------------------------------------------------------------*/
1597  cinternalStartphase = cstartPhase - 1;
1598  cndbBlocksCount = 0;
1599  ph6BLab(signal);
1600  return;
1601 }//Ndbcntr::waitpoint51Lab()
1602 
1603 void Ndbcntr::ph6BLab(Signal* signal)
1604 {
1605  // c_missra.currentStartPhase - cstartPhase - cinternalStartphase =
1606  // 5 - 7 - 6
1607  if (cndbBlocksCount < ZNO_NDB_BLOCKS) {
1608  jam();
1609  sendNdbSttor(signal);
1610  return;
1611  }//if
1612  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
1613  (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
1614  jam();
1615  sendSttorry(signal);
1616  return;
1617  }
1618  waitpoint61Lab(signal);
1619 }
1620 
1621 void Ndbcntr::waitpoint61Lab(Signal* signal)
1622 {
1623  if (getOwnNodeId() == cmasterNodeId) {
1624  jam();
1625  cnoWaitrep6++;
1626  if (cnoWaitrep6 == cnoStartNodes) {
1627  jam();
1628  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
1629  rg.m_nodes.clear(getOwnNodeId());
1630  signal->theData[0] = getOwnNodeId();
1631  signal->theData[1] = CntrWaitRep::ZWAITPOINT_6_2;
1632  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
1633  sendSttorry(signal);
1634  }
1635  } else {
1636  jam();
1637  signal->theData[0] = getOwnNodeId();
1638  signal->theData[1] = CntrWaitRep::ZWAITPOINT_6_1;
1639  sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB);
1640  }
1641 }
1642 
1643 // Start phase 8 (internal 7)
1644 void Ndbcntr::startPhase8Lab(Signal* signal)
1645 {
1646  cinternalStartphase = cstartPhase - 1;
1647  cndbBlocksCount = 0;
1648  ph7ALab(signal);
1649 }
1650 
1651 void Ndbcntr::ph7ALab(Signal* signal)
1652 {
1653  while (cndbBlocksCount < ZNO_NDB_BLOCKS) {
1654  jam();
1655  sendNdbSttor(signal);
1656  return;
1657  }
1658  if ((ctypeOfStart == NodeState::ST_NODE_RESTART) ||
1659  (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) {
1660  jam();
1661  sendSttorry(signal);
1662  return;
1663  }
1664  waitpoint71Lab(signal);
1665 }
1666 
1667 void Ndbcntr::waitpoint71Lab(Signal* signal)
1668 {
1669  if (getOwnNodeId() == cmasterNodeId) {
1670  jam();
1671  cnoWaitrep7++;
1672  if (cnoWaitrep7 == cnoStartNodes) {
1673  jam();
1674  NodeReceiverGroup rg(NDBCNTR, c_start.m_starting);
1675  rg.m_nodes.clear(getOwnNodeId());
1676  signal->theData[0] = getOwnNodeId();
1677  signal->theData[1] = CntrWaitRep::ZWAITPOINT_7_2;
1678  sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB);
1679  sendSttorry(signal);
1680  }
1681  } else {
1682  jam();
1683  signal->theData[0] = getOwnNodeId();
1684  signal->theData[1] = CntrWaitRep::ZWAITPOINT_7_1;
1685  sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB);
1686  }
1687 }
1688 
1689 // Start phase 9 (internal 8)
1690 void Ndbcntr::startPhase9Lab(Signal* signal)
1691 {
1692  cinternalStartphase = cstartPhase - 1;
1693  cndbBlocksCount = 0;
1694  ph8ALab(signal);
1695 }
1696 
1697 void Ndbcntr::ph8ALab(Signal* signal)
1698 {
1699 /*---------------------------------------------------------------------------*/
1700 // NODES WHICH PERFORM A NODE RESTART NEEDS TO GET THE DYNAMIC ID'S
1701 // OF THE OTHER NODES HERE.
1702 /*---------------------------------------------------------------------------*/
1703  sendSttorry(signal);
1704  resetStartVariables(signal);
1705  return;
1706 }//Ndbcntr::ph8BLab()
1707 
1708 bool
1709 Ndbcntr::wait_sp(Signal* signal, Uint32 sp)
1710 {
1711  if (sp <= 2)
1712  return false;
1713 
1714  switch(ctypeOfStart){
1715  case NodeState::ST_SYSTEM_RESTART:
1716  case NodeState::ST_INITIAL_START:
1720  break;
1721  default:
1722  return false;
1723  }
1724 
1725  if (!ndb_wait_sp(getNodeInfo(cmasterNodeId).m_version))
1726  return false;
1727 
1728  CntrWaitRep* rep = (CntrWaitRep*)signal->getDataPtrSend();
1729  rep->nodeId = getOwnNodeId();
1730  rep->waitPoint = RNIL;
1731  rep->request = CntrWaitRep::WaitFor;
1732  rep->sp = sp;
1733 
1734  sendSignal(calcNdbCntrBlockRef(cmasterNodeId),
1735  GSN_CNTR_WAITREP, signal, CntrWaitRep::SignalLength, JBB);
1736 
1737  return true; // wait
1738 }
1739 
1740 void
1741 Ndbcntr::wait_sp_rep(Signal* signal)
1742 {
1743  CntrWaitRep rep = *(CntrWaitRep*)signal->getDataPtrSend();
1744  switch(rep.request){
1745  case CntrWaitRep::WaitFor:
1746  jam();
1747  ndbrequire(cmasterNodeId == getOwnNodeId());
1748  break;
1749  case CntrWaitRep::Grant:
1750  jam();
1754  c_missra.sendNextSTTOR(signal);
1755  return;
1756  }
1757 
1758  c_start.m_wait_sp[rep.nodeId] = rep.sp;
1759 
1763  Uint32 node = c_start.m_starting.find(0);
1764  ndbrequire(node < NDB_ARRAY_SIZE(c_start.m_wait_sp));
1765  Uint32 min = c_start.m_wait_sp[node];
1766  for (; node != NdbNodeBitmask::NotFound;
1767  node = c_start.m_starting.find(node + 1))
1768  {
1769  if (!ndb_wait_sp(getNodeInfo(node).m_version))
1770  continue;
1771 
1772  if (c_start.m_wait_sp[node] < min)
1773  {
1774  min = c_start.m_wait_sp[node];
1775  }
1776  }
1777 
1778  if (min == 0)
1779  {
1783  return;
1784  }
1785 
1786  NdbNodeBitmask grantnodes;
1787  node = c_start.m_starting.find(0);
1788  for (; node != NdbNodeBitmask::NotFound;
1789  node = c_start.m_starting.find(node + 1))
1790  {
1791  if (!ndb_wait_sp(getNodeInfo(node).m_version))
1792  continue;
1793 
1794  if (c_start.m_wait_sp[node] == min)
1795  {
1796  grantnodes.set(node);
1797  c_start.m_wait_sp[node] = 0;
1798  }
1799  }
1800 
1801  NodeReceiverGroup rg(NDBCNTR, grantnodes);
1802  CntrWaitRep * conf = (CntrWaitRep*)signal->getDataPtrSend();
1803  conf->nodeId = getOwnNodeId();
1804  conf->waitPoint = RNIL;
1805  conf->request = CntrWaitRep::Grant;
1806  conf->sp = min;
1807  sendSignal(rg, GSN_CNTR_WAITREP, signal, CntrWaitRep::SignalLength, JBB);
1808 }
1809 
1810 /*******************************/
1811 /* CNTR_WAITREP */
1812 /*******************************/
1813 void Ndbcntr::execCNTR_WAITREP(Signal* signal)
1814 {
1815  jamEntry();
1816  CntrWaitRep* rep = (CntrWaitRep*)signal->getDataPtr();
1817 
1818  Uint32 twaitPoint = rep->waitPoint;
1819  switch (twaitPoint) {
1820  case CntrWaitRep::ZWAITPOINT_4_1:
1821  jam();
1822  waitpoint41Lab(signal);
1823  break;
1824  case CntrWaitRep::ZWAITPOINT_4_2:
1825  jam();
1826  c_start.m_starting.assign(NdbNodeBitmask::Size, signal->theData + 2);
1827  sendSttorry(signal);
1828  break;
1829  case CntrWaitRep::ZWAITPOINT_5_1:
1830  jam();
1831  waitpoint51Lab(signal);
1832  break;
1833  case CntrWaitRep::ZWAITPOINT_5_2:
1834  jam();
1835  waitpoint52Lab(signal);
1836  break;
1837  case CntrWaitRep::ZWAITPOINT_6_1:
1838  jam();
1839  waitpoint61Lab(signal);
1840  break;
1841  case CntrWaitRep::ZWAITPOINT_6_2:
1842  jam();
1843  sendSttorry(signal);
1844  break;
1845  case CntrWaitRep::ZWAITPOINT_7_1:
1846  jam();
1847  waitpoint71Lab(signal);
1848  break;
1849  case CntrWaitRep::ZWAITPOINT_7_2:
1850  jam();
1851  sendSttorry(signal);
1852  break;
1853  case CntrWaitRep::ZWAITPOINT_4_2_TO:
1854  jam();
1855  waitpoint42To(signal);
1856  break;
1857  case RNIL:
1858  ndbrequire(signal->getLength() >= CntrWaitRep::SignalLength);
1859  wait_sp_rep(signal);
1860  return;
1861  default:
1862  jam();
1863  systemErrorLab(signal, __LINE__);
1864  break;
1865  }//switch
1866 }//Ndbcntr::execCNTR_WAITREP()
1867 
1868 /*******************************/
1869 /* NODE_FAILREP */
1870 /*******************************/
1871 void Ndbcntr::execNODE_FAILREP(Signal* signal)
1872 {
1873  jamEntry();
1874 
1875  if (ERROR_INSERTED(1001))
1876  {
1877  sendSignalWithDelay(reference(), GSN_NODE_FAILREP, signal, 100,
1878  signal->getLength());
1879  return;
1880  }
1881 
1882  const NodeFailRep * nodeFail = (NodeFailRep *)&signal->theData[0];
1883  NdbNodeBitmask allFailed;
1884  allFailed.assign(NdbNodeBitmask::Size, nodeFail->theNodes);
1885 
1886  NdbNodeBitmask failedStarted = c_startedNodes;
1887  NdbNodeBitmask failedStarting = c_start.m_starting;
1888  NdbNodeBitmask failedWaiting = c_start.m_waiting;
1889 
1890  failedStarted.bitAND(allFailed);
1891  failedStarting.bitAND(allFailed);
1892  failedWaiting.bitAND(allFailed);
1893 
1894  const bool tMasterFailed = allFailed.get(cmasterNodeId);
1895  const bool tStarted = !failedStarted.isclear();
1896  const bool tStarting = !failedStarting.isclear();
1897 
1898  if(tMasterFailed){
1899  jam();
1903  cmasterNodeId = nodeFail->masterNodeId;
1904  }
1905 
1909  c_start.m_starting.bitANDC(allFailed);
1910  c_start.m_waiting.bitANDC(allFailed);
1911  c_start.m_withLog.bitANDC(allFailed);
1912  c_start.m_withoutLog.bitANDC(allFailed);
1913  c_start.m_waitTO.bitANDC(allFailed);
1914  c_clusterNodes.bitANDC(allFailed);
1915  c_startedNodes.bitANDC(allFailed);
1916 
1917  const NodeState & st = getNodeState();
1918  if(st.startLevel == st.SL_STARTING){
1919  jam();
1920 
1921  const Uint32 phase = st.starting.startPhase;
1922 
1923  const bool tStartConf = (phase > 2) || (phase == 2 && cndbBlocksCount > 0);
1924 
1925  if(tMasterFailed){
1926  progError(__LINE__, NDBD_EXIT_SR_OTHERNODEFAILED,
1927  "Unhandled node failure during restart");
1928  }
1929 
1930  if(tStartConf && tStarting){
1931  // One of other starting nodes has crashed...
1932  progError(__LINE__, NDBD_EXIT_SR_OTHERNODEFAILED,
1933  "Unhandled node failure of starting node during restart");
1934  }
1935 
1936  if(tStartConf && tStarted){
1937  // One of other started nodes has crashed...
1938  progError(__LINE__, NDBD_EXIT_SR_OTHERNODEFAILED,
1939  "Unhandled node failure of started node during restart");
1940  }
1941 
1942  Uint32 nodeId = 0;
1943  while(!allFailed.isclear()){
1944  nodeId = allFailed.find(nodeId + 1);
1945  allFailed.clear(nodeId);
1946  signal->theData[0] = nodeId;
1947  sendSignal(QMGR_REF, GSN_NDB_FAILCONF, signal, 1, JBB);
1948  }//for
1949 
1950  return;
1951  }
1952 
1953  ndbrequire(!allFailed.get(getOwnNodeId()));
1954 
1955  NodeFailRep * rep = (NodeFailRep *)&signal->theData[0];
1956  rep->masterNodeId = cmasterNodeId;
1957 
1958  sendSignal(DBTC_REF, GSN_NODE_FAILREP, signal,
1959  NodeFailRep::SignalLength, JBB);
1960 
1961  sendSignal(DBLQH_REF, GSN_NODE_FAILREP, signal,
1962  NodeFailRep::SignalLength, JBB);
1963 
1964  sendSignal(DBDIH_REF, GSN_NODE_FAILREP, signal,
1965  NodeFailRep::SignalLength, JBB);
1966 
1967  sendSignal(DBDICT_REF, GSN_NODE_FAILREP, signal,
1968  NodeFailRep::SignalLength, JBB);
1969 
1970  sendSignal(BACKUP_REF, GSN_NODE_FAILREP, signal,
1971  NodeFailRep::SignalLength, JBB);
1972 
1973  sendSignal(SUMA_REF, GSN_NODE_FAILREP, signal,
1974  NodeFailRep::SignalLength, JBB);
1975 
1976  sendSignal(QMGR_REF, GSN_NODE_FAILREP, signal,
1977  NodeFailRep::SignalLength, JBB);
1978 
1979  sendSignal(DBUTIL_REF, GSN_NODE_FAILREP, signal,
1980  NodeFailRep::SignalLength, JBB);
1981 
1982  sendSignal(DBTUP_REF, GSN_NODE_FAILREP, signal,
1983  NodeFailRep::SignalLength, JBB);
1984 
1985  sendSignal(TSMAN_REF, GSN_NODE_FAILREP, signal,
1986  NodeFailRep::SignalLength, JBB);
1987 
1988  sendSignal(LGMAN_REF, GSN_NODE_FAILREP, signal,
1989  NodeFailRep::SignalLength, JBB);
1990 
1991  sendSignal(DBSPJ_REF, GSN_NODE_FAILREP, signal,
1992  NodeFailRep::SignalLength, JBB);
1993 
1994  if (c_stopRec.stopReq.senderRef)
1995  {
1996  jam();
1997  switch(c_stopRec.m_state){
1998  case StopRecord::SR_WAIT_NODE_FAILURES:
1999  {
2000  jam();
2001  NdbNodeBitmask tmp;
2002  tmp.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
2003  tmp.bitANDC(allFailed);
2004  tmp.copyto(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
2005 
2006  if (tmp.isclear())
2007  {
2008  jam();
2009  if (c_stopRec.stopReq.senderRef != RNIL)
2010  {
2011  jam();
2012  StopConf * const stopConf = (StopConf *)&signal->theData[0];
2013  stopConf->senderData = c_stopRec.stopReq.senderData;
2014  stopConf->nodeState = (Uint32) NodeState::SL_SINGLEUSER;
2015  sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_CONF, signal,
2016  StopConf::SignalLength, JBB);
2017  }
2018 
2019  c_stopRec.stopReq.senderRef = 0;
2020  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
2021  req->senderRef = reference();
2022  req->senderData = StopRecord::SR_UNBLOCK_GCP_START_GCP;
2023  req->requestType = WaitGCPReq::UnblockStartGcp;
2024  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal,
2025  WaitGCPReq::SignalLength, JBA);
2026  }
2027  break;
2028  }
2029  case StopRecord::SR_QMGR_STOP_REQ:
2030  {
2031  NdbNodeBitmask tmp;
2032  tmp.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
2033  tmp.bitANDC(allFailed);
2034 
2035  if (tmp.isclear())
2036  {
2037  Uint32 nodeId = allFailed.find(0);
2038  tmp.set(nodeId);
2039 
2040  StopConf* conf = (StopConf*)signal->getDataPtrSend();
2041  conf->senderData = c_stopRec.stopReq.senderData;
2042  conf->nodeId = nodeId;
2043  sendSignal(reference(),
2044  GSN_STOP_CONF, signal, StopConf::SignalLength, JBB);
2045  }
2046 
2047  tmp.copyto(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
2048 
2049  break;
2050  }
2051  case StopRecord::SR_BLOCK_GCP_START_GCP:
2052  case StopRecord::SR_WAIT_COMPLETE_GCP:
2053  case StopRecord::SR_UNBLOCK_GCP_START_GCP:
2054  case StopRecord::SR_CLUSTER_SHUTDOWN:
2055  break;
2056  }
2057  }
2058 
2059  signal->theData[0] = NDB_LE_NODE_FAILREP;
2060  signal->theData[2] = 0;
2061 
2062  Uint32 nodeId = 0;
2063  while(!allFailed.isclear()){
2064  nodeId = allFailed.find(nodeId + 1);
2065  allFailed.clear(nodeId);
2066  signal->theData[1] = nodeId;
2067  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
2068  }//for
2069 
2070  return;
2071 }//Ndbcntr::execNODE_FAILREP()
2072 
2073 /*******************************/
2074 /* READ_NODESREQ */
2075 /*******************************/
2076 void Ndbcntr::execREAD_NODESREQ(Signal* signal)
2077 {
2078  jamEntry();
2079 
2080  /*----------------------------------------------------------------------*/
2081  // ANY BLOCK MAY SEND A REQUEST ABOUT NDB NODES AND VERSIONS IN THE
2082  // SYSTEM. THIS REQUEST CAN ONLY BE HANDLED IN
2083  // ABSOLUTE STARTPHASE 3 OR LATER
2084  /*----------------------------------------------------------------------*/
2085  BlockReference TuserBlockref = signal->theData[0];
2086  ReadNodesConf * const readNodes = (ReadNodesConf *)&signal->theData[0];
2087 
2093  NdbNodeBitmask tmp1;
2094  tmp1.bitOR(c_startedNodes);
2095  if(!getNodeState().getNodeRestartInProgress()){
2096  tmp1.bitOR(c_start.m_starting);
2097  } else {
2098  tmp1.set(getOwnNodeId());
2099  }
2100 
2101  NdbNodeBitmask tmp2;
2102  tmp2.bitOR(c_allDefinedNodes);
2103  tmp2.bitANDC(tmp1);
2107  tmp2.copyto(NdbNodeBitmask::Size, readNodes->inactiveNodes);
2108  c_allDefinedNodes.copyto(NdbNodeBitmask::Size, readNodes->allNodes);
2109  c_clusterNodes.copyto(NdbNodeBitmask::Size, readNodes->clusterNodes);
2110  c_startedNodes.copyto(NdbNodeBitmask::Size, readNodes->startedNodes);
2111  c_start.m_starting.copyto(NdbNodeBitmask::Size, readNodes->startingNodes);
2112 
2113  readNodes->noOfNodes = c_allDefinedNodes.count();
2114  readNodes->masterNodeId = cmasterNodeId;
2115  readNodes->ndynamicId = cdynamicNodeId;
2116  if (m_cntr_start_conf)
2117  {
2118  jam();
2119  sendSignal(TuserBlockref, GSN_READ_NODESCONF, signal,
2120  ReadNodesConf::SignalLength, JBB);
2121 
2122  } else {
2123  jam();
2124  signal->theData[0] = ZNOT_AVAILABLE;
2125  sendSignal(TuserBlockref, GSN_READ_NODESREF, signal, 1, JBB);
2126  }//if
2127 }//Ndbcntr::execREAD_NODESREQ()
2128 
2129 /*----------------------------------------------------------------------*/
2130 // SENDS APPL_ERROR TO QMGR AND THEN SET A POINTER OUT OF BOUNDS
2131 /*----------------------------------------------------------------------*/
2132 void Ndbcntr::systemErrorLab(Signal* signal, int line)
2133 {
2134  progError(line, NDBD_EXIT_NDBREQUIRE); /* BUG INSERTION */
2135  return;
2136 }//Ndbcntr::systemErrorLab()
2137 
2138 /*###########################################################################*/
2139 /* CNTR MASTER CREATES AND INITIALIZES A SYSTEMTABLE AT INITIALSTART */
2140 /* |-2048| # 1 00000001 | */
2141 /* | : | : | */
2142 /* | -1 | # 1 00000001 | */
2143 /* | 1 | 0 | tupleid sequence now created on first use */
2144 /* | : | : | v */
2145 /* | 2048| 0 | v */
2146 /*---------------------------------------------------------------------------*/
2147 void Ndbcntr::beginSchemaTransLab(Signal* signal)
2148 {
2149  c_schemaTransId = reference();
2150 
2151  SchemaTransBeginReq* req =
2152  (SchemaTransBeginReq*)signal->getDataPtrSend();
2153  req->clientRef = reference();
2154  req->transId = c_schemaTransId;
2155  req->requestInfo = 0;
2156  sendSignal(DBDICT_REF, GSN_SCHEMA_TRANS_BEGIN_REQ, signal,
2157  SchemaTransBeginReq::SignalLength, JBB);
2158 }
2159 
2160 void Ndbcntr::execSCHEMA_TRANS_BEGIN_CONF(Signal* signal)
2161 {
2162  const SchemaTransBeginConf* conf =
2163  (SchemaTransBeginConf*)signal->getDataPtr();
2164  ndbrequire(conf->transId == c_schemaTransId);
2165  c_schemaTransKey = conf->transKey;
2166 
2167  createHashMap(signal, 0);
2168 }
2169 
2170 void Ndbcntr::execSCHEMA_TRANS_BEGIN_REF(Signal* signal)
2171 {
2172  ndbrequire(false);
2173 }
2174 
2175 void
2176 Ndbcntr::createHashMap(Signal* signal, Uint32 idx)
2177 {
2178  CreateHashMapReq* const req = (CreateHashMapReq*)signal->getDataPtrSend();
2179  req->clientRef = reference();
2180  req->clientData = idx;
2181  req->requestInfo = 0;
2182  req->transId = c_schemaTransId;
2183  req->transKey = c_schemaTransKey;
2184  req->buckets = 240;
2185  req->fragments = 0;
2186  sendSignal(DBDICT_REF, GSN_CREATE_HASH_MAP_REQ, signal,
2187  CreateHashMapReq::SignalLength, JBB);
2188 }
2189 
2190 void
2191 Ndbcntr::execCREATE_HASH_MAP_REF(Signal* signal)
2192 {
2193  jamEntry();
2194 
2195  ndbrequire(false);
2196 }
2197 
2198 void
2199 Ndbcntr::execCREATE_HASH_MAP_CONF(Signal* signal)
2200 {
2201  jamEntry();
2202  CreateHashMapConf* conf = (CreateHashMapConf*)signal->getDataPtrSend();
2203 
2204  if (conf->senderData == 0)
2205  {
2206  jam();
2207  c_hashMapId = conf->objectId;
2208  c_hashMapVersion = conf->objectVersion;
2209  }
2210 
2211  createSystableLab(signal, 0);
2212 }
2213 
2214 void Ndbcntr::endSchemaTransLab(Signal* signal)
2215 {
2216  SchemaTransEndReq* req =
2217  (SchemaTransEndReq*)signal->getDataPtrSend();
2218  req->clientRef = reference();
2219  req->transId = c_schemaTransId;
2220  req->requestInfo = 0;
2221  req->transKey = c_schemaTransKey;
2222  req->flags = 0;
2223  sendSignal(DBDICT_REF, GSN_SCHEMA_TRANS_END_REQ, signal,
2224  SchemaTransEndReq::SignalLength, JBB);
2225 }
2226 
2227 void Ndbcntr::execSCHEMA_TRANS_END_CONF(Signal* signal)
2228 {
2229  c_schemaTransId = 0;
2230  c_schemaTransKey = RNIL;
2231  startInsertTransactions(signal);
2232 }
2233 
2234 void Ndbcntr::execSCHEMA_TRANS_END_REF(Signal* signal)
2235 {
2236  jamEntry();
2237  SchemaTransEndRef * ref = (SchemaTransEndRef*)signal->getDataPtr();
2238  char buf[256];
2239  BaseString::snprintf(buf, sizeof(buf),
2240  "Failed to commit schema trans, err: %u",
2241  ref->errorCode);
2242  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
2243  ndbrequire(false);
2244 }
2245 
2246 void
2247 Ndbcntr::createDDObjects(Signal * signal, unsigned index)
2248 {
2249  const ndb_mgm_configuration_iterator * p =
2250  m_ctx.m_config.getOwnConfigIterator();
2251  ndbrequire(p != 0);
2252 
2253  Uint32 propPage[256];
2254  LinearWriter w(propPage, 256);
2255 
2256  const ddentry* entry = &f_dd[index];
2257 
2258  switch(entry->type){
2261  {
2262  jam();
2263 
2264  DictFilegroupInfo::Filegroup fg; fg.init();
2265  BaseString::snprintf(fg.FilegroupName, sizeof(fg.FilegroupName),
2266  "%s", entry->name);
2267  fg.FilegroupType = entry->type;
2268  if (entry->type == DictTabInfo::LogfileGroup)
2269  {
2270  jam();
2271  fg.LF_UndoBufferSize = Uint32(entry->size);
2272  }
2273  else
2274  {
2275  jam();
2276  fg.TS_ExtentSize = Uint32(entry->size);
2277  fg.TS_LogfileGroupId = RNIL;
2278  fg.TS_LogfileGroupVersion = RNIL;
2279  }
2280 
2282  s = SimpleProperties::pack(w,
2283  &fg,
2284  DictFilegroupInfo::Mapping,
2285  DictFilegroupInfo::MappingSize, true);
2286 
2287 
2288  Uint32 length = w.getWordsUsed();
2289  LinearSectionPtr ptr[3];
2290  ptr[0].p = &propPage[0];
2291  ptr[0].sz = length;
2292 
2293  CreateFilegroupReq * req = (CreateFilegroupReq*)signal->getDataPtrSend();
2294  req->senderRef = reference();
2295  req->senderData = index;
2296  req->objType = entry->type;
2297  req->transId = c_schemaTransId;
2298  req->transKey = c_schemaTransKey;
2299  req->requestInfo = 0;
2300  sendSignal(DBDICT_REF, GSN_CREATE_FILEGROUP_REQ, signal,
2301  CreateFilegroupReq::SignalLength, JBB, ptr, 1);
2302  return;
2303  }
2304  case DictTabInfo::Undofile:
2305  case DictTabInfo::Datafile:
2306  {
2307  jam();
2308  Uint32 propPage[256];
2309  LinearWriter w(propPage, 256);
2310  DictFilegroupInfo::File f; f.init();
2311  BaseString::snprintf(f.FileName, sizeof(f.FileName), "%s", entry->name);
2312  f.FileType = entry->type;
2313  f.FilegroupId = RNIL;
2314  f.FilegroupVersion = RNIL;
2315  f.FileSizeHi = Uint32(entry->size >> 32);
2316  f.FileSizeLo = Uint32(entry->size);
2317 
2319  s = SimpleProperties::pack(w,
2320  &f,
2321  DictFilegroupInfo::FileMapping,
2322  DictFilegroupInfo::FileMappingSize, true);
2323 
2324  Uint32 length = w.getWordsUsed();
2325  LinearSectionPtr ptr[3];
2326  ptr[0].p = &propPage[0];
2327  ptr[0].sz = length;
2328 
2329  CreateFileReq * req = (CreateFileReq*)signal->getDataPtrSend();
2330  req->senderRef = reference();
2331  req->senderData = index;
2332  req->objType = entry->type;
2333  req->transId = c_schemaTransId;
2334  req->transKey = c_schemaTransKey;
2335  req->requestInfo = CreateFileReq::ForceCreateFile;
2336  sendSignal(DBDICT_REF, GSN_CREATE_FILE_REQ, signal,
2337  CreateFileReq::SignalLength, JBB, ptr, 1);
2338  return;
2339  }
2340  default:
2341  break;
2342  }
2343 
2344  endSchemaTransLab(signal);
2345 }
2346 
2347 void
2348 Ndbcntr::execCREATE_FILEGROUP_REF(Signal* signal)
2349 {
2350  jamEntry();
2351  CreateFilegroupRef* ref = (CreateFilegroupRef*)signal->getDataPtr();
2352  char buf[1024];
2353 
2354  const ddentry* entry = &f_dd[ref->senderData];
2355 
2356  if (entry->type == DictTabInfo::LogfileGroup)
2357  {
2358  BaseString::snprintf(buf, sizeof(buf), "create logfilegroup err %u",
2359  ref->errorCode);
2360  }
2361  else if (entry->type == DictTabInfo::Tablespace)
2362  {
2363  BaseString::snprintf(buf, sizeof(buf), "create tablespace err %u",
2364  ref->errorCode);
2365  }
2366  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
2367 }
2368 
2369 void
2370 Ndbcntr::execCREATE_FILEGROUP_CONF(Signal* signal)
2371 {
2372  jamEntry();
2373  CreateFilegroupConf* conf = (CreateFilegroupConf*)signal->getDataPtr();
2374  createDDObjects(signal, conf->senderData + 1);
2375 }
2376 
2377 void
2378 Ndbcntr::execCREATE_FILE_REF(Signal* signal)
2379 {
2380  jamEntry();
2381  CreateFileRef* ref = (CreateFileRef*)signal->getDataPtr();
2382  char buf[1024];
2383 
2384  const ddentry* entry = &f_dd[ref->senderData];
2385 
2386  if (entry->type == DictTabInfo::Undofile)
2387  {
2388  BaseString::snprintf(buf, sizeof(buf), "create undofile %s err %u",
2389  entry->name,
2390  ref->errorCode);
2391  }
2392  else if (entry->type == DictTabInfo::Datafile)
2393  {
2394  BaseString::snprintf(buf, sizeof(buf), "create datafile %s err %u",
2395  entry->name,
2396  ref->errorCode);
2397  }
2398  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
2399 }
2400 
2401 void
2402 Ndbcntr::execCREATE_FILE_CONF(Signal* signal)
2403 {
2404  jamEntry();
2405  CreateFileConf* conf = (CreateFileConf*)signal->getDataPtr();
2406  createDDObjects(signal, conf->senderData + 1);
2407 }
2408 
2409 void Ndbcntr::createSystableLab(Signal* signal, unsigned index)
2410 {
2411  if (index >= g_sysTableCount) {
2412  ndbassert(index == g_sysTableCount);
2413  createDDObjects(signal, 0);
2414  return;
2415  }
2416  const SysTable& table = *g_sysTableList[index];
2417  Uint32 propPage[256];
2418  LinearWriter w(propPage, 256);
2419 
2420  // XXX remove commented-out lines later
2421 
2422  w.first();
2423  w.add(DictTabInfo::TableName, table.name);
2424  w.add(DictTabInfo::TableLoggedFlag, table.tableLoggedFlag);
2425  //w.add(DictTabInfo::TableKValue, 6);
2426  //w.add(DictTabInfo::MinLoadFactor, 70);
2427  //w.add(DictTabInfo::MaxLoadFactor, 80);
2428  w.add(DictTabInfo::FragmentTypeVal, (Uint32)table.fragmentType);
2429  //w.add(DictTabInfo::NoOfKeyAttr, 1);
2430  w.add(DictTabInfo::NoOfAttributes, (Uint32)table.columnCount);
2431  //w.add(DictTabInfo::NoOfNullable, (Uint32)0);
2432  //w.add(DictTabInfo::NoOfVariable, (Uint32)0);
2433  //w.add(DictTabInfo::KeyLength, 1);
2434  w.add(DictTabInfo::TableTypeVal, (Uint32)table.tableType);
2435  w.add(DictTabInfo::SingleUserMode, (Uint32)NDB_SUM_READ_WRITE);
2436  w.add(DictTabInfo::HashMapObjectId, c_hashMapId);
2437  w.add(DictTabInfo::HashMapVersion, c_hashMapVersion);
2438 
2439  for (unsigned i = 0; i < table.columnCount; i++) {
2440  const SysColumn& column = table.columnList[i];
2441  ndbassert(column.pos == i);
2442  w.add(DictTabInfo::AttributeName, column.name);
2443  w.add(DictTabInfo::AttributeId, (Uint32)i);
2444  w.add(DictTabInfo::AttributeKeyFlag, (Uint32)column.keyFlag);
2445  w.add(DictTabInfo::AttributeStorageType,
2446  (Uint32)NDB_STORAGETYPE_MEMORY);
2447  switch(column.type){
2448  case DictTabInfo::ExtVarbinary:
2449  jam();
2450  w.add(DictTabInfo::AttributeArrayType,
2451  (Uint32)NDB_ARRAYTYPE_SHORT_VAR);
2452  break;
2453  case DictTabInfo::ExtLongvarbinary:
2454  jam();
2455  w.add(DictTabInfo::AttributeArrayType,
2456  (Uint32)NDB_ARRAYTYPE_MEDIUM_VAR);
2457  break;
2458  default:
2459  jam();
2460  w.add(DictTabInfo::AttributeArrayType,
2461  (Uint32)NDB_ARRAYTYPE_FIXED);
2462  break;
2463  }
2464  w.add(DictTabInfo::AttributeNullableFlag, (Uint32)column.nullable);
2465  w.add(DictTabInfo::AttributeExtType, (Uint32)column.type);
2466  w.add(DictTabInfo::AttributeExtLength, (Uint32)column.length);
2467  w.add(DictTabInfo::AttributeEnd, (Uint32)true);
2468  }
2469  w.add(DictTabInfo::TableEnd, (Uint32)true);
2470 
2471  Uint32 length = w.getWordsUsed();
2472  LinearSectionPtr ptr[3];
2473  ptr[0].p = &propPage[0];
2474  ptr[0].sz = length;
2475 
2476  CreateTableReq* const req = (CreateTableReq*)signal->getDataPtrSend();
2477  req->clientRef = reference();
2478  req->clientData = index;
2479  req->requestInfo = 0;
2480  req->transId = c_schemaTransId;
2481  req->transKey = c_schemaTransKey;
2482  sendSignal(DBDICT_REF, GSN_CREATE_TABLE_REQ, signal,
2483  CreateTableReq::SignalLength, JBB, ptr, 1);
2484  return;
2485 }//Ndbcntr::createSystableLab()
2486 
2487 void Ndbcntr::execCREATE_TABLE_REF(Signal* signal)
2488 {
2489  jamEntry();
2490  progError(__LINE__,NDBD_EXIT_NDBREQUIRE, "CREATE_TABLE_REF");
2491  return;
2492 }//Ndbcntr::execDICTTABREF()
2493 
2494 void Ndbcntr::execCREATE_TABLE_CONF(Signal* signal)
2495 {
2496  jamEntry();
2497  const CreateTableConf* conf = (const CreateTableConf*)signal->getDataPtr();
2498  //csystabId = conf->tableId;
2499  ndbrequire(conf->transId == c_schemaTransId);
2500  ndbrequire(conf->senderData < g_sysTableCount);
2501  const SysTable& table = *g_sysTableList[conf->senderData];
2502  table.tableId = conf->tableId;
2503  table.tableVersion = conf->tableVersion;
2504  createSystableLab(signal, conf->senderData + 1);
2505  //startInsertTransactions(signal);
2506  return;
2507 }//Ndbcntr::execDICTTABCONF()
2508 
2509 /*******************************/
2510 /* DICTRELEASECONF */
2511 /*******************************/
2512 void Ndbcntr::startInsertTransactions(Signal* signal)
2513 {
2514  jamEntry();
2515 
2516  ckey = 1;
2517  ctransidPhase = ZTRUE;
2518  signal->theData[0] = 0;
2519  signal->theData[1] = reference();
2520  sendSignal(DBTC_REF, GSN_TCSEIZEREQ, signal, 2, JBB);
2521  return;
2522 }//Ndbcntr::startInsertTransactions()
2523 
2524 /*******************************/
2525 /* TCSEIZECONF */
2526 /*******************************/
2527 void Ndbcntr::execTCSEIZECONF(Signal* signal)
2528 {
2529  jamEntry();
2530  ctcConnectionP = signal->theData[1];
2531  ctcReference = signal->theData[2];
2532  crSystab7Lab(signal);
2533  return;
2534 }//Ndbcntr::execTCSEIZECONF()
2535 
2536 const unsigned int RowsPerCommit = 16;
2537 void Ndbcntr::crSystab7Lab(Signal* signal)
2538 {
2539  UintR tkey;
2540  UintR Tmp;
2541 
2542  TcKeyReq * const tcKeyReq = (TcKeyReq *)&signal->theData[0];
2543 
2544  UintR reqInfo_Start = 0;
2545  tcKeyReq->setOperationType(reqInfo_Start, ZINSERT); // Insert
2546  tcKeyReq->setKeyLength (reqInfo_Start, 1);
2547  tcKeyReq->setAIInTcKeyReq (reqInfo_Start, 5);
2548  tcKeyReq->setAbortOption (reqInfo_Start, TcKeyReq::AbortOnError);
2549 
2550 /* KEY LENGTH = 1, ATTRINFO LENGTH IN TCKEYREQ = 5 */
2551  cresponses = 0;
2552  const UintR guard0 = ckey + (RowsPerCommit - 1);
2553  for (Tmp = ckey; Tmp <= guard0; Tmp++) {
2554  UintR reqInfo = reqInfo_Start;
2555  if (Tmp == ckey) { // First iteration, Set start flag
2556  jam();
2557  tcKeyReq->setStartFlag(reqInfo, 1);
2558  } //if
2559  if (Tmp == guard0) { // Last iteration, Set commit flag
2560  jam();
2561  tcKeyReq->setCommitFlag(reqInfo, 1);
2562  tcKeyReq->setExecuteFlag(reqInfo, 1);
2563  } //if
2564  if (ctransidPhase == ZTRUE) {
2565  jam();
2566  tkey = 0;
2567  tkey = tkey - Tmp;
2568  } else {
2569  jam();
2570  tkey = Tmp;
2571  }//if
2572 
2573  tcKeyReq->apiConnectPtr = ctcConnectionP;
2574  tcKeyReq->attrLen = 5;
2575  tcKeyReq->tableId = g_sysTable_SYSTAB_0.tableId;
2576  tcKeyReq->requestInfo = reqInfo;
2577  tcKeyReq->tableSchemaVersion = g_sysTable_SYSTAB_0.tableVersion;
2578  tcKeyReq->transId1 = 0;
2579  tcKeyReq->transId2 = ckey;
2580 
2581 //-------------------------------------------------------------
2582 // There is no optional part in this TCKEYREQ. There is one
2583 // key word and five ATTRINFO words.
2584 //-------------------------------------------------------------
2585  Uint32* tKeyDataPtr = &tcKeyReq->scanInfo;
2586  Uint32* tAIDataPtr = &tKeyDataPtr[1];
2587 
2588  tKeyDataPtr[0] = tkey;
2589 
2590  AttributeHeader::init(&tAIDataPtr[0], 0, 1 << 2);
2591  tAIDataPtr[1] = tkey;
2592  AttributeHeader::init(&tAIDataPtr[2], 1, 2 << 2);
2593  tAIDataPtr[3] = (tkey << 16);
2594  tAIDataPtr[4] = 1;
2595  sendSignal(ctcReference, GSN_TCKEYREQ, signal,
2596  TcKeyReq::StaticLength + 6, JBB);
2597  }//for
2598  ckey = ckey + RowsPerCommit;
2599  return;
2600 }//Ndbcntr::crSystab7Lab()
2601 
2602 /*******************************/
2603 /* TCKEYCONF09 */
2604 /*******************************/
2605 void Ndbcntr::execTCKEYCONF(Signal* signal)
2606 {
2607  const TcKeyConf * const keyConf = (TcKeyConf *)&signal->theData[0];
2608 
2609  jamEntry();
2610  cgciSystab = keyConf->gci_hi;
2611  UintR confInfo = keyConf->confInfo;
2612 
2613  if (TcKeyConf::getMarkerFlag(confInfo)){
2614  Uint32 transId1 = keyConf->transId1;
2615  Uint32 transId2 = keyConf->transId2;
2616  signal->theData[0] = transId1;
2617  signal->theData[1] = transId2;
2618  sendSignal(ctcReference, GSN_TC_COMMIT_ACK, signal, 2, JBB);
2619  }//if
2620 
2621  cresponses = cresponses + TcKeyConf::getNoOfOperations(confInfo);
2622  if (TcKeyConf::getCommitFlag(confInfo)){
2623  jam();
2624  ndbrequire(cresponses == RowsPerCommit);
2625 
2626  crSystab8Lab(signal);
2627  return;
2628  }
2629  return;
2630 }//Ndbcntr::tckeyConfLab()
2631 
2632 void Ndbcntr::crSystab8Lab(Signal* signal)
2633 {
2634  if (ckey < ZSIZE_SYSTAB) {
2635  jam();
2636  crSystab7Lab(signal);
2637  return;
2638  } else if (ctransidPhase == ZTRUE) {
2639  jam();
2640  ckey = 1;
2641  ctransidPhase = ZFALSE;
2642  // skip 2nd loop - tupleid sequence now created on first use
2643  }//if
2644  signal->theData[0] = ctcConnectionP;
2645  signal->theData[1] = reference();
2646  signal->theData[2] = 0;
2647  sendSignal(ctcReference, GSN_TCRELEASEREQ, signal, 2, JBB);
2648  return;
2649 }//Ndbcntr::crSystab8Lab()
2650 
2651 /*******************************/
2652 /* TCRELEASECONF */
2653 /*******************************/
2654 void Ndbcntr::execTCRELEASECONF(Signal* signal)
2655 {
2656  jamEntry();
2657  waitpoint52Lab(signal);
2658  return;
2659 }//Ndbcntr::execTCRELEASECONF()
2660 
2661 void Ndbcntr::crSystab9Lab(Signal* signal)
2662 {
2663  signal->theData[0] = 0; // user ptr
2664  signal->theData[1] = reference();
2665  signal->theData[2] = 0;
2666  sendSignalWithDelay(DBDIH_REF, GSN_GETGCIREQ, signal, 100, 3);
2667  return;
2668 }//Ndbcntr::crSystab9Lab()
2669 
2670 /*******************************/
2671 /* GETGCICONF */
2672 /*******************************/
2673 void Ndbcntr::execGETGCICONF(Signal* signal)
2674 {
2675  jamEntry();
2676 
2677 #ifndef NO_GCP
2678  if (signal->theData[1] < cgciSystab) {
2679  jam();
2680 /*--------------------------------------*/
2681 /* MAKE SURE THAT THE SYSTABLE IS */
2682 /* NOW SAFE ON DISK */
2683 /*--------------------------------------*/
2684  crSystab9Lab(signal);
2685  return;
2686  }//if
2687 #endif
2688  waitpoint52Lab(signal);
2689  return;
2690 }//Ndbcntr::execGETGCICONF()
2691 
2692 void Ndbcntr::execTCKEYREF(Signal* signal)
2693 {
2694  jamEntry();
2695  systemErrorLab(signal, __LINE__);
2696  return;
2697 }//Ndbcntr::execTCKEYREF()
2698 
2699 void Ndbcntr::execTCROLLBACKREP(Signal* signal)
2700 {
2701  jamEntry();
2702  systemErrorLab(signal, __LINE__);
2703  return;
2704 }//Ndbcntr::execTCROLLBACKREP()
2705 
2706 void Ndbcntr::execTCRELEASEREF(Signal* signal)
2707 {
2708  jamEntry();
2709  systemErrorLab(signal, __LINE__);
2710  return;
2711 }//Ndbcntr::execTCRELEASEREF()
2712 
2713 void Ndbcntr::execTCSEIZEREF(Signal* signal)
2714 {
2715  jamEntry();
2716  systemErrorLab(signal, __LINE__);
2717  return;
2718 }//Ndbcntr::execTCSEIZEREF()
2719 
2720 
2721 /*---------------------------------------------------------------------------*/
2722 /*INITIALIZE VARIABLES AND RECORDS */
2723 /*---------------------------------------------------------------------------*/
2724 void Ndbcntr::initData(Signal* signal)
2725 {
2726  c_start.reset();
2727  cmasterNodeId = 0;
2728  cnoStartNodes = 0;
2729  cnoWaitrep = 0;
2730 }//Ndbcntr::initData()
2731 
2732 
2733 /*---------------------------------------------------------------------------*/
2734 /*RESET VARIABLES USED DURING THE START */
2735 /*---------------------------------------------------------------------------*/
2736 void Ndbcntr::resetStartVariables(Signal* signal)
2737 {
2738  cnoStartNodes = 0;
2739  cnoWaitrep6 = cnoWaitrep7 = 0;
2740 }//Ndbcntr::resetStartVariables()
2741 
2742 
2743 /*---------------------------------------------------------------------------*/
2744 // SEND THE SIGNAL
2745 // INPUT CNDB_BLOCKS_COUNT
2746 /*---------------------------------------------------------------------------*/
2747 void Ndbcntr::sendNdbSttor(Signal* signal)
2748 {
2749  NdbBlocksRecPtr ndbBlocksPtr;
2750 
2751  ndbBlocksPtr.i = cndbBlocksCount;
2752  ptrCheckGuard(ndbBlocksPtr, ZSIZE_NDB_BLOCKS_REC, ndbBlocksRec);
2753 
2754  NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend();
2755  req->senderRef = reference();
2756  req->nodeId = getOwnNodeId();
2757  req->internalStartPhase = cinternalStartphase;
2758  req->typeOfStart = ctypeOfStart;
2759  req->masterNodeId = cmasterNodeId;
2760 
2761  for (int i = 0; i < 16; i++) {
2762  // Garbage
2763  req->config[i] = 0x88776655;
2764  //cfgBlockPtr.p->cfgData[i];
2765  }
2766 
2767  //#define MAX_STARTPHASE 2
2768 #ifdef TRACE_STTOR
2769  ndbout_c("sending NDB_STTOR(%d) to %s",
2770  cinternalStartphase,
2771  getBlockName( refToBlock(ndbBlocksPtr.p->blockref)));
2772 #endif
2773  if (refToBlock(ndbBlocksPtr.p->blockref) == DBDIH)
2774  req->typeOfStart = cdihStartType;
2775  sendSignal(ndbBlocksPtr.p->blockref, GSN_NDB_STTOR, signal, 22, JBB);
2776  cndbBlocksCount++;
2777 }//Ndbcntr::sendNdbSttor()
2778 
2779 /*---------------------------------------------------------------------------*/
2780 // JUST SEND THE SIGNAL
2781 /*---------------------------------------------------------------------------*/
2782 void Ndbcntr::sendSttorry(Signal* signal)
2783 {
2784  signal->theData[3] = ZSTART_PHASE_1;
2785  signal->theData[4] = ZSTART_PHASE_2;
2786  signal->theData[5] = ZSTART_PHASE_3;
2787  signal->theData[6] = ZSTART_PHASE_4;
2788  signal->theData[7] = ZSTART_PHASE_5;
2789  signal->theData[8] = ZSTART_PHASE_6;
2790  // skip simulated phase 7
2791  signal->theData[9] = ZSTART_PHASE_8;
2792  signal->theData[10] = ZSTART_PHASE_9;
2793  signal->theData[11] = ZSTART_PHASE_END;
2794  sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 12, JBB);
2795 }//Ndbcntr::sendSttorry()
2796 
2797 void
2798 Ndbcntr::execDUMP_STATE_ORD(Signal* signal)
2799 {
2800  DumpStateOrd * const & dumpState = (DumpStateOrd *)&signal->theData[0];
2801  Uint32 arg = dumpState->args[0];
2802 
2803  if(arg == 13){
2804  infoEvent("Cntr: cstartPhase = %d, cinternalStartphase = %d, block = %d",
2805  cstartPhase, cinternalStartphase, cndbBlocksCount);
2806  infoEvent("Cntr: cmasterNodeId = %d", cmasterNodeId);
2807  }
2808 
2809  if (arg == DumpStateOrd::NdbcntrTestStopOnError){
2810  if (m_ctx.m_config.stopOnError() == true)
2811  ((Configuration&)m_ctx.m_config).stopOnError(false);
2812 
2813  const BlockReference tblockref = calcNdbCntrBlockRef(getOwnNodeId());
2814 
2815  SystemError * const sysErr = (SystemError*)&signal->theData[0];
2816  sysErr->errorCode = SystemError::TestStopOnError;
2817  sysErr->errorRef = reference();
2818  sendSignal(tblockref, GSN_SYSTEM_ERROR, signal,
2819  SystemError::SignalLength, JBA);
2820  }
2821 
2822  if (arg == DumpStateOrd::NdbcntrStopNodes)
2823  {
2824  NdbNodeBitmask mask;
2825  for(Uint32 i = 1; i<signal->getLength(); i++)
2826  mask.set(signal->theData[i]);
2827 
2828  StopReq* req = (StopReq*)signal->getDataPtrSend();
2829  req->senderRef = RNIL;
2830  req->senderData = 123;
2831  req->requestInfo = 0;
2832  req->singleuser = 0;
2833  req->singleUserApi = 0;
2834  mask.copyto(NdbNodeBitmask::Size, req->nodes);
2835  StopReq::setPerformRestart(req->requestInfo, 1);
2836  StopReq::setNoStart(req->requestInfo, 1);
2837  StopReq::setStopNodes(req->requestInfo, 1);
2838  StopReq::setStopAbort(req->requestInfo, 1);
2839 
2840  sendSignal(reference(), GSN_STOP_REQ, signal,
2841  StopReq::SignalLength, JBB);
2842  return;
2843  }
2844 
2845  if (arg == 71)
2846  {
2847 #ifdef ERROR_INSERT
2848  if (signal->getLength() == 2)
2849  {
2850  c_error_insert_extra = signal->theData[1];
2851  SET_ERROR_INSERT_VALUE(1002);
2852  }
2853  else if (ERROR_INSERTED(1002))
2854  {
2855  CLEAR_ERROR_INSERT_VALUE;
2856  }
2857 #endif
2858  }
2859 
2860 }//Ndbcntr::execDUMP_STATE_ORD()
2861 
2862 void Ndbcntr::updateNodeState(Signal* signal, const NodeState& newState) const{
2863  NodeStateRep * const stateRep = (NodeStateRep *)&signal->theData[0];
2864 
2865  if (newState.startLevel == NodeState::SL_STARTED)
2866  {
2867  CRASH_INSERTION(1000);
2868  }
2869 
2870  stateRep->nodeState = newState;
2871  stateRep->nodeState.masterNodeId = cmasterNodeId;
2872  stateRep->nodeState.setNodeGroup(c_nodeGroup);
2873 
2874  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
2875  sendSignal(ALL_BLOCKS[i].Ref, GSN_NODE_STATE_REP, signal,
2876  NodeStateRep::SignalLength, JBB);
2877  }
2878 }
2879 
2880 void
2881 Ndbcntr::execRESUME_REQ(Signal* signal){
2882  //ResumeReq * const req = (ResumeReq *)&signal->theData[0];
2883  //ResumeRef * const ref = (ResumeRef *)&signal->theData[0];
2884 
2885  jamEntry();
2886 
2887  signal->theData[0] = NDB_LE_SingleUser;
2888  signal->theData[1] = 2;
2889  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
2890 
2891  //Uint32 senderData = req->senderData;
2892  //BlockReference senderRef = req->senderRef;
2893  NodeState newState(NodeState::SL_STARTED);
2894  updateNodeState(signal, newState);
2895  c_stopRec.stopReq.senderRef=0;
2896 }
2897 
2898 void
2899 Ndbcntr::execSTOP_REQ(Signal* signal){
2900  StopReq * const req = (StopReq *)&signal->theData[0];
2901  StopRef * const ref = (StopRef *)&signal->theData[0];
2902  Uint32 singleuser = req->singleuser;
2903  jamEntry();
2904  Uint32 senderData = req->senderData;
2905  BlockReference senderRef = req->senderRef;
2906  bool abort = StopReq::getStopAbort(req->requestInfo);
2907  bool stopnodes = StopReq::getStopNodes(req->requestInfo);
2908 
2909  if(!singleuser &&
2910  (getNodeState().startLevel < NodeState::SL_STARTED ||
2911  (abort && !stopnodes)))
2912  {
2918  jam();
2919  const Uint32 reqInfo = req->requestInfo;
2920  if(StopReq::getPerformRestart(reqInfo)){
2921  jam();
2922  StartOrd * startOrd = (StartOrd *)&signal->theData[0];
2923  startOrd->restartInfo = reqInfo;
2924  sendSignal(CMVMI_REF, GSN_START_ORD, signal, 1, JBA);
2925  } else {
2926  jam();
2927  sendSignal(CMVMI_REF, GSN_STOP_ORD, signal, 1, JBA);
2928  }
2929  return;
2930  }
2931 
2932  if(c_stopRec.stopReq.senderRef != 0 ||
2933  (cmasterNodeId == getOwnNodeId() && !c_start.m_starting.isclear()))
2934  {
2938  if(!singleuser && StopReq::getSystemStop(req->requestInfo)){
2939  jam();
2940  sendSignalWithDelay(reference(), GSN_STOP_REQ, signal, 100,
2941  StopReq::SignalLength);
2942  return;
2943  }
2944 
2948  if(c_stopRec.stopReq.senderRef &&
2949  StopReq::getSystemStop(c_stopRec.stopReq.requestInfo))
2950  ref->errorCode = StopRef::SystemShutdownInProgress;
2951  else
2952  ref->errorCode = StopRef::NodeShutdownInProgress;
2953  ref->senderData = senderData;
2954  ref->masterNodeId = cmasterNodeId;
2955 
2956  if (senderRef != RNIL)
2957  sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
2958  return;
2959  }
2960 
2961  if (stopnodes && !abort)
2962  {
2963  jam();
2964  ref->errorCode = StopRef::UnsupportedNodeShutdown;
2965  ref->senderData = senderData;
2966  ref->masterNodeId = cmasterNodeId;
2967  if (senderRef != RNIL)
2968  sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
2969  return;
2970  }
2971 
2972  if (stopnodes && cmasterNodeId != getOwnNodeId())
2973  {
2974  jam();
2975  ref->errorCode = StopRef::MultiNodeShutdownNotMaster;
2976  ref->senderData = senderData;
2977  ref->masterNodeId = cmasterNodeId;
2978  if (senderRef != RNIL)
2979  sendSignal(senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
2980  return;
2981  }
2982 
2983  c_stopRec.stopReq = * req;
2984  c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
2985 
2986  if (stopnodes)
2987  {
2988  jam();
2989 
2990  if(!c_stopRec.checkNodeFail(signal))
2991  {
2992  jam();
2993  return;
2994  }
2995 
2996  char buf[100];
2997  NdbNodeBitmask mask;
2998  mask.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
2999  infoEvent("Initiating shutdown abort of %s", mask.getText(buf));
3000  ndbout_c("Initiating shutdown abort of %s", mask.getText(buf));
3001 
3002  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
3003  req->senderRef = reference();
3004  req->senderData = StopRecord::SR_BLOCK_GCP_START_GCP;
3005  req->requestType = WaitGCPReq::BlockStartGcp;
3006  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal,
3007  WaitGCPReq::SignalLength, JBB);
3008  return;
3009  }
3010  else if(!singleuser)
3011  {
3012  if(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo))
3013  {
3014  jam();
3015  if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo))
3016  {
3017  ((Configuration&)m_ctx.m_config).stopOnError(false);
3018  }
3019  }
3020  if(!c_stopRec.checkNodeFail(signal))
3021  {
3022  jam();
3023  return;
3024  }
3025  signal->theData[0] = NDB_LE_NDBStopStarted;
3026  signal->theData[1] = StopReq::getSystemStop(c_stopRec.stopReq.requestInfo) ? 1 : 0;
3027  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
3028  }
3029  else
3030  {
3031  signal->theData[0] = NDB_LE_SingleUser;
3032  signal->theData[1] = 0;
3033  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);
3034  }
3035 
3037  StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
3038 
3039  if(singleuser) {
3040  newState.setSingleUser(true);
3041  newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
3042  }
3043  updateNodeState(signal, newState);
3044  signal->theData[0] = ZSHUTDOWN;
3045  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
3046 }
3047 
3048 void
3049 Ndbcntr::StopRecord::checkTimeout(Signal* signal){
3050  jamEntry();
3051 
3052  if(!cntr.getNodeState().getSingleUserMode())
3053  if(!checkNodeFail(signal)){
3054  jam();
3055  return;
3056  }
3057 
3058  switch(cntr.getNodeState().startLevel){
3060  checkApiTimeout(signal);
3061  break;
3063  checkTcTimeout(signal);
3064  break;
3066  checkLqhTimeout_1(signal);
3067  break;
3069  checkLqhTimeout_2(signal);
3070  break;
3071  case NodeState::SL_SINGLEUSER:
3072  break;
3073  default:
3074  ndbrequire(false);
3075  }
3076 }
3077 
3078 bool
3080  jam();
3081  if(StopReq::getSystemStop(stopReq.requestInfo)){
3082  jam();
3083  return true;
3084  }
3085 
3089  NdbNodeBitmask ndbMask;
3090  ndbMask.assign(cntr.c_startedNodes);
3091 
3092  if (StopReq::getStopNodes(stopReq.requestInfo))
3093  {
3094  NdbNodeBitmask tmp;
3095  tmp.assign(NdbNodeBitmask::Size, stopReq.nodes);
3096 
3097  NdbNodeBitmask ndbStopNodes;
3098  ndbStopNodes.assign(NdbNodeBitmask::Size, stopReq.nodes);
3099  ndbStopNodes.bitAND(ndbMask);
3100  ndbStopNodes.copyto(NdbNodeBitmask::Size, stopReq.nodes);
3101 
3102  ndbMask.bitANDC(tmp);
3103 
3104  bool allNodesStopped = true;
3105  int i ;
3106  for( i = 0; i < (int) NdbNodeBitmask::Size; i++ ){
3107  if ( stopReq.nodes[i] != 0 ){
3108  allNodesStopped = false;
3109  break;
3110  }
3111  }
3112 
3113  if ( allNodesStopped ) {
3114  StopConf * const stopConf = (StopConf *)&signal->theData[0];
3115  stopConf->senderData = stopReq.senderData;
3116  stopConf->nodeState = (Uint32) NodeState::SL_NOTHING;
3117  cntr.sendSignal(stopReq.senderRef, GSN_STOP_CONF, signal,
3118  StopConf::SignalLength, JBB);
3119  stopReq.senderRef = 0;
3120  return false;
3121  }
3122 
3123  }
3124  else
3125  {
3126  ndbMask.clear(cntr.getOwnNodeId());
3127  }
3128 
3129  CheckNodeGroups* sd = (CheckNodeGroups*)&signal->theData[0];
3130  sd->blockRef = cntr.reference();
3131  sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::ArbitCheck;
3132  sd->mask = ndbMask;
3133  cntr.EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal,
3134  CheckNodeGroups::SignalLength);
3135  jamEntry();
3136  switch (sd->output) {
3137  case CheckNodeGroups::Win:
3138  case CheckNodeGroups::Partitioning:
3139  return true;
3140  break;
3141  }
3142 
3143  StopRef * const ref = (StopRef *)&signal->theData[0];
3144 
3145  ref->senderData = stopReq.senderData;
3146  ref->errorCode = StopRef::NodeShutdownWouldCauseSystemCrash;
3147  ref->masterNodeId = cntr.cmasterNodeId;
3148 
3149  const BlockReference bref = stopReq.senderRef;
3150  if (bref != RNIL)
3151  cntr.sendSignal(bref, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
3152 
3153  stopReq.senderRef = 0;
3154 
3155  if (cntr.getNodeState().startLevel != NodeState::SL_SINGLEUSER)
3156  {
3157  NodeState newState(NodeState::SL_STARTED);
3158  cntr.updateNodeState(signal, newState);
3159  }
3160 
3161  signal->theData[0] = NDB_LE_NDBStopAborted;
3162  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 1, JBB);
3163 
3164  return false;
3165 }
3166 
3167 void
3168 Ndbcntr::StopRecord::checkApiTimeout(Signal* signal){
3169  const Int32 timeout = stopReq.apiTimeout;
3170  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
3171  const NDB_TICKS now = NdbTick_CurrentMillisecond();
3172  if((timeout >= 0 && now >= alarm)){
3173  // || checkWithApiInSomeMagicWay)
3174  jam();
3176  StopReq::getSystemStop(stopReq.requestInfo));
3177  if(stopReq.singleuser) {
3178  newState.setSingleUser(true);
3179  newState.setSingleUserApi(stopReq.singleUserApi);
3180  }
3181  cntr.updateNodeState(signal, newState);
3182 
3183  stopInitiatedTime = now;
3184  }
3185 
3186  signal->theData[0] = ZSHUTDOWN;
3187  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
3188 }
3189 
3190 void
3191 Ndbcntr::StopRecord::checkTcTimeout(Signal* signal){
3192  const Int32 timeout = stopReq.transactionTimeout;
3193  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
3194  const NDB_TICKS now = NdbTick_CurrentMillisecond();
3195  if((timeout >= 0 && now >= alarm)){
3196  // || checkWithTcInSomeMagicWay)
3197  jam();
3198  if(stopReq.getSystemStop(stopReq.requestInfo) || stopReq.singleuser){
3199  jam();
3200  if(stopReq.singleuser)
3201  {
3202  jam();
3203  AbortAllReq * req = (AbortAllReq*)&signal->theData[0];
3204  req->senderRef = cntr.reference();
3205  req->senderData = 12;
3206  cntr.sendSignal(DBTC_REF, GSN_ABORT_ALL_REQ, signal,
3207  AbortAllReq::SignalLength, JBB);
3208  }
3209  else
3210  {
3211  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
3212  req->senderRef = cntr.reference();
3213  req->senderData = StopRecord::SR_CLUSTER_SHUTDOWN;
3214  req->requestType = WaitGCPReq::CompleteForceStart;
3215  cntr.sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal,
3216  WaitGCPReq::SignalLength, JBB);
3217  }
3218  } else {
3219  jam();
3220  StopPermReq * req = (StopPermReq*)&signal->theData[0];
3221  req->senderRef = cntr.reference();
3222  req->senderData = 12;
3223  cntr.sendSignal(DBDIH_REF, GSN_STOP_PERM_REQ, signal,
3224  StopPermReq::SignalLength, JBB);
3225  }
3226  return;
3227  }
3228  signal->theData[0] = ZSHUTDOWN;
3229  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
3230 }
3231 
3232 void Ndbcntr::execSTOP_PERM_REF(Signal* signal){
3233  //StopPermRef* const ref = (StopPermRef*)&signal->theData[0];
3234 
3235  jamEntry();
3236 
3237  signal->theData[0] = ZSHUTDOWN;
3238  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
3239 }
3240 
3241 void Ndbcntr::execSTOP_PERM_CONF(Signal* signal){
3242  jamEntry();
3243 
3244  AbortAllReq * req = (AbortAllReq*)&signal->theData[0];
3245  req->senderRef = reference();
3246  req->senderData = 12;
3247  sendSignal(DBTC_REF, GSN_ABORT_ALL_REQ, signal,
3248  AbortAllReq::SignalLength, JBB);
3249 }
3250 
3251 void Ndbcntr::execABORT_ALL_CONF(Signal* signal){
3252  jamEntry();
3253  if(c_stopRec.stopReq.singleuser) {
3254  jam();
3255 
3256  NodeState newState(NodeState::SL_SINGLEUSER);
3257  newState.setSingleUser(true);
3258  newState.setSingleUserApi(c_stopRec.stopReq.singleUserApi);
3259  updateNodeState(signal, newState);
3260  c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
3261 
3262  StopConf * const stopConf = (StopConf *)&signal->theData[0];
3263  stopConf->senderData = c_stopRec.stopReq.senderData;
3264  stopConf->nodeState = (Uint32) NodeState::SL_SINGLEUSER;
3265  sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_CONF, signal, StopConf::SignalLength, JBB);
3266 
3267  c_stopRec.stopReq.senderRef = 0; // the command is done
3268 
3269  signal->theData[0] = NDB_LE_SingleUser;
3270  signal->theData[1] = 1;
3271  signal->theData[2] = c_stopRec.stopReq.singleUserApi;
3272  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
3273  }
3274  else
3275  {
3276  jam();
3278  StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
3279  updateNodeState(signal, newState);
3280 
3281  c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
3282 
3283  signal->theData[0] = ZSHUTDOWN;
3284  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
3285  }
3286 }
3287 
3288 void Ndbcntr::execABORT_ALL_REF(Signal* signal){
3289  jamEntry();
3290 
3291  StopRef * const stopRef = (StopRef *)&signal->theData[0];
3292  stopRef->senderData = c_stopRec.stopReq.senderData;
3293  stopRef->errorCode = StopRef::TransactionAbortFailed;
3294  stopRef->masterNodeId = cmasterNodeId;
3295  sendSignal(c_stopRec.stopReq.senderRef, GSN_STOP_REF, signal, StopRef::SignalLength, JBB);
3296 }
3297 
3298 void
3299 Ndbcntr::StopRecord::checkLqhTimeout_1(Signal* signal){
3300  const Int32 timeout = stopReq.readOperationTimeout;
3301  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
3302  const NDB_TICKS now = NdbTick_CurrentMillisecond();
3303 
3304  if((timeout >= 0 && now >= alarm)){
3305  // || checkWithLqhInSomeMagicWay)
3306  jam();
3307 
3308  ChangeNodeStateReq * req = (ChangeNodeStateReq*)&signal->theData[0];
3309 
3311  StopReq::getSystemStop(stopReq.requestInfo));
3312  req->nodeState = newState;
3313  req->senderRef = cntr.reference();
3314  req->senderData = 12;
3315  cntr.sendSignal(DBLQH_REF, GSN_CHANGE_NODE_STATE_REQ, signal,
3316  ChangeNodeStateReq::SignalLength, JBB);
3317  return;
3318  }
3319  signal->theData[0] = ZSHUTDOWN;
3320  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
3321 }
3322 
3323 void
3324 Ndbcntr::execCHANGE_NODE_STATE_CONF(Signal* signal)
3325 {
3326  jamEntry();
3327 
3331  signal->theData[0] = reference();
3332  signal->theData[1] = 12;
3333  sendSignal(SUMA_REF, GSN_STOP_ME_REQ, signal, 2, JBB);
3334 }
3335 
3336 void Ndbcntr::execSTOP_ME_REF(Signal* signal){
3337  jamEntry();
3338  ndbrequire(false);
3339 }
3340 
3341 
3342 void Ndbcntr::execSTOP_ME_CONF(Signal* signal){
3343  jamEntry();
3344 
3345  const StopMeConf * conf = CAST_CONSTPTR(StopMeConf, signal->getDataPtr());
3346  if (conf->senderData == 12)
3347  {
3351  signal->theData[0] = reference();
3352  signal->theData[1] = 13;
3353  sendSignal(DBDIH_REF, GSN_STOP_ME_REQ, signal, 2, JBB);
3354  return;
3355  }
3356 
3358  StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
3359  updateNodeState(signal, newState);
3360 
3361  c_stopRec.stopInitiatedTime = NdbTick_CurrentMillisecond();
3362  signal->theData[0] = ZSHUTDOWN;
3363  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 1);
3364 }
3365 
3366 void
3367 Ndbcntr::StopRecord::checkLqhTimeout_2(Signal* signal){
3368  const Int32 timeout = stopReq.operationTimeout;
3369  const NDB_TICKS alarm = stopInitiatedTime + (NDB_TICKS)timeout;
3370  const NDB_TICKS now = NdbTick_CurrentMillisecond();
3371 
3372  if((timeout >= 0 && now >= alarm)){
3373  // || checkWithLqhInSomeMagicWay)
3374  jam();
3375  if(StopReq::getPerformRestart(stopReq.requestInfo)){
3376  jam();
3377  StartOrd * startOrd = (StartOrd *)&signal->theData[0];
3378  startOrd->restartInfo = stopReq.requestInfo;
3379  cntr.sendSignal(CMVMI_REF, GSN_START_ORD, signal, 2, JBA);
3380  } else {
3381  jam();
3382  cntr.sendSignal(CMVMI_REF, GSN_STOP_ORD, signal, 1, JBA);
3383  }
3384  return;
3385  }
3386  signal->theData[0] = ZSHUTDOWN;
3387  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
3388 }
3389 
3390 void Ndbcntr::execWAIT_GCP_REF(Signal* signal){
3391  jamEntry();
3392 
3393  //WaitGCPRef* const ref = (WaitGCPRef*)&signal->theData[0];
3394 
3395  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
3396  req->senderRef = reference();
3397  req->senderData = StopRecord::SR_CLUSTER_SHUTDOWN;
3398  req->requestType = WaitGCPReq::CompleteForceStart;
3399  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal,
3400  WaitGCPReq::SignalLength, JBB);
3401 }
3402 
3403 void Ndbcntr::execWAIT_GCP_CONF(Signal* signal){
3404  jamEntry();
3405 
3406  WaitGCPConf* conf = (WaitGCPConf*)signal->getDataPtr();
3407 
3408  switch(conf->senderData){
3409  case StopRecord::SR_BLOCK_GCP_START_GCP:
3410  {
3411  jam();
3415  if(!c_stopRec.checkNodeFail(signal))
3416  {
3417  jam();
3418  goto unblock;
3419  }
3420 
3421  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
3422  req->senderRef = reference();
3423  req->senderData = StopRecord::SR_WAIT_COMPLETE_GCP;
3424  req->requestType = WaitGCPReq::CompleteIfRunning;
3425 
3426  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal,
3427  WaitGCPReq::SignalLength, JBB);
3428  return;
3429  }
3430  case StopRecord::SR_UNBLOCK_GCP_START_GCP:
3431  {
3432  jam();
3433  return;
3434  }
3435  case StopRecord::SR_WAIT_COMPLETE_GCP:
3436  {
3437  jam();
3438  if(!c_stopRec.checkNodeFail(signal))
3439  {
3440  jam();
3441  goto unblock;
3442  }
3443 
3444  NdbNodeBitmask tmp;
3445  tmp.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
3446  c_stopRec.m_stop_req_counter = tmp;
3447  NodeReceiverGroup rg(QMGR, tmp);
3448  StopReq * stopReq = (StopReq *)&signal->theData[0];
3449  * stopReq = c_stopRec.stopReq;
3450  stopReq->senderRef = reference();
3451  sendSignal(rg, GSN_STOP_REQ, signal, StopReq::SignalLength, JBA);
3452  c_stopRec.m_state = StopRecord::SR_QMGR_STOP_REQ;
3453  return;
3454  }
3455  case StopRecord::SR_CLUSTER_SHUTDOWN:
3456  {
3457  jam();
3458  break;
3459  }
3460  }
3461 
3462  {
3463  ndbrequire(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
3464  NodeState newState(NodeState::SL_STOPPING_3, true);
3465 
3469  NodeStateRep * rep = (NodeStateRep *)&signal->theData[0];
3470  rep->nodeState = newState;
3471  rep->nodeState.masterNodeId = cmasterNodeId;
3472  rep->nodeState.setNodeGroup(c_nodeGroup);
3473  EXECUTE_DIRECT(QMGR, GSN_NODE_STATE_REP, signal,
3474  NodeStateRep::SignalLength);
3475 
3476  if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){
3477  jam();
3478  StartOrd * startOrd = (StartOrd *)&signal->theData[0];
3479  startOrd->restartInfo = c_stopRec.stopReq.requestInfo;
3480  sendSignalWithDelay(CMVMI_REF, GSN_START_ORD, signal, 500,
3481  StartOrd::SignalLength);
3482  } else {
3483  jam();
3484  sendSignalWithDelay(CMVMI_REF, GSN_STOP_ORD, signal, 500, 1);
3485  }
3486  return;
3487  }
3488 
3489 unblock:
3490  WaitGCPReq * req = (WaitGCPReq*)&signal->theData[0];
3491  req->senderRef = reference();
3492  req->senderData = StopRecord::SR_UNBLOCK_GCP_START_GCP;
3493  req->requestType = WaitGCPReq::UnblockStartGcp;
3494  sendSignal(DBDIH_REF, GSN_WAIT_GCP_REQ, signal,
3495  WaitGCPReq::SignalLength, JBB);
3496 }
3497 
3498 void
3499 Ndbcntr::execSTOP_CONF(Signal* signal)
3500 {
3501  jamEntry();
3502  StopConf *conf = (StopConf*)signal->getDataPtr();
3503  ndbrequire(c_stopRec.m_state == StopRecord::SR_QMGR_STOP_REQ);
3504  c_stopRec.m_stop_req_counter.clearWaitingFor(conf->nodeId);
3505  if (c_stopRec.m_stop_req_counter.done())
3506  {
3507  char buf[100];
3508  NdbNodeBitmask mask;
3509  mask.assign(NdbNodeBitmask::Size, c_stopRec.stopReq.nodes);
3510  infoEvent("Stopping of %s", mask.getText(buf));
3511  ndbout_c("Stopping of %s", mask.getText(buf));
3512 
3516  FailRep * const failRep = (FailRep *)&signal->theData[0];
3517  failRep->failCause = FailRep::ZMULTI_NODE_SHUTDOWN;
3518  failRep->failSourceNodeId = getOwnNodeId();
3519  NodeReceiverGroup rg(QMGR, c_clusterNodes);
3520  Uint32 nodeId = 0;
3521  while ((nodeId = NdbNodeBitmask::find(c_stopRec.stopReq.nodes, nodeId+1))
3522  != NdbNodeBitmask::NotFound)
3523  {
3524  failRep->failNodeId = nodeId;
3525  sendSignal(rg, GSN_FAIL_REP, signal, FailRep::SignalLength, JBA);
3526  }
3527  c_stopRec.m_state = StopRecord::SR_WAIT_NODE_FAILURES;
3528  return;
3529  }
3530 }
3531 
3532 void Ndbcntr::execSTTORRY(Signal* signal){
3533  jamEntry();
3534  c_missra.execSTTORRY(signal);
3535 }
3536 
3537 void Ndbcntr::execREAD_CONFIG_CONF(Signal* signal){
3538  jamEntry();
3539  c_missra.execREAD_CONFIG_CONF(signal);
3540 }
3541 
3542 void Ndbcntr::execSTART_ORD(Signal* signal){
3543  jamEntry();
3544  c_missra.execSTART_ORD(signal);
3545 }
3546 
3547 #define CLEAR_DX 13
3548 #define CLEAR_LCP 3
3549 #define CLEAR_DD 2
3550 // FileSystemPathDataFiles FileSystemPathUndoFiles
3551 
3552 void
3553 Ndbcntr::clearFilesystem(Signal* signal)
3554 {
3555  jam();
3556  FsRemoveReq * req = (FsRemoveReq *)signal->getDataPtrSend();
3557  req->userReference = reference();
3558  req->userPointer = 0;
3559  req->directory = 1;
3560  req->ownDirectory = 1;
3561 
3562  const Uint32 DX = CLEAR_DX;
3563  const Uint32 LCP = CLEAR_DX + CLEAR_LCP;
3564  const Uint32 DD = CLEAR_DX + CLEAR_LCP + CLEAR_DD;
3565 
3566  if (c_fsRemoveCount < DX)
3567  {
3568  FsOpenReq::setVersion(req->fileNumber, 3);
3569  FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL); // Can by any...
3570  FsOpenReq::v1_setDisk(req->fileNumber, c_fsRemoveCount);
3571  }
3572  else if (c_fsRemoveCount < LCP)
3573  {
3574  FsOpenReq::setVersion(req->fileNumber, 5);
3575  FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
3576  FsOpenReq::v5_setLcpNo(req->fileNumber, c_fsRemoveCount - CLEAR_DX);
3577  FsOpenReq::v5_setTableId(req->fileNumber, 0);
3578  FsOpenReq::v5_setFragmentId(req->fileNumber, 0);
3579  }
3580  else if (c_fsRemoveCount < DD)
3581  {
3582  req->ownDirectory = 0;
3583  FsOpenReq::setVersion(req->fileNumber, 6);
3584  FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
3585  FsOpenReq::v5_setLcpNo(req->fileNumber,
3586  FsOpenReq::BP_DD_DF + c_fsRemoveCount - LCP);
3587  }
3588  else
3589  {
3590  ndbrequire(false);
3591  }
3592 
3593  sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal,
3594  FsRemoveReq::SignalLength, JBA);
3595  c_fsRemoveCount++;
3596 }
3597 
3598 void
3599 Ndbcntr::execFSREMOVECONF(Signal* signal){
3600  jamEntry();
3601  if(c_fsRemoveCount == CLEAR_DX + CLEAR_LCP + CLEAR_DD){
3602  jam();
3603  sendSttorry(signal);
3604  } else {
3605  jam();
3606  ndbrequire(c_fsRemoveCount < CLEAR_DX + CLEAR_LCP + CLEAR_DD);
3607  clearFilesystem(signal);
3608  }//if
3609 }
3610 
3611 void Ndbcntr::Missra::execSTART_ORD(Signal* signal){
3612  signal->theData[0] = NDB_LE_NDBStartStarted;
3613  signal->theData[1] = NDB_VERSION;
3614  signal->theData[2] = NDB_MYSQL_VERSION_D;
3615  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
3616 
3617  currentBlockIndex = 0;
3618  sendNextREAD_CONFIG_REQ(signal);
3619 }
3620 
3621 void Ndbcntr::Missra::sendNextREAD_CONFIG_REQ(Signal* signal){
3622 
3623  if(currentBlockIndex < ALL_BLOCKS_SZ){
3624  jam();
3625 
3626  ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtrSend();
3627  req->senderData = 0;
3628  req->senderRef = cntr.reference();
3629  req->noOfParameters = 0;
3630 
3631  const BlockReference ref = readConfigOrder[currentBlockIndex];
3632 
3633 #if 0
3634  ndbout_c("sending READ_CONFIG_REQ to %s(ref=%x index=%d)",
3635  getBlockName( refToBlock(ref)),
3636  ref,
3637  currentBlockIndex);
3638 #endif
3639 
3643  cntr.sendSignalWithDelay(ref, GSN_READ_CONFIG_REQ, signal,
3644  1, ReadConfigReq::SignalLength);
3645  return;
3646  }
3647 
3651  currentStartPhase = 0;
3652  for(Uint32 i = 0; i<ALL_BLOCKS_SZ; i++){
3653  if(ALL_BLOCKS[i].NextSP < currentStartPhase)
3654  currentStartPhase = ALL_BLOCKS[i].NextSP;
3655  }
3656 
3657  currentBlockIndex = 0;
3658  sendNextSTTOR(signal);
3659 }
3660 
3661 void Ndbcntr::Missra::execREAD_CONFIG_CONF(Signal* signal){
3662  const ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtr();
3663 
3664  const Uint32 ref = conf->senderRef;
3665  ndbrequire(refToBlock(readConfigOrder[currentBlockIndex])
3666  == refToBlock(ref));
3667 
3668  currentBlockIndex++;
3669  sendNextREAD_CONFIG_REQ(signal);
3670 }
3671 
3672 void Ndbcntr::Missra::execSTTORRY(Signal* signal){
3673  const BlockReference ref = signal->senderBlockRef();
3674  ndbrequire(refToBlock(ref) == refToBlock(ALL_BLOCKS[currentBlockIndex].Ref));
3675 
3679  for (Uint32 i = 3; i < 25; i++){
3680  jam();
3681  if (signal->theData[i] > currentStartPhase){
3682  jam();
3683  ALL_BLOCKS[currentBlockIndex].NextSP = signal->theData[i];
3684  break;
3685  }
3686  }
3687 
3688  currentBlockIndex++;
3689  sendNextSTTOR(signal);
3690 }
3691 
3692 void Ndbcntr::Missra::sendNextSTTOR(Signal* signal){
3693 
3694  for(; currentStartPhase < 255 ;
3695  currentStartPhase++, g_currentStartPhase = currentStartPhase){
3696  jam();
3697 
3698 #ifdef ERROR_INSERT
3699  if (cntr.cerrorInsert == 1002 &&
3700  cntr.c_error_insert_extra == currentStartPhase)
3701  {
3702  signal->theData[0] = ZBLOCK_STTOR;
3703  cntr.sendSignalWithDelay(cntr.reference(), GSN_CONTINUEB, signal, 100, 1);
3704  return;
3705  }
3706 #endif
3707 
3708  const Uint32 start = currentBlockIndex;
3709  for(; currentBlockIndex < ALL_BLOCKS_SZ; currentBlockIndex++){
3710  jam();
3711  if(ALL_BLOCKS[currentBlockIndex].NextSP == currentStartPhase){
3712  jam();
3713  signal->theData[0] = 0;
3714  signal->theData[1] = currentStartPhase;
3715  signal->theData[2] = 0;
3716  signal->theData[3] = 0;
3717  signal->theData[4] = 0;
3718  signal->theData[5] = 0;
3719  signal->theData[6] = 0;
3720  signal->theData[7] = cntr.ctypeOfStart;
3721 
3722  const BlockReference ref = ALL_BLOCKS[currentBlockIndex].Ref;
3723 
3724 #ifdef MAX_STARTPHASE
3725  ndbrequire(currentStartPhase <= MAX_STARTPHASE);
3726 #endif
3727 
3728 #ifdef TRACE_STTOR
3729  ndbout_c("sending STTOR(%d) to %s(ref=%x index=%d)",
3730  currentStartPhase,
3731  getBlockName( refToBlock(ref)),
3732  ref,
3733  currentBlockIndex);
3734 #endif
3735  if (refToBlock(ref) == DBDIH)
3736  signal->theData[7] = cntr.cdihStartType;
3737 
3738  cntr.sendSignal(ref, GSN_STTOR, signal, 8, JBB);
3739 
3740  return;
3741  }
3742  }
3743 
3744  currentBlockIndex = 0;
3745 
3746  NodeState newState(NodeState::SL_STARTING, currentStartPhase,
3747  (NodeState::StartType)cntr.ctypeOfStart);
3748  cntr.updateNodeState(signal, newState);
3749 
3750  if(start != 0)
3751  {
3755  jam();
3756  g_eventLogger->info("Start phase %u completed", currentStartPhase);
3757 
3758  signal->theData[0] = NDB_LE_StartPhaseCompleted;
3759  signal->theData[1] = currentStartPhase;
3760  signal->theData[2] = cntr.ctypeOfStart;
3761  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
3762 
3771  if (cntr.wait_sp(signal, currentStartPhase + 1))
3772  {
3773  jam();
3774  currentStartPhase++;
3775  g_currentStartPhase = currentStartPhase;
3776  return;
3777  }
3778  }
3779  }
3780 
3781  g_eventLogger->info("Node started");
3782 
3783  signal->theData[0] = NDB_LE_NDBStartCompleted;
3784  signal->theData[1] = NDB_VERSION;
3785  signal->theData[2] = NDB_MYSQL_VERSION_D;
3786  cntr.sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);
3787 
3788  NodeState newState(NodeState::SL_STARTED);
3789  cntr.updateNodeState(signal, newState);
3790 
3791  NodeReceiverGroup rg(NDBCNTR, cntr.c_clusterNodes);
3792  signal->theData[0] = cntr.getOwnNodeId();
3793  cntr.sendSignal(rg, GSN_CNTR_START_REP, signal, 1, JBB);
3794 }
3795 
3796 void
3797 Ndbcntr::execCREATE_NODEGROUP_IMPL_REQ(Signal* signal)
3798 {
3799  jamEntry();
3800 
3801  CreateNodegroupImplReq reqCopy = *(CreateNodegroupImplReq*)signal->getDataPtr();
3802  CreateNodegroupImplReq *req = &reqCopy;
3803 
3804  if (req->requestType == CreateNodegroupImplReq::RT_COMMIT)
3805  {
3806  jam();
3807  Uint32 save = c_nodeGroup;
3808  getNodeGroup(signal);
3809  if (save != c_nodeGroup)
3810  {
3811  jam();
3812  updateNodeState(signal, getNodeState());
3813  }
3814  }
3815 
3816  {
3817  CreateNodegroupImplConf* conf = (CreateNodegroupImplConf*)signal->getDataPtrSend();
3818  conf->senderRef = reference();
3819  conf->senderData = req->senderData;
3820  sendSignal(req->senderRef, GSN_CREATE_NODEGROUP_IMPL_CONF, signal,
3821  CreateNodegroupImplConf::SignalLength, JBB);
3822  }
3823 }
3824 
3825 void
3826 Ndbcntr::execDROP_NODEGROUP_IMPL_REQ(Signal* signal)
3827 {
3828  jamEntry();
3829 
3830  DropNodegroupImplReq reqCopy = *(DropNodegroupImplReq*)signal->getDataPtr();
3831  DropNodegroupImplReq *req = &reqCopy;
3832 
3833  if (req->requestType == DropNodegroupImplReq::RT_COMPLETE)
3834  {
3835  jam();
3836  Uint32 save = c_nodeGroup;
3837  getNodeGroup(signal);
3838 
3839  if (save != c_nodeGroup)
3840  {
3841  jam();
3842  updateNodeState(signal, getNodeState());
3843  }
3844  }
3845 
3846  {
3847  DropNodegroupImplConf* conf = (DropNodegroupImplConf*)signal->getDataPtrSend();
3848  conf->senderRef = reference();
3849  conf->senderData = req->senderData;
3850  sendSignal(req->senderRef, GSN_DROP_NODEGROUP_IMPL_CONF, signal,
3851  DropNodegroupImplConf::SignalLength, JBB);
3852  }
3853 }
3854 
3855 template class Vector<ddentry>;