📄 ndbcntrmain.cpp
字号:
/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#define NDBCNTR_C#include "Ndbcntr.hpp"#include <ndb_limits.h>#include <ndb_version.h>#include <SimpleProperties.hpp>#include <signaldata/DictTabInfo.hpp>#include <signaldata/CreateTable.hpp>#include <signaldata/ReadNodesConf.hpp>#include <signaldata/NodeFailRep.hpp>#include <signaldata/TcKeyReq.hpp>#include <signaldata/TcKeyConf.hpp>#include <signaldata/EventReport.hpp>#include <signaldata/NodeStateSignalData.hpp>#include <signaldata/StopPerm.hpp>#include <signaldata/StopMe.hpp>#include <signaldata/WaitGCP.hpp>#include <signaldata/CheckNodeGroups.hpp>#include <signaldata/StartOrd.hpp>#include <signaldata/AbortAll.hpp>#include <signaldata/SystemError.hpp>#include <signaldata/NdbSttor.hpp>#include <signaldata/CntrStart.hpp>#include <signaldata/DumpStateOrd.hpp>#include <signaldata/FsRemoveReq.hpp>#include <signaldata/ReadConfig.hpp>#include <signaldata/FailRep.hpp>#include <AttributeHeader.hpp>#include <Configuration.hpp>#include <DebuggerNames.hpp>#include <NdbOut.hpp>#include <NdbTick.h>// used during shutdown for reporting current startphase// accessed from Emulator.cpp, NdbShutdown()Uint32 g_currentStartPhase;/** * ALL_BLOCKS Used during start phases and while changing node state * * NDBFS_REF Has to be before NDBCNTR_REF (due to "ndb -i" stuff) */struct BlockInfo { BlockReference Ref; // BlockReference Uint32 NextSP; // Next start phase Uint32 ErrorInsertStart; Uint32 ErrorInsertStop;};static BlockInfo ALL_BLOCKS[] = { { DBTC_REF, 1 , 8000, 8035 }, { DBDIH_REF, 1 , 7000, 7173 }, { DBLQH_REF, 1 , 5000, 5030 }, { DBACC_REF, 1 , 3000, 3999 }, { DBTUP_REF, 1 , 4000, 4007 }, { DBDICT_REF, 1 , 6000, 6003 }, { NDBFS_REF, 0 , 2000, 2999 }, { NDBCNTR_REF, 0 , 1000, 1999 }, { QMGR_REF, 1 , 1, 999 }, { CMVMI_REF, 1 , 9000, 9999 }, { TRIX_REF, 1 , 0, 0 }, { BACKUP_REF, 1 , 10000, 10999 }, { DBUTIL_REF, 1 , 11000, 11999 }, { SUMA_REF, 1 , 13000, 13999 }, { DBTUX_REF, 1 , 12000, 12999 }};static const Uint32 ALL_BLOCKS_SZ = sizeof(ALL_BLOCKS)/sizeof(BlockInfo);static BlockReference readConfigOrder[ALL_BLOCKS_SZ] = { DBTUP_REF, DBACC_REF, DBTC_REF, DBLQH_REF, DBTUX_REF, DBDICT_REF, DBDIH_REF, NDBFS_REF, NDBCNTR_REF, QMGR_REF, CMVMI_REF, TRIX_REF, BACKUP_REF, DBUTIL_REF, SUMA_REF};/*******************************//* CONTINUEB *//*******************************/void Ndbcntr::execCONTINUEB(Signal* signal) { jamEntry(); UintR Ttemp1 = signal->theData[0]; switch (Ttemp1) { case ZSTARTUP:{ if(getNodeState().startLevel == NodeState::SL_STARTED){ jam(); return; } if(cmasterNodeId == getOwnNodeId() && c_start.m_starting.isclear()){ jam(); trySystemRestart(signal); // Fall-through } Uint64 now = NdbTick_CurrentMillisecond(); if(now > c_start.m_startFailureTimeout) { jam(); Uint32 to_3= 0; const ndb_mgm_configuration_iterator * p = theConfiguration.getOwnConfigIterator(); ndb_mgm_get_int_parameter(p, CFG_DB_START_FAILURE_TIMEOUT, &to_3); BaseString tmp; tmp.append("Shutting down node as total restart time exceeds " " StartFailureTimeout as set in config file "); if(to_3 == 0) tmp.append(" 0 (inifinite)"); else tmp.appfmt(" %d", to_3); progError(__LINE__, NDBD_EXIT_RESTART_TIMEOUT, tmp.c_str()); } signal->theData[0] = ZSTARTUP; sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 1); break; } case ZSHUTDOWN: jam(); c_stopRec.checkTimeout(signal); break; default: jam(); systemErrorLab(signal, __LINE__); return; break; }//switch}//Ndbcntr::execCONTINUEB()/*******************************//* SYSTEM_ERROR *//*******************************/void Ndbcntr::execSYSTEM_ERROR(Signal* signal) { const SystemError * const sysErr = (SystemError *)signal->getDataPtr(); char buf[100]; int killingNode = refToNode(sysErr->errorRef); Uint32 data1 = sysErr->data1; jamEntry(); switch (sysErr->errorCode){ case SystemError::GCPStopDetected: BaseString::snprintf(buf, sizeof(buf), "Node %d killed this node because " "GCP stop was detected", killingNode); break; case SystemError::CopyFragRefError: BaseString::snprintf(buf, sizeof(buf), "Node %d killed this node because " "it could not copy a fragment during node restart. " "Copy fragment error code: %u.", killingNode, data1); break; default: BaseString::snprintf(buf, sizeof(buf), "System error %d, " " this node was killed by node %d", sysErr->errorCode, killingNode); break; } progError(__LINE__, NDBD_EXIT_SYSTEM_ERROR, buf); return;}//Ndbcntr::execSYSTEM_ERROR()void Ndbcntr::execREAD_CONFIG_REQ(Signal* signal){ jamEntry(); const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr(); Uint32 ref = req->senderRef; Uint32 senderData = req->senderData; const ndb_mgm_configuration_iterator * p = theConfiguration.getOwnConfigIterator(); ndbrequire(p != 0); ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend(); conf->senderRef = reference(); conf->senderData = senderData; sendSignal(ref, GSN_READ_CONFIG_CONF, signal, ReadConfigConf::SignalLength, JBB);}void Ndbcntr::execSTTOR(Signal* signal) { jamEntry(); cstartPhase = signal->theData[1]; NodeState newState(NodeState::SL_STARTING, cstartPhase, (NodeState::StartType)ctypeOfStart); updateNodeState(signal, newState); cndbBlocksCount = 0; cinternalStartphase = cstartPhase - 1; switch (cstartPhase) { case 0: if(theConfiguration.getInitialStart()){ jam(); c_fsRemoveCount = 0; clearFilesystem(signal); return; } sendSttorry(signal); break; case ZSTART_PHASE_1: jam(); startPhase1Lab(signal); break; case ZSTART_PHASE_2: jam(); startPhase2Lab(signal); break; case ZSTART_PHASE_3: jam(); startPhase3Lab(signal); break; case ZSTART_PHASE_4: jam(); startPhase4Lab(signal); break; case ZSTART_PHASE_5: jam(); startPhase5Lab(signal); break; case 6: jam(); getNodeGroup(signal); // Fall through break; case ZSTART_PHASE_8: jam(); startPhase8Lab(signal); break; case ZSTART_PHASE_9: jam(); startPhase9Lab(signal); break; default: jam(); sendSttorry(signal); break; }//switch}//Ndbcntr::execSTTOR()voidNdbcntr::getNodeGroup(Signal* signal){ jam(); CheckNodeGroups * sd = (CheckNodeGroups*)signal->getDataPtrSend(); sd->requestType = CheckNodeGroups::Direct | CheckNodeGroups::GetNodeGroup; EXECUTE_DIRECT(DBDIH, GSN_CHECKNODEGROUPSREQ, signal, CheckNodeGroups::SignalLength); jamEntry(); c_nodeGroup = sd->output; sendSttorry(signal);}/*******************************//* NDB_STTORRY *//*******************************/void Ndbcntr::execNDB_STTORRY(Signal* signal) { jamEntry(); switch (cstartPhase) { case ZSTART_PHASE_2: jam(); ph2GLab(signal); return; break; case ZSTART_PHASE_3: jam(); ph3ALab(signal); return; break; case ZSTART_PHASE_4: jam(); ph4BLab(signal); return; break; case ZSTART_PHASE_5: jam(); ph5ALab(signal); return; break; case ZSTART_PHASE_6: jam(); ph6ALab(signal); return; break; case ZSTART_PHASE_7: jam(); ph6BLab(signal); return; break; case ZSTART_PHASE_8: jam(); ph7ALab(signal); return; break; case ZSTART_PHASE_9: jam(); ph8ALab(signal); return; break; default: jam(); systemErrorLab(signal, __LINE__); return; break; }//switch}//Ndbcntr::execNDB_STTORRY()void Ndbcntr::startPhase1Lab(Signal* signal) { jamEntry(); initData(signal); cdynamicNodeId = 0; NdbBlocksRecPtr ndbBlocksPtr; ndbBlocksPtr.i = 0; ptrAss(ndbBlocksPtr, ndbBlocksRec); ndbBlocksPtr.p->blockref = DBLQH_REF; ndbBlocksPtr.i = 1; ptrAss(ndbBlocksPtr, ndbBlocksRec); ndbBlocksPtr.p->blockref = DBDICT_REF; ndbBlocksPtr.i = 2; ptrAss(ndbBlocksPtr, ndbBlocksRec); ndbBlocksPtr.p->blockref = DBTUP_REF; ndbBlocksPtr.i = 3; ptrAss(ndbBlocksPtr, ndbBlocksRec); ndbBlocksPtr.p->blockref = DBACC_REF; ndbBlocksPtr.i = 4; ptrAss(ndbBlocksPtr, ndbBlocksRec); ndbBlocksPtr.p->blockref = DBTC_REF; ndbBlocksPtr.i = 5; ptrAss(ndbBlocksPtr, ndbBlocksRec); ndbBlocksPtr.p->blockref = DBDIH_REF; sendSttorry(signal); return;}void Ndbcntr::execREAD_NODESREF(Signal* signal) { jamEntry(); systemErrorLab(signal, __LINE__); return;}//Ndbcntr::execREAD_NODESREF()/*******************************//* NDB_STARTREF *//*******************************/void Ndbcntr::execNDB_STARTREF(Signal* signal) { jamEntry(); systemErrorLab(signal, __LINE__); return;}//Ndbcntr::execNDB_STARTREF()/*******************************//* STTOR *//*******************************/void Ndbcntr::startPhase2Lab(Signal* signal) { c_start.m_lastGci = 0; c_start.m_lastGciNodeId = getOwnNodeId(); signal->theData[0] = reference(); sendSignal(DBDIH_REF, GSN_DIH_RESTARTREQ, signal, 1, JBB); return;}//Ndbcntr::startPhase2Lab()/*******************************//* DIH_RESTARTCONF *//*******************************/void Ndbcntr::execDIH_RESTARTCONF(Signal* signal) { jamEntry(); //cmasterDihId = signal->theData[0]; c_start.m_lastGci = signal->theData[1]; ctypeOfStart = NodeState::ST_SYSTEM_RESTART; ph2ALab(signal); return;}//Ndbcntr::execDIH_RESTARTCONF()/*******************************//* DIH_RESTARTREF *//*******************************/void Ndbcntr::execDIH_RESTARTREF(Signal* signal) { jamEntry(); ctypeOfStart = NodeState::ST_INITIAL_START; ph2ALab(signal); return;}//Ndbcntr::execDIH_RESTARTREF()void Ndbcntr::ph2ALab(Signal* signal) { /******************************/ /* request configured nodes */ /* from QMGR */ /* READ_NODESREQ */ /******************************/ signal->theData[0] = reference(); sendSignal(QMGR_REF, GSN_READ_NODESREQ, signal, 1, JBB); return;}//Ndbcntr::ph2ALab()inlineUint64setTimeout(Uint64 time, Uint32 timeoutValue){ if(timeoutValue == 0) return ~(Uint64)0; return time + timeoutValue;}/*******************************//* READ_NODESCONF *//*******************************/void Ndbcntr::execREAD_NODESCONF(Signal* signal)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -