mgmtsrvr.cpp

来自「这个文件是windows mysql源码」· C++ 代码 · 共 2,437 行 · 第 1/5 页

CPP
2,437
字号
    }  }  if(stopCount != 0)    * stopCount = count;  return 0;}/***************************************************************************** * Status ****************************************************************************/#include <ClusterMgr.hpp>voidMgmtSrvr::updateStatus(){  theFacade->theClusterMgr->forceHB();}int MgmtSrvr::status(int nodeId,                  ndb_mgm_node_status * _status, 		 Uint32 * version,		 Uint32 * _phase, 		 bool * _system,		 Uint32 * dynamic,		 Uint32 * nodegroup,		 Uint32 * connectCount,		 const char **address){  if (getNodeType(nodeId) == NDB_MGM_NODE_TYPE_API ||      getNodeType(nodeId) == NDB_MGM_NODE_TYPE_MGM) {    versionNode(nodeId, *version, address);  } else {    *address= get_connect_address(nodeId);  }  const ClusterMgr::Node node =     theFacade->theClusterMgr->getNodeInfo(nodeId);  if(!node.connected){    * _status = NDB_MGM_NODE_STATUS_NO_CONTACT;    return 0;  }    if (getNodeType(nodeId) == NDB_MGM_NODE_TYPE_NDB) {    * version = node.m_info.m_version;  }  * dynamic = node.m_state.dynamicId;  * nodegroup = node.m_state.nodeGroup;  * connectCount = node.m_info.m_connectCount;    switch(node.m_state.startLevel){  case NodeState::SL_CMVMI:    * _status = NDB_MGM_NODE_STATUS_NOT_STARTED;    * _phase = 0;    return 0;    break;  case NodeState::SL_STARTING:    * _status     = NDB_MGM_NODE_STATUS_STARTING;    * _phase = node.m_state.starting.startPhase;    return 0;    break;  case NodeState::SL_STARTED:    * _status = NDB_MGM_NODE_STATUS_STARTED;    * _phase = 0;    return 0;    break;  case NodeState::SL_STOPPING_1:    * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN;    * _phase = 1;    * _system = node.m_state.stopping.systemShutdown != 0;    return 0;    break;  case NodeState::SL_STOPPING_2:    * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN;    * _phase = 2;    * _system = node.m_state.stopping.systemShutdown != 0;    return 0;    break;  case NodeState::SL_STOPPING_3:    * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN;    * _phase = 3;    * _system = node.m_state.stopping.systemShutdown != 0;    return 0;    break;  case NodeState::SL_STOPPING_4:    * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN;    * _phase = 4;    * _system = node.m_state.stopping.systemShutdown != 0;    return 0;    break;  case NodeState::SL_SINGLEUSER:    * _status = NDB_MGM_NODE_STATUS_SINGLEUSER;    * _phase  = 0;    return 0;    break;  default:    * _status = NDB_MGM_NODE_STATUS_UNKNOWN;    * _phase = 0;    return 0;  }    return -1;}int MgmtSrvr::setEventReportingLevelImpl(int nodeId_arg, 				     const EventSubscribeReq& ll){  SignalSender ss(theFacade);  NdbNodeBitmask nodes;  int retries = 30;  nodes.clear();  while (1)  {    Uint32 nodeId, max;    ss.lock();    SimpleSignal ssig;    EventSubscribeReq * dst =       CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend());    ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ,             EventSubscribeReq::SignalLength);    *dst = ll;    if (nodeId_arg == 0)    {      // all nodes      nodeId = 1;      max = MAX_NDB_NODES;    }    else    {      // only one node      max = nodeId = nodeId_arg;    }    // first make sure nodes are sendable    for(; nodeId <= max; nodeId++)    {      if (nodeTypes[nodeId] != NODE_TYPE_DB)        continue;      if (okToSendTo(nodeId, true))      {        if (theFacade->theClusterMgr->getNodeInfo(nodeId).connected  == false)        {          // node not connected we can safely skip this one          continue;        }        // api_reg_conf not recevied yet, need to retry        break;      }    }    if (nodeId <= max)    {      if (--retries)      {        ss.unlock();        NdbSleep_MilliSleep(100);          continue;      }      return SEND_OR_RECEIVE_FAILED;    }    if (nodeId_arg == 0)    {      // all nodes      nodeId = 1;      max = MAX_NDB_NODES;    }    else    {      // only one node      max = nodeId = nodeId_arg;    }    // now send to all sendable nodes nodes    // note, lock is held, so states have not changed    for(; (Uint32) nodeId <= max; nodeId++)    {      if (nodeTypes[nodeId] != NODE_TYPE_DB)        continue;      if (theFacade->theClusterMgr->getNodeInfo(nodeId).connected  == false)        continue; // node is not connected, skip      if (ss.sendSignal(nodeId, &ssig) == SEND_OK)        nodes.set(nodeId);    }    break;  }  if (nodes.isclear())  {    return SEND_OR_RECEIVE_FAILED;  }    int error = 0;  while (!nodes.isclear())  {    Uint32 nodeId;    SimpleSignal *signal = ss.waitFor();    int gsn = signal->readSignalNumber();    nodeId = refToNode(signal->header.theSendersBlockRef);    switch (gsn) {    case GSN_EVENT_SUBSCRIBE_CONF:{      nodes.clear(nodeId);      break;    }    case GSN_EVENT_SUBSCRIBE_REF:{      nodes.clear(nodeId);      error = 1;      break;    }      // Since sending okToSend(true),       // there is no guarantee that NF_COMPLETEREP will come      // i.e listen also to NODE_FAILREP    case GSN_NODE_FAILREP: {      const NodeFailRep * const rep =	CAST_CONSTPTR(NodeFailRep, signal->getDataPtr());      NdbNodeBitmask mask;      mask.assign(NdbNodeBitmask::Size, rep->theNodes);      nodes.bitANDC(mask);      break;    }          case GSN_NF_COMPLETEREP:{      const NFCompleteRep * const rep =	CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());      nodes.clear(rep->failedNodeId);      break;    }    default:      report_unknown_signal(signal);      return SEND_OR_RECEIVE_FAILED;    }  }  if (error)    return SEND_OR_RECEIVE_FAILED;  return 0;}//****************************************************************************//****************************************************************************int MgmtSrvr::setNodeLogLevelImpl(int nodeId, const SetLogLevelOrd & ll){  INIT_SIGNAL_SENDER(ss,nodeId);  SimpleSignal ssig;  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_SET_LOGLEVELORD,	   SetLogLevelOrd::SignalLength);  SetLogLevelOrd* const dst = CAST_PTR(SetLogLevelOrd, ssig.getDataPtrSend());  *dst = ll;    return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************int MgmtSrvr::insertError(int nodeId, int errorNo) {  if (errorNo < 0) {    return INVALID_ERROR_NUMBER;  }  INIT_SIGNAL_SENDER(ss,nodeId);    SimpleSignal ssig;  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TAMPER_ORD, 	   TamperOrd::SignalLength);  TamperOrd* const tamperOrd = CAST_PTR(TamperOrd, ssig.getDataPtrSend());  tamperOrd->errorNo = errorNo;  return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************int MgmtSrvr::setTraceNo(int nodeId, int traceNo){  if (traceNo < 0) {    return INVALID_TRACE_NUMBER;  }  INIT_SIGNAL_SENDER(ss,nodeId);  SimpleSignal ssig;  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);  TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend());  testOrd->clear();  // Assume TRACE command causes toggling. Not really defined... ? TODO  testOrd->setTraceCommand(TestOrd::Toggle, 			   (TestOrd::TraceSpecification)traceNo);  return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************int MgmtSrvr::getBlockNumber(const BaseString &blockName) {  short bno = getBlockNo(blockName.c_str());  if(bno != 0)    return bno;  return -1;}//****************************************************************************//****************************************************************************int MgmtSrvr::setSignalLoggingMode(int nodeId, LogMode mode, 			       const Vector<BaseString>& blocks){  INIT_SIGNAL_SENDER(ss,nodeId);  // Convert from MgmtSrvr format...  TestOrd::Command command;  if (mode == Off) {    command = TestOrd::Off;  }  else {    command = TestOrd::On;  }  TestOrd::SignalLoggerSpecification logSpec;  switch (mode) {  case In:    logSpec = TestOrd::InputSignals;    break;  case Out:    logSpec = TestOrd::OutputSignals;    break;  case InOut:    logSpec = TestOrd::InputOutputSignals;    break;  case Off:    // In MgmtSrvr interface it's just possible to switch off all logging, both    // "in" and "out" (this should probably be changed).    logSpec = TestOrd::InputOutputSignals;    break;  default:    ndbout_c("Unexpected value %d, MgmtSrvr::setSignalLoggingMode, line %d",	     (unsigned)mode, __LINE__);    assert(false);    return -1;  }  SimpleSignal ssig;  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);  TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend());  testOrd->clear();    if (blocks.size() == 0 || blocks[0] == "ALL") {    // Logg command for all blocks    testOrd->addSignalLoggerCommand(command, logSpec);  } else {    for(unsigned i = 0; i < blocks.size(); i++){      int blockNumber = getBlockNumber(blocks[i]);      if (blockNumber == -1) {        return INVALID_BLOCK_NAME;      }      testOrd->addSignalLoggerCommand(blockNumber, command, logSpec);    } // for  } // else  return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}/***************************************************************************** * Signal tracing *****************************************************************************/int MgmtSrvr::startSignalTracing(int nodeId){  INIT_SIGNAL_SENDER(ss,nodeId);    SimpleSignal ssig;  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);  TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend());  testOrd->clear();  testOrd->setTestCommand(TestOrd::On);  return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}int MgmtSrvr::stopSignalTracing(int nodeId) {  INIT_SIGNAL_SENDER(ss,nodeId);  SimpleSignal ssig;  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength);  TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend());  testOrd->clear();  testOrd->setTestCommand(TestOrd::Off);  return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}/***************************************************************************** * Dump state *****************************************************************************/intMgmtSrvr::dumpState(int nodeId, const char* args){  // Convert the space separeted args   // string to an int array  Uint32 args_array[25];  Uint32 numArgs = 0;  char buf[10];    int b  = 0;  memset(buf, 0, 10);  for (size_t i = 0; i <= strlen(args); i++){    if (args[i] == ' ' || args[i] == 0){      args_array[numArgs] = atoi(buf);      numArgs++;      memset(buf, 0, 10);      b = 0;    } else {      buf[b] = args[i];      b++;    }      }    return dumpState(nodeId, args_array, numArgs);}intMgmtSrvr::dumpState(int nodeId, const Uint32 args[], Uint32 no){  INIT_SIGNAL_SENDER(ss,nodeId);  const Uint32 len = no > 25 ? 25 : no;    SimpleSignal ssig;  DumpStateOrd * const dumpOrd =     CAST_PTR(DumpStateOrd, ssig.getDataPtrSend());  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_DUMP_STATE_ORD, len);  for(Uint32 i = 0; i<25; i++){    if (i < len)      dumpOrd->args[i] = args[i];    else      dumpOrd->args[i] = 0;  }    return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************const char* MgmtSrvr::getErrorText(int errorCode, char *buf, int buf_sz){  for (int i = 0; i < noOfErrorCodes; ++i) {    if (errorCode == errorTable[i]._errorCode) {      BaseString::snprintf(buf, buf_sz, errorTable[i]._errorText);      buf[buf_sz-1]= 0;      return buf;    }  }  ndb_error_string(errorCode, buf, buf_sz);  buf[buf_sz-1]= 0;  return buf;}void MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal){  // The way of handling a received signal is taken from the Ndb class.  int gsn = signal->readSignalNumber();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?