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

📄 mgmtsrvr.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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){  INIT_SIGNAL_SENDER(ss,nodeId);  SimpleSignal ssig;  EventSubscribeReq * dst =     CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend());  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ,	   EventSubscribeReq::SignalLength);  *dst = ll;  send(ss,ssig,nodeId,NODE_TYPE_DB);#if 0  while (1)  {    SimpleSignal *signal = ss.waitFor();    int gsn = signal->readSignalNumber();    switch (gsn) {     case GSN_EVENT_SUBSCRIBE_CONF:{      break;    }    case GSN_EVENT_SUBSCRIBE_REF:{      return SEND_OR_RECEIVE_FAILED;    }    case GSN_NF_COMPLETEREP:{      const NFCompleteRep * const rep =	CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());      if (rep->failedNodeId == nodeId)	return SEND_OR_RECEIVE_FAILED;      break;    }    case GSN_NODE_FAILREP:{      const NodeFailRep * const rep =	CAST_CONSTPTR(NodeFailRep, signal->getDataPtr());      if (NodeBitmask::get(rep->theNodes,nodeId))	return SEND_OR_RECEIVE_FAILED;      break;    }    default:      report_unknown_signal(signal);      return SEND_OR_RECEIVE_FAILED;    }  }#endif  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;}intMgmtSrvr::send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type){  Uint32 max = (node == 0) ? MAX_NODES : node + 1;    for(; node < max; node++){    while(nodeTypes[node] != (int)node_type && node < max) node++;    if(nodeTypes[node] != (int)node_type)      break;    ss.sendSignal(node, &ssig);  }  return 0;}//****************************************************************************//****************************************************************************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 = CAST_PTR(EventReport, signal->getDataPtrSend());    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);}//****************************************************************************//****************************************************************************void MgmtSrvr::nodeStatusNotification(void* mgmSrv, Uint32 nodeId, 				 bool alive, bool nfComplete){  DBUG_ENTER("MgmtSrvr::nodeStatusNotification");  DBUG_PRINT("enter",("nodeid= %d, alive= %d, nfComplete= %d", nodeId, alive, nfComplete));  ((MgmtSrvr*)mgmSrv)->handleStatus(nodeId, alive, nfComplete);  DBUG_VOID_RETURN;}enum ndb_mgm_node_type MgmtSrvr::getNodeType(NodeId nodeId) const {  if(nodeId >= MAX_NODES)    return (enum ndb_mgm_node_type)-1;    return nodeTypes[nodeId];}const char *MgmtSrvr::get_connect_address(Uint32 node_id){  if (m_connect_address[node_id].s_addr == 0 &&      theFacade && theFacade->theTransporterRegistry &&      theFacade->theClusterMgr &&      getNodeType(node_id) == NDB_MGM_NODE_TYPE_NDB)   {    const ClusterMgr::Node &node=      theFacade->theClusterMgr->getNodeInfo(node_id);    if (node.connected)    {      m_connect_address[node_id]=	theFacade->theTransporterRegistry->get_connect_address(node_id);    }  }  return inet_ntoa(m_connect_address[node_id]);  }voidMgmtSrvr::get_connected_nodes(NodeBitmask &connected_nodes) const{  if (theFacade && theFacade->theClusterMgr)   {    for(Uint32 i = 0; i < MAX_NODES; i++)    {      if (getNodeType(i) == NDB_MGM_NODE_TYPE_NDB)      {	const ClusterMgr::Node &node= theFacade->theClusterMgr->getNodeInfo(i);	connected_nodes.bitOR(node.m_state.m_connected_nodes);      }    }  }}boolMgmtSrvr::alloc_node_id(NodeId * nodeId, 			enum ndb_mgm_node_type type,			struct sockaddr *client_addr, 			SOCKET_SIZE_TYPE *client_addr_len,			BaseString &error_string){  DBUG_ENTER("MgmtSrvr::alloc_node_id");  DBUG_PRINT("enter", ("nodeid=%d, type=%d, client_addr=%d",		       *nodeId, type, client_addr));  if (g_no_nodeid_checks) {    if (*nodeId == 0) {      error_string.appfmt("no-nodeid-checks set in management server.\n"			  "node id must be set explicitly in connectstring");      DBUG_RETURN(false);    }    DBUG_RETURN(true);  }  Guard g(m_node_id_mutex);  int no_mgm= 0;  NodeBitmask connected_nodes(m_reserved_nodes);

⌨️ 快捷键说明

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