⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgmtsrvr.cpp

📁 mysql-5.0.24源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    * stopCount = count;  return 0;}/***************************************************************************** * Status ****************************************************************************/#include <ClusterMgr.hpp>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, 				     const EventSubscribeReq& ll){  SignalSender ss(theFacade);  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;  NodeBitmask nodes;  nodes.clear();  Uint32 max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId;  for(; nodeId <= max; nodeId++)  {    if (nodeTypes[nodeId] != NODE_TYPE_DB)      continue;    if (okToSendTo(nodeId, true))      continue;    if (ss.sendSignal(nodeId, &ssig) == SEND_OK)    {      nodes.set(nodeId);    }  }  int error = 0;  while (!nodes.isclear())  {    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;    }    case GSN_NF_COMPLETEREP:{      const NFCompleteRep * const rep =	CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());      nodes.clear(rep->failedNodeId);      break;    }    case GSN_NODE_FAILREP:{      // ignore, NF_COMPLETEREP will arrive later      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();  switch (gsn) {  case GSN_EVENT_SUBSCRIBE_CONF:    break;  case GSN_EVENT_SUBSCRIBE_REF:    break;  case GSN_EVENT_REP:  {    EventReport *rep = (EventReport*) signal->getDataPtr();    if (rep->getNodeId() == 0)      rep->setNodeId(refToNode(signal->theSendersBlockRef));    eventReport(signal->getDataPtr());    break;  }  case GSN_NF_COMPLETEREP:    break;  case GSN_NODE_FAILREP:    break;  default:    g_eventLogger.error("Unknown signal received. SignalNumber: "			"%i from (%d, %x)",			gsn,			refToNode(signal->theSendersBlockRef),			refToBlock(signal->theSendersBlockRef));  }    if (theWaitState == NO_WAIT) {    NdbCondition_Signal(theMgmtWaitForResponseCondPtr);  }}voidMgmtSrvr::handleStatus(NodeId nodeId, bool alive, bool nfComplete){  DBUG_ENTER("MgmtSrvr::handleStatus");  Uint32 theData[25];  EventReport *rep = (EventReport *)theData;  theData[1] = nodeId;  if (alive) {    m_started_nodes.push_back(nodeId);    rep->setEventType(NDB_LE_Connected);  } else {    rep->setEventType(NDB_LE_Connected);    if(nfComplete)    {      DBUG_VOID_RETURN;    }  }    rep->setNodeId(_ownNodeId);  eventReport(theData);  DBUG_VOID_RETURN;}//****************************************************************************//****************************************************************************void MgmtSrvr::signalReceivedNotification(void* mgmtSrvr,                                      NdbApiSignal* signal,				     LinearSectionPtr ptr[3]) {  ((MgmtSrvr*)mgmtSrvr)->handleReceivedSignal(signal);}//****************************************************************************//****************************************************************************

⌨️ 快捷键说明

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