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

📄 cmvmi.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      jam();      if (i != getOwnNodeId() && getNodeInfo(i).m_type == tData2){	jam();#ifdef ERROR_INSERT	if (ERROR_INSERTED(9000) && c_error_9000_nodes_mask.get(i))	  continue;#endif		globalTransporterRegistry.do_connect(i);	globalTransporterRegistry.setIOState(i, HaltIO);		signal->theData[0] = NDB_LE_CommunicationOpened;	signal->theData[1] = i;	sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);      }    }  }    if (userRef != 0) {    jam();     signal->theData[0] = tStartingNode;    signal->theData[1] = tData2;    sendSignal(userRef, GSN_OPEN_COMCONF, signal, len - 1,JBA);  }}void Cmvmi::execENABLE_COMORD(Signal* signal){  // Enable communication with all our NDB blocks to this node    Uint32 tStartingNode = signal->theData[0];  globalTransporterRegistry.setIOState(tStartingNode, NoHalt);  setNodeInfo(tStartingNode).m_connected = true;    //-----------------------------------------------------  // Report that the version of the node  //-----------------------------------------------------  signal->theData[0] = NDB_LE_ConnectedApiVersion;  signal->theData[1] = tStartingNode;  signal->theData[2] = getNodeInfo(tStartingNode).m_version;  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB);  //-----------------------------------------------------    jamEntry();}void Cmvmi::execDISCONNECT_REP(Signal *signal){  const DisconnectRep * const rep = (DisconnectRep *)&signal->theData[0];  const Uint32 hostId = rep->nodeId;  const Uint32 errNo  = rep->err;    jamEntry();  setNodeInfo(hostId).m_connected = false;  setNodeInfo(hostId).m_connectCount++;  const NodeInfo::NodeType type = getNodeInfo(hostId).getType();  ndbrequire(type != NodeInfo::INVALID);    if(type == NodeInfo::DB || globalData.theStartLevel == NodeState::SL_STARTED){    jam();    DisconnectRep * const rep = (DisconnectRep *)&signal->theData[0];    rep->nodeId = hostId;    rep->err = errNo;    sendSignal(QMGR_REF, GSN_DISCONNECT_REP, signal, 	       DisconnectRep::SignalLength, JBA);  } else if((globalData.theStartLevel == NodeState::SL_CMVMI ||	     globalData.theStartLevel == NodeState::SL_STARTING)	    && type == NodeInfo::MGM) {    /**     * Someone disconnected during cmvmi period     */    jam();    globalTransporterRegistry.do_connect(hostId);  }  cancelSubscription(hostId);  signal->theData[0] = NDB_LE_Disconnected;  signal->theData[1] = hostId;  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);} void Cmvmi::execCONNECT_REP(Signal *signal){  const Uint32 hostId = signal->theData[0];  jamEntry();    const NodeInfo::NodeType type = (NodeInfo::NodeType)getNodeInfo(hostId).m_type;  ndbrequire(type != NodeInfo::INVALID);  globalData.m_nodeInfo[hostId].m_version = 0;  globalData.m_nodeInfo[hostId].m_signalVersion = 0;    if(type == NodeInfo::DB || globalData.theStartLevel >= NodeState::SL_STARTED){    jam();        /**     * Inform QMGR that client has connected     */    signal->theData[0] = hostId;    sendSignal(QMGR_REF, GSN_CONNECT_REP, signal, 1, JBA);  } else if(globalData.theStartLevel == NodeState::SL_CMVMI ||            globalData.theStartLevel == NodeState::SL_STARTING) {    jam();    /**     * Someone connected before start was finished     */    if(type == NodeInfo::MGM){      jam();    } else {      /**       * Dont allow api nodes to connect       */      abort();      globalTransporterRegistry.do_disconnect(hostId);    }  }    /* Automatically subscribe events for MGM nodes.   */  if(type == NodeInfo::MGM){    jam();    globalTransporterRegistry.setIOState(hostId, NoHalt);  }  //------------------------------------------  // Also report this event to the Event handler  //------------------------------------------  signal->theData[0] = NDB_LE_Connected;  signal->theData[1] = hostId;  signal->header.theLength = 2;    execEVENT_REP(signal);}#ifdef VM_TRACEvoidmodifySignalLogger(bool allBlocks, BlockNumber bno,                    TestOrd::Command cmd,                    TestOrd::SignalLoggerSpecification spec){  SignalLoggerManager::LogMode logMode;  /**   * Mapping between SignalLoggerManager::LogMode and    *                 TestOrd::SignalLoggerSpecification   */  switch(spec){  case TestOrd::InputSignals:    logMode = SignalLoggerManager::LogIn;    break;  case TestOrd::OutputSignals:    logMode = SignalLoggerManager::LogOut;    break;  case TestOrd::InputOutputSignals:    logMode = SignalLoggerManager::LogInOut;    break;  default:    return;    break;  }    switch(cmd){  case TestOrd::On:    globalSignalLoggers.logOn(allBlocks, bno, logMode);    break;  case TestOrd::Off:    globalSignalLoggers.logOff(allBlocks, bno, logMode);    break;  case TestOrd::Toggle:    globalSignalLoggers.logToggle(allBlocks, bno, logMode);    break;  case TestOrd::KeepUnchanged:    // Do nothing    break;  }  globalSignalLoggers.flushSignalLog();}#endifvoidCmvmi::execTEST_ORD(Signal * signal){  jamEntry();  #ifdef VM_TRACE  TestOrd * const testOrd = (TestOrd *)&signal->theData[0];  TestOrd::Command cmd;  {    /**     * Process Trace command     */    TestOrd::TraceSpecification traceSpec;    testOrd->getTraceCommand(cmd, traceSpec);    unsigned long traceVal = traceSpec;    unsigned long currentTraceVal = globalSignalLoggers.getTrace();    switch(cmd){    case TestOrd::On:      currentTraceVal |= traceVal;      break;    case TestOrd::Off:      currentTraceVal &= (~traceVal);      break;    case TestOrd::Toggle:      currentTraceVal ^= traceVal;      break;    case TestOrd::KeepUnchanged:      // Do nothing      break;    }    globalSignalLoggers.setTrace(currentTraceVal);  }    {    /**     * Process Log command     */    TestOrd::SignalLoggerSpecification logSpec;    BlockNumber bno;    unsigned int loggers = testOrd->getNoOfSignalLoggerCommands();        if(loggers == (unsigned)~0){ // Apply command to all blocks      testOrd->getSignalLoggerCommand(0, bno, cmd, logSpec);      modifySignalLogger(true, bno, cmd, logSpec);    } else {      for(unsigned int i = 0; i<loggers; i++){        testOrd->getSignalLoggerCommand(i, bno, cmd, logSpec);        modifySignalLogger(false, bno, cmd, logSpec);      }    }  }  {    /**     * Process test command     */    testOrd->getTestCommand(cmd);    switch(cmd){    case TestOrd::On:{      SET_GLOBAL_TEST_ON;    }    break;    case TestOrd::Off:{      SET_GLOBAL_TEST_OFF;    }    break;    case TestOrd::Toggle:{      TOGGLE_GLOBAL_TEST_FLAG;    }    break;    case TestOrd::KeepUnchanged:      // Do nothing      break;    }  }#endif}void Cmvmi::execSTATISTICS_REQ(Signal* signal) {  // TODO Note ! This is only a test implementation...  static int stat1 = 0;  jamEntry();  //ndbout << "data 1: " << signal->theData[1];  int x = signal->theData[0];  stat1++;  signal->theData[0] = stat1;  sendSignal(x, GSN_STATISTICS_CONF, signal, 7, JBB);}//execSTATISTICS_REQ()void Cmvmi::execSTOP_ORD(Signal* signal) {  jamEntry();  globalData.theRestartFlag = perform_stop;}//execSTOP_ORD()voidCmvmi::execSTART_ORD(Signal* signal) {  StartOrd * const startOrd = (StartOrd *)&signal->theData[0];  jamEntry();    Uint32 tmp = startOrd->restartInfo;  if(StopReq::getPerformRestart(tmp)){    jam();    /**     *     */    NdbRestartType type = NRT_Default;    if(StopReq::getNoStart(tmp) && StopReq::getInitialStart(tmp))      type = NRT_NoStart_InitialStart;    if(StopReq::getNoStart(tmp) && !StopReq::getInitialStart(tmp))      type = NRT_NoStart_Restart;    if(!StopReq::getNoStart(tmp) && StopReq::getInitialStart(tmp))      type = NRT_DoStart_InitialStart;    if(!StopReq::getNoStart(tmp)&&!StopReq::getInitialStart(tmp))      type = NRT_DoStart_Restart;    NdbShutdown(NST_Restart, type);  }  if(globalData.theRestartFlag == system_started){    jam()    /**     * START_ORD received when already started(ignored)     */    //ndbout << "START_ORD received when already started(ignored)" << endl;    return;  }    if(globalData.theRestartFlag == perform_stop){    jam()    /**     * START_ORD received when stopping(ignored)     */    //ndbout << "START_ORD received when stopping(ignored)" << endl;    return;  }    if(globalData.theStartLevel == NodeState::SL_NOTHING){    jam();    globalData.theStartLevel = NodeState::SL_CMVMI;    /**     * Open connections to management servers     */    for(unsigned int i = 1; i < MAX_NODES; i++ ){      if (getNodeInfo(i).m_type == NodeInfo::MGM){         if(!globalTransporterRegistry.is_connected(i)){          globalTransporterRegistry.do_connect(i);          globalTransporterRegistry.setIOState(i, NoHalt);        }      }    }    return ;  }    if(globalData.theStartLevel == NodeState::SL_CMVMI){    jam();    globalData.theStartLevel  = NodeState::SL_STARTING;    globalData.theRestartFlag = system_started;    /**     * StartLevel 1     *     * Do Restart     */    globalScheduler.clear();    globalTimeQueue.clear();        // Disconnect all nodes as part of the system restart.     // We need to ensure that we are starting up    // without any connected nodes.       for(unsigned int i = 1; i < MAX_NODES; i++ ){      if (i != getOwnNodeId() && getNodeInfo(i).m_type != NodeInfo::MGM){        globalTransporterRegistry.do_disconnect(i);        globalTransporterRegistry.setIOState(i, HaltIO);      }    }        /**     * Start running startphases     */    sendSignal(NDBCNTR_REF, GSN_START_ORD, signal, 1, JBA);      return;  }}//execSTART_ORD()void Cmvmi::execTAMPER_ORD(Signal* signal) {  jamEntry();  // TODO We should maybe introduce a CONF and REF signal  // to be able to indicate if we really introduced an error.#ifdef ERROR_INSERT  TamperOrd* const tamperOrd = (TamperOrd*)&signal->theData[0];    signal->theData[1] = tamperOrd->errorNo;  signal->theData[0] = 5;  sendSignal(DBDIH_REF, GSN_DIHNDBTAMPER, signal, 3,JBB);#endif}//execTAMPER_ORD()void Cmvmi::execSET_VAR_REQ(Signal* signal) {#if 0  SetVarReq* const setVarReq = (SetVarReq*)&signal->theData[0];  ConfigParamId var = setVarReq->variable();  jamEntry();  switch (var) {        // NDBCNTR_REF        // DBTC  case TransactionDeadlockDetectionTimeout:  case TransactionInactiveTime:  case NoOfConcurrentProcessesHandleTakeover:    sendSignal(DBTC_REF, GSN_SET_VAR_REQ, signal, 3, JBB);    break;        // DBDIH  case TimeBetweenLocalCheckpoints:  case TimeBetweenGlobalCheckpoints:    sendSignal(DBDIH_REF, GSN_SET_VAR_REQ, signal, 3, JBB);    break;    // DBLQH  case NoOfConcurrentCheckpointsDuringRestart:  case NoOfConcurrentCheckpointsAfterRestart:    sendSignal(DBLQH_REF, GSN_SET_VAR_REQ, signal, 3, JBB);    break;    // DBACC  case NoOfDiskPagesToDiskDuringRestartACC:  case NoOfDiskPagesToDiskAfterRestartACC:    sendSignal(DBACC_REF, GSN_SET_VAR_REQ, signal, 3, JBB);    break;    // DBTUP  case NoOfDiskPagesToDiskDuringRestartTUP:  case NoOfDiskPagesToDiskAfterRestartTUP:    sendSignal(DBTUP_REF, GSN_SET_VAR_REQ, signal, 3, JBB);    break;    // DBDICT    // NDBCNTR  case TimeToWaitAlive:    // QMGR  case HeartbeatIntervalDbDb: // TODO ev till Ndbcnt ocks

⌨️ 快捷键说明

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