diff options
Diffstat (limited to 'ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp')
-rw-r--r-- | ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp | 386 |
1 files changed, 123 insertions, 263 deletions
diff --git a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp index cd6198eff23..7eb7f995eb7 100644 --- a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +++ b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp @@ -16,7 +16,6 @@ #include "Cmvmi.hpp" -#include <ClusterConfiguration.hpp> #include <Configuration.hpp> #include <kernel_types.h> #include <TransporterRegistry.hpp> @@ -31,15 +30,11 @@ #include <signaldata/TestOrd.hpp> #include <signaldata/EventReport.hpp> #include <signaldata/TamperOrd.hpp> -#include <signaldata/SetVarReq.hpp> #include <signaldata/StartOrd.hpp> -#include <signaldata/CmvmiCfgConf.hpp> -#include <signaldata/CmInit.hpp> #include <signaldata/CloseComReqConf.hpp> #include <signaldata/SetLogLevelOrd.hpp> #include <signaldata/EventSubscribeReq.hpp> #include <signaldata/DumpStateOrd.hpp> -#include <signaldata/ArbitSignalData.hpp> #include <signaldata/DisconnectRep.hpp> #include <EventLogger.hpp> @@ -55,8 +50,7 @@ EventLogger g_eventLogger; Cmvmi::Cmvmi(const Configuration & conf) : SimulatedBlock(CMVMI, conf) ,theConfig((Configuration&)conf) - ,theCConfig(conf.clusterConfiguration()), - subscribers(subscriberPool) + ,subscribers(subscriberPool) { BLOCK_CONSTRUCTOR(Cmvmi); @@ -67,14 +61,10 @@ Cmvmi::Cmvmi(const Configuration & conf) : addRecSignal(GSN_NDB_TAMPER, &Cmvmi::execNDB_TAMPER, true); addRecSignal(GSN_SET_LOGLEVELORD, &Cmvmi::execSET_LOGLEVELORD); addRecSignal(GSN_EVENT_REP, &Cmvmi::execEVENT_REP); - addRecSignal(GSN_STTOR, &Cmvmi::execSTTOR_Local); - addRecSignal(GSN_CM_RUN, &Cmvmi::execCM_RUN); - addRecSignal(GSN_CM_INFOREQ, &Cmvmi::execCM_INFOREQ); - addRecSignal(GSN_CMVMI_CFGREQ, &Cmvmi::execCMVMI_CFGREQ); + addRecSignal(GSN_STTOR, &Cmvmi::execSTTOR); addRecSignal(GSN_CLOSE_COMREQ, &Cmvmi::execCLOSE_COMREQ); addRecSignal(GSN_ENABLE_COMORD, &Cmvmi::execENABLE_COMORD); addRecSignal(GSN_OPEN_COMREQ, &Cmvmi::execOPEN_COMREQ); - addRecSignal(GSN_SIZEALT_ACK, &Cmvmi::execSIZEALT_ACK); addRecSignal(GSN_TEST_ORD, &Cmvmi::execTEST_ORD); addRecSignal(GSN_STATISTICS_REQ, &Cmvmi::execSTATISTICS_REQ); @@ -93,16 +83,28 @@ Cmvmi::Cmvmi(const Configuration & conf) : subscriberPool.setSize(5); - const ClusterConfiguration::ClusterData & clData = - theConfig.clusterConfigurationData() ; + const ndb_mgm_configuration_iterator * db = theConfig.getOwnConfigIterator(); + for(unsigned j = 0; j<LogLevel::LOGLEVEL_CATEGORIES; j++){ + Uint32 logLevel; + if(!ndb_mgm_get_int_parameter(db, LogLevel::MIN_LOGLEVEL_ID+j, &logLevel)){ + clogLevel.setLogLevel((LogLevel::EventCategory)j, + logLevel); + } + } - clogLevel = clData.SizeAltData.logLevel; - - for(Uint32 i= 0; i< clData.SizeAltData.noOfNodes; i++ ){ + ndb_mgm_configuration_iterator * iter = theConfig.getClusterConfigIterator(); + for(ndb_mgm_first(iter); ndb_mgm_valid(iter); ndb_mgm_next(iter)){ jam(); - const Uint32 nodeId = clData.nodeData[i].nodeId; - switch(clData.nodeData[i].nodeType){ + Uint32 nodeId; + Uint32 nodeType; + + ndbrequire(!ndb_mgm_get_int_parameter(iter,CFG_NODE_ID, &nodeId)); + ndbrequire(!ndb_mgm_get_int_parameter(iter,CFG_TYPE_OF_SECTION,&nodeType)); + + switch(nodeType){ case NodeInfo::DB: + c_dbNodes.set(nodeId); + break; case NodeInfo::API: case NodeInfo::MGM: case NodeInfo::REP: @@ -110,7 +112,7 @@ Cmvmi::Cmvmi(const Configuration & conf) : default: ndbrequire(false); } - setNodeInfo(nodeId).m_type = clData.nodeData[i].nodeType; + setNodeInfo(nodeId).m_type = nodeType; } } @@ -278,121 +280,42 @@ Cmvmi::cancelSubscription(NodeId nodeId){ void Cmvmi::sendSTTORRY(Signal* signal) { - if( theStartPhase == 1 ) { - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData() ; - const int myNodeId = globalData.ownId; - int MyNodeFound = 0; - - jam(); - - CmInit * const cmInit = (CmInit *)&signal->theData[0]; - - cmInit->heartbeatDbDb = clusterConf.ispValues[0][2]; - cmInit->heartbeatDbApi = clusterConf.ispValues[0][3]; - cmInit->arbitTimeout = clusterConf.ispValues[0][5]; - - NodeBitmask::clear(cmInit->allNdbNodes); - for(unsigned int i = 0; i < clusterConf.SizeAltData.noOfNodes; i++ ) { - jam(); - if (clusterConf.nodeData[i].nodeType == NodeInfo::DB){ - jam(); - const NodeId nodeId = clusterConf.nodeData[i].nodeId; - if (nodeId == myNodeId) { - jam(); - MyNodeFound = 1; - }//if - NodeBitmask::set(cmInit->allNdbNodes, nodeId); - }//if - }//for - - if (MyNodeFound == 0) { - ERROR_SET(fatal, ERR_NODE_NOT_IN_CONFIG, "", ""); - }//if - - sendSignal(QMGR_REF, GSN_CM_INIT, signal, CmInit::SignalLength, JBB); - - // these do not fit into CM_INIT - ArbitSignalData* const sd = (ArbitSignalData*)&signal->theData[0]; - for (unsigned rank = 1; rank <= 2; rank++) { - sd->sender = myNodeId; - sd->code = rank; - sd->node = 0; - sd->ticket.clear(); - sd->mask.clear(); - for (int i = 0; i < MAX_NODES; i++) { - if (clusterConf.nodeData[i].arbitRank == rank) - sd->mask.set(clusterConf.nodeData[i].nodeId); - } - sendSignal(QMGR_REF, GSN_ARBIT_CFG, signal, - ArbitSignalData::SignalLength, JBB); - } - } else { - jam(); - signal->theData[0] = theSignalKey; - signal->theData[3] = 1; - signal->theData[4] = 3; - signal->theData[5] = 255; - sendSignal(NDBCNTR_REF, GSN_STTORRY, signal,6, JBB); - } + jam(); + signal->theData[3] = 1; + signal->theData[4] = 3; + signal->theData[5] = 8; + signal->theData[6] = 255; + sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 7, JBB); }//Cmvmi::sendSTTORRY -// Received a restart signal. -// Answer it like any other block -// PR0 : StartCase -// DR0 : StartPhase -// DR1 : ? -// DR2 : ? -// DR3 : ? -// DR4 : ? -// DR5 : SignalKey - -void Cmvmi::execSTTOR_Local(Signal* signal) +void Cmvmi::execSTTOR(Signal* signal) { - theStartPhase = signal->theData[1]; - theSignalKey = signal->theData[6]; + Uint32 theStartPhase = signal->theData[1]; - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData(); jamEntry(); - if (theStartPhase == 1 && clusterConf.SizeAltData.exist == true){ + if (theStartPhase == 1){ jam(); - signalCount = 0; - execSIZEALT_ACK(signal); + sendSTTORRY(signal); return; } else if (theStartPhase == 3) { jam(); globalData.activateSendPacked = 1; sendSTTORRY(signal); - } else { - jam(); + } else if (theStartPhase == 8){ + /*---------------------------------------------------*/ + /* Open com to API + REP nodes */ + /*---------------------------------------------------*/ + signal->theData[0] = 0; // no answer + signal->theData[1] = 0; // no id + signal->theData[2] = NodeInfo::API; + execOPEN_COMREQ(signal); + signal->theData[0] = 0; // no answer + signal->theData[1] = 0; // no id + signal->theData[2] = NodeInfo::REP; + execOPEN_COMREQ(signal); + globalData.theStartLevel = NodeState::SL_STARTED; sendSTTORRY(signal); - } -} - -void Cmvmi::execSIZEALT_ACK(Signal* signal) -{ - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData(); - jamEntry(); - - if (signalCount < NDB_SIZEALT_OFF){ - jam(); - BlockNumber blockNo = clusterConf.SizeAltData.blockNo[signalCount]; - signal->theData[0] = CMVMI_REF; - - /** - * This send SizeAlt(s) to blocks - * Definition of data content can be found in SignalData/XXXSizeAltReq.H - */ - const unsigned int noOfWords = 20; - for(unsigned int i = 1; i<noOfWords; i++){ - signal->theData[i] = clusterConf.SizeAltData.varSize[signalCount][i].nrr; - } - - signalCount++; - sendSignal(numberToRef(blockNo, 0), GSN_SIZEALT_REP, signal,21, JBB); } else { jam(); @@ -408,90 +331,6 @@ void Cmvmi::execSIZEALT_ACK(Signal* signal) } } -void Cmvmi::execCM_INFOREQ(Signal* signal) -{ - int id = signal->theData[1]; - const BlockReference userRef = signal->theData[0]; - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData(); - const int myNodeId = globalData.ownId; - - jamEntry(); - signal->theData[0] = id; - - for(unsigned int i= 0; i< clusterConf.SizeAltData.noOfNodes; i++ ) { - jam(); - if (clusterConf.nodeData[i].nodeType == NodeInfo::DB){ - NodeId nodeId = clusterConf.nodeData[i].nodeId; - if (nodeId != myNodeId) { - jam(); - globalTransporterRegistry.setPerformState(nodeId, PerformConnect); - } - } - } - - sendSignal(userRef, GSN_CM_INFOCONF, signal, 1, JBB); -} - -void Cmvmi::execCM_RUN(Signal* signal) -{ - jamEntry(); - if (signal->theData[0] == 0) { - jam(); - signal->theData[0] = theSignalKey; - signal->theData[3] = 1; - signal->theData[4] = 3; - signal->theData[5] = 255; - sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 6, JBB); - } else { - globalData.theStartLevel = NodeState::SL_STARTED; - - // Connect to all application nodes. - // Enable communication with all NDB blocks. - - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData(); - jam(); - for(unsigned int i= 0; i< clusterConf.SizeAltData.noOfNodes; i++ ) { - NodeId nodeId = clusterConf.nodeData[i].nodeId; - jam(); - if (clusterConf.nodeData[i].nodeType != NodeInfo::DB && - clusterConf.nodeData[i].nodeType != NodeInfo::MGM){ - - jam(); - globalTransporterRegistry.setPerformState(nodeId, PerformConnect); - globalTransporterRegistry.setIOState(nodeId, HaltIO); - //----------------------------------------------------- - // Report that the connection to the node is opened - //----------------------------------------------------- - signal->theData[0] = EventReport::CommunicationOpened; - signal->theData[1] = clusterConf.nodeData[i].nodeId; - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); - //----------------------------------------------------- - } - } - } -} - -void Cmvmi::execCMVMI_CFGREQ(Signal* signal) -{ - const BlockReference userRef = signal->theData[0]; - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData(); - - int theStart_phase = signal->theData[1]; - - jamEntry(); - - CmvmiCfgConf * const cfgConf = (CmvmiCfgConf *)&signal->theData[0]; - - cfgConf->startPhase = theStart_phase; - for(unsigned int i = 0; i<CmvmiCfgConf::NO_OF_WORDS; i++) - cfgConf->theData[i] = clusterConf.ispValues[theStart_phase][i]; - - sendSignal(userRef, GSN_CMVMI_CFGCONF, signal, CmvmiCfgConf::LENGTH,JBB ); -} - void Cmvmi::execCLOSE_COMREQ(Signal* signal) { // Close communication with the node and halt input/output from @@ -540,21 +379,42 @@ void Cmvmi::execOPEN_COMREQ(Signal* signal) const BlockReference userRef = signal->theData[0]; Uint32 tStartingNode = signal->theData[1]; - + Uint32 tData2 = signal->theData[2]; jamEntry(); + + const Uint32 len = signal->getLength(); + if(len == 2){ + globalTransporterRegistry.setPerformState(tStartingNode, PerformConnect); + globalTransporterRegistry.setIOState(tStartingNode, HaltIO); + + //----------------------------------------------------- + // Report that the connection to the node is opened + //----------------------------------------------------- + signal->theData[0] = EventReport::CommunicationOpened; + signal->theData[1] = tStartingNode; + sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); + //----------------------------------------------------- + } else { + for(unsigned int i = 1; i < MAX_NODES; i++ ) { + jam(); + if (i != getOwnNodeId() && getNodeInfo(i).m_type == tData2){ + jam(); + globalTransporterRegistry.setPerformState(i, PerformConnect); + globalTransporterRegistry.setIOState(i, HaltIO); + + signal->theData[0] = EventReport::CommunicationOpened; + signal->theData[1] = i; + sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); + } + } + } + if (userRef != 0) { jam(); - signal->theData[0] = signal->theData[1]; - sendSignal(userRef, GSN_OPEN_COMCONF, signal, 2,JBA); + signal->theData[0] = tStartingNode; + signal->theData[1] = tData2; + sendSignal(userRef, GSN_OPEN_COMCONF, signal, len - 1,JBA); } - globalTransporterRegistry.setPerformState(tStartingNode, PerformConnect); - //----------------------------------------------------- - // Report that the connection to the node is opened - //----------------------------------------------------- - signal->theData[0] = EventReport::CommunicationOpened; - signal->theData[1] = tStartingNode; - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); - //----------------------------------------------------- } void Cmvmi::execENABLE_COMORD(Signal* signal) @@ -888,18 +748,11 @@ Cmvmi::execSTART_ORD(Signal* signal) { /** * Open connections to management servers */ - - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData() ; - - for(unsigned int i= 0; i < clusterConf.SizeAltData.noOfNodes; i++ ){ - NodeId nodeId = clusterConf.nodeData[i].nodeId; - - if (clusterConf.nodeData[i].nodeType == NodeInfo::MGM){ - - if(globalTransporterRegistry.performState(nodeId) != PerformIO){ - globalTransporterRegistry.setPerformState(nodeId, PerformConnect); - globalTransporterRegistry.setIOState(nodeId, NoHalt); + for(unsigned int i = 1; i < MAX_NODES; i++ ){ + if (getNodeInfo(i).m_type == NodeInfo::MGM){ + if(globalTransporterRegistry.performState(i) != PerformIO){ + globalTransporterRegistry.setPerformState(i, PerformConnect); + globalTransporterRegistry.setIOState(i, NoHalt); } } } @@ -922,17 +775,10 @@ Cmvmi::execSTART_ORD(Signal* signal) { // Disconnect all nodes as part of the system restart. // We need to ensure that we are starting up // without any connected nodes. - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData() ; - const int myNodeId = globalData.ownId; - - for(unsigned int i= 0; i < clusterConf.SizeAltData.noOfNodes; i++ ){ - NodeId nodeId = clusterConf.nodeData[i].nodeId; - if (myNodeId != nodeId && - clusterConf.nodeData[i].nodeType != NodeInfo::MGM){ - - globalTransporterRegistry.setPerformState(nodeId, PerformDisconnect); - globalTransporterRegistry.setIOState(nodeId, HaltIO); + for(unsigned int i = 1; i < MAX_NODES; i++ ){ + if (i != getOwnNodeId() && getNodeInfo(i).m_type != NodeInfo::MGM){ + globalTransporterRegistry.setPerformState(i, PerformDisconnect); + globalTransporterRegistry.setIOState(i, HaltIO); } } @@ -963,6 +809,7 @@ void Cmvmi::execTAMPER_ORD(Signal* signal) void Cmvmi::execSET_VAR_REQ(Signal* signal) { +#if 0 SetVarReq* const setVarReq = (SetVarReq*)&signal->theData[0]; ConfigParamId var = setVarReq->variable(); @@ -1047,7 +894,7 @@ void Cmvmi::execSET_VAR_REQ(Signal* signal) sendSignal(mgmtSrvr, GSN_SET_VAR_REF, signal, 0, JBB); } // switch - +#endif }//execSET_VAR_REQ() @@ -1068,7 +915,7 @@ void Cmvmi::execSET_VAR_REF(Signal* signal) void Cmvmi::handleSET_VAR_REQ(Signal* signal) { - +#if 0 SetVarReq* const setVarReq = (SetVarReq*)&signal->theData[0]; ConfigParamId var = setVarReq->variable(); int val = setVarReq->value(); @@ -1109,7 +956,7 @@ void Cmvmi::handleSET_VAR_REQ(Signal* signal) { sendSignal(CMVMI_REF, GSN_SET_VAR_REF, signal, 1, JBB); return; } // switch - +#endif } #ifdef VM_TRACE @@ -1184,14 +1031,9 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal) DumpStateOrd * const & dumpState = (DumpStateOrd *)&signal->theData[0]; if (dumpState->args[0] == DumpStateOrd::CmvmiDumpConnections){ - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData() ; - - for(unsigned int i= 0; i < clusterConf.SizeAltData.noOfNodes; i++ ){ - NodeId nodeId = clusterConf.nodeData[i].nodeId; - + for(unsigned int i = 1; i < MAX_NODES; i++ ){ const char* nodeTypeStr = ""; - switch(clusterConf.nodeData[i].nodeType){ + switch(getNodeInfo(i).m_type){ case NodeInfo::DB: nodeTypeStr = "DB"; break; @@ -1204,12 +1046,18 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal) case NodeInfo::REP: nodeTypeStr = "REP"; break; + case NodeInfo::INVALID: + nodeTypeStr = 0; + break; default: nodeTypeStr = "<UNKNOWN>"; } + if(nodeTypeStr == 0) + continue; + const char* actionStr = ""; - switch (globalTransporterRegistry.performState(nodeId)){ + switch (globalTransporterRegistry.performState(i)){ case PerformNothing: actionStr = "does nothing"; break; @@ -1228,18 +1076,18 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal) } infoEvent("Connection to %d (%s) %s", - nodeId, + i, nodeTypeStr, actionStr); } } - + if (dumpState->args[0] == DumpStateOrd::CmvmiDumpLongSignalMemory){ infoEvent("Cmvmi: g_sectionSegmentPool size: %d free: %d", g_sectionSegmentPool.getSize(), g_sectionSegmentPool.getNoOfFree()); } - + if (dumpState->args[0] == DumpStateOrd::CmvmiSetRestartOnErrorInsert){ if(signal->getLength() == 1) theConfig.setRestartOnErrorInsert((int)NRT_NoStart_Restart); @@ -1372,15 +1220,7 @@ Cmvmi::execTESTSIG(Signal* signal){ return; } - NodeReceiverGroup rg; rg.m_block = CMVMI; - const ClusterConfiguration::ClusterData & clusterConf = - theConfig.clusterConfigurationData() ; - for(unsigned int i = 0; i < clusterConf.SizeAltData.noOfNodes; i++ ){ - NodeId nodeId = clusterConf.nodeData[i].nodeId; - if (clusterConf.nodeData[i].nodeType == NodeInfo::DB){ - rg.m_nodes.set(nodeId); - } - } + NodeReceiverGroup rg(CMVMI, c_dbNodes); if(signal->getSendersBlockRef() == ref){ /** @@ -1550,6 +1390,26 @@ Cmvmi::execTESTSIG(Signal* signal){ } break; } + case 13:{ + ndbrequire(signal->getNoOfSections() == 0); + Uint32 loop = signal->theData[9]; + if(loop > 0){ + signal->theData[9] --; + sendSignal(CMVMI_REF, GSN_TESTSIG, signal, signal->length(), JBB); + return; + } + sendSignal(ref, GSN_TESTSIG, signal, signal->length(), JBB); + return; + } + case 14:{ + Uint32 count = signal->theData[8]; + signal->theData[10] = count * rg.m_nodes.count(); + for(Uint32 i = 0; i<count; i++){ + sendSignal(rg, GSN_TESTSIG, signal, signal->length(), JBB); + } + return; + } + default: ndbrequire(false); } |