commandinterpreter.cpp

来自「MySQL源码文件5.X系列, 可自已编译到服务器」· C++ 代码 · 共 1,989 行 · 第 1/5 页

CPP
1,989
字号
    return -1;  }    if(processId == -1){    retval = executeForAll(command, fun, allAfterSecondToken);  } else {    retval = (this->*fun)(processId, allAfterSecondToken, false);  }  ndbout << endl;  return retval;}intCommandInterpreter::executeCommand(Vector<BaseString> &command_list,                                   unsigned command_pos,                                   int *node_ids, int no_of_nodes){  const char *cmd= command_list[command_pos].c_str();  int retval = 0;  if (strcasecmp("STOP", cmd) == 0)  {    retval = executeStop(command_list, command_pos+1, node_ids, no_of_nodes);    return retval;  }  if (strcasecmp("RESTART", cmd) == 0)  {    retval = executeRestart(command_list, command_pos+1, node_ids, no_of_nodes);    return retval;  }  ndbout_c("Invalid command: '%s' after multi node id list. "           "Expected STOP or RESTART.", cmd);  return -1;}/** * Get next nodeid larger than the give node_id. node_id will be * set to the next node_id in the list. node_id should be set * to 0 (zero) on the first call. * * @param handle the NDB management handle * @param node_id last node_id retreived, 0 at first call * @param type type of node to look for * @return 1 if a node was found, 0 if no more node exist */static int get_next_nodeid(struct ndb_mgm_cluster_state *cl,		int *node_id,		enum ndb_mgm_node_type type){  int i;    if(cl == NULL)    return 0;    i=0;  while((i < cl->no_of_nodes)) {    if((*node_id < cl->node_states[i].node_id) &&       (cl->node_states[i].node_type == type)) {            if(i >= cl->no_of_nodes)	return 0;            *node_id = cl->node_states[i].node_id;      return 1;    }    i++;  }    return 0;}intCommandInterpreter::executeForAll(const char * cmd, ExecuteFunction fun, 				  const char * allAfterSecondToken){  int nodeId = 0;  int retval = 0;  if(strcasecmp(cmd, "STOP") == 0) {    ndbout_c("Executing STOP on all nodes.");    retval = (this->*fun)(nodeId, allAfterSecondToken, true);  } else if(strcasecmp(cmd, "RESTART") == 0) {    ndbout_c("Executing RESTART on all nodes.");    ndbout_c("Starting shutdown. This may take a while. Please wait...");    retval = (this->*fun)(nodeId, allAfterSecondToken, true);    ndbout_c("Trying to start all nodes of system.");    ndbout_c("Use ALL STATUS to see the system start-up phases.");  } else {    Guard g(m_print_mutex);    struct ndb_mgm_cluster_state *cl= ndb_mgm_get_status(m_mgmsrv);    if(cl == 0){      ndbout_c("Unable get status from management server");      printError();      return -1;    }    NdbAutoPtr<char> ap1((char*)cl);    while(get_next_nodeid(cl, &nodeId, NDB_MGM_NODE_TYPE_NDB))      retval = (this->*fun)(nodeId, allAfterSecondToken, true);  }  return retval;}//*****************************************************************************//*****************************************************************************bool CommandInterpreter::parseBlockSpecification(const char* allAfterLog,					    Vector<const char*>& blocks) {  // Parse: [BLOCK = {ALL|<blockName>+}]  if (emptyString(allAfterLog)) {    return true;  }  // Copy allAfterLog since strtok will modify it    char* newAllAfterLog = my_strdup(allAfterLog,MYF(MY_WME));  My_auto_ptr<char> ap1(newAllAfterLog);  char* firstTokenAfterLog = strtok(newAllAfterLog, " ");  for (unsigned int i = 0; i < strlen(firstTokenAfterLog); ++i) {    firstTokenAfterLog[i] = toupper(firstTokenAfterLog[i]);  }    if (strcasecmp(firstTokenAfterLog, "BLOCK") != 0) {    ndbout << "Unexpected value: " << firstTokenAfterLog 	   << ". Expected BLOCK." << endl;    return false;  }  char* allAfterFirstToken = strtok(NULL, "\0");  if (emptyString(allAfterFirstToken)) {    ndbout << "Expected =." << endl;    return false;  }  char* secondTokenAfterLog = strtok(allAfterFirstToken, " ");  if (strcasecmp(secondTokenAfterLog, "=") != 0) {    ndbout << "Unexpected value: " << secondTokenAfterLog 	   << ". Expected =." << endl;    return false;  }  char* blockName = strtok(NULL, " ");  bool all = false;  if (blockName != NULL && (strcasecmp(blockName, "ALL") == 0)) {    all = true;  }  while (blockName != NULL) {    blocks.push_back(strdup(blockName));    blockName = strtok(NULL, " ");  }  if (blocks.size() == 0) {    ndbout << "No block specified." << endl;    return false;  }  if (blocks.size() > 1 && all) {    // More than "ALL" specified    ndbout << "Nothing expected after ALL." << endl;    return false;  }    return true;}/***************************************************************************** * HELP *****************************************************************************/intCommandInterpreter::executeHelp(char* parameters){  if (emptyString(parameters)) {    ndbout << helpText;    ndbout << endl 	   << "<severity> = " 	   << "ALERT | CRITICAL | ERROR | WARNING | INFO | DEBUG"	   << endl;    ndbout << "<category> = ";    for(int i = CFG_MIN_LOGLEVEL; i <= CFG_MAX_LOGLEVEL; i++){      const char *str= ndb_mgm_get_event_category_string((ndb_mgm_event_category)i);      if (str) {	if (i != CFG_MIN_LOGLEVEL)	  ndbout << " | ";	ndbout << str;      }    }    ndbout << endl;    ndbout << "<level>    = " << "0 - 15" << endl;    ndbout << "<id>       = " << "ALL | Any database node id" << endl;    ndbout << endl;    ndbout << "For detailed help on COMMAND, use HELP COMMAND." << endl;  } else {    int i = 0;    for (i = 0; help_items[i].cmd != NULL; i++)     {      if (strcasecmp(parameters, help_items[i].cmd) == 0)      {        ndbout << help_items[i].help;        break;      }         }    if (help_items[i].cmd == NULL){      ndbout << "No help for " << parameters << " available" << endl;      return -1;    }  }  return 0;}/***************************************************************************** * SHUTDOWN *****************************************************************************/intCommandInterpreter::executeShutdown(char* parameters) {   ndb_mgm_cluster_state *state = ndb_mgm_get_status(m_mgmsrv);  if(state == NULL) {    ndbout_c("Could not get status");    printError();    return 1;  }  NdbAutoPtr<char> ap1((char*)state);  int result = 0;  int need_disconnect;  result = ndb_mgm_stop3(m_mgmsrv, -1, 0, 0, &need_disconnect);  if (result < 0) {    ndbout << "Shutdown of NDB Cluster node(s) failed." << endl;    printError();    return result;  }  ndbout << result << " NDB Cluster node(s) have shutdown." << endl;  if(need_disconnect) {    ndbout << "Disconnecting to allow management server to shutdown."           << endl;    disconnect();  }  return 0;}/***************************************************************************** * SHOW *****************************************************************************/staticconst char *status_string(ndb_mgm_node_status status){  switch(status){  case NDB_MGM_NODE_STATUS_NO_CONTACT:    return "not connected";  case NDB_MGM_NODE_STATUS_NOT_STARTED:    return "not started";  case NDB_MGM_NODE_STATUS_STARTING:    return "starting";  case NDB_MGM_NODE_STATUS_STARTED:    return "started";  case NDB_MGM_NODE_STATUS_SHUTTING_DOWN:    return "shutting down";  case NDB_MGM_NODE_STATUS_RESTARTING:    return "restarting";  case NDB_MGM_NODE_STATUS_SINGLEUSER:    return "single user mode";  default:    return "unknown state";  }}static voidprint_nodes(ndb_mgm_cluster_state *state, ndb_mgm_configuration_iterator *it,	    const char *proc_name, int no_proc, ndb_mgm_node_type type,	    int master_id){   int i;  ndbout << "[" << proc_name	 << "(" << ndb_mgm_get_node_type_string(type) << ")]\t"	 << no_proc << " node(s)" << endl;  for(i=0; i < state->no_of_nodes; i++) {    struct ndb_mgm_node_state *node_state= &(state->node_states[i]);    if(node_state->node_type == type) {      int node_id= node_state->node_id;      ndbout << "id=" << node_id;      if(node_state->version != 0) {	const char *hostname= node_state->connect_address;	if (hostname == 0	    || strlen(hostname) == 0	    || strcasecmp(hostname,"0.0.0.0") == 0)	  ndbout << " ";	else	  ndbout << "\t@" << hostname;	ndbout << "  (Version: "	       << getMajor(node_state->version) << "."	       << getMinor(node_state->version) << "."	       << getBuild(node_state->version);	if (type == NDB_MGM_NODE_TYPE_NDB) {	  if (node_state->node_status != NDB_MGM_NODE_STATUS_STARTED) {	    ndbout << ", " << status_string(node_state->node_status);	  }	  if (node_state->node_group >= 0) {	    ndbout << ", Nodegroup: " << node_state->node_group;	    if (master_id && node_state->dynamic_id == master_id)	      ndbout << ", Master";	  }	}	ndbout << ")" << endl;      } else {	ndb_mgm_first(it);	if(ndb_mgm_find(it, CFG_NODE_ID, node_id) == 0){	  const char *config_hostname= 0;	  ndb_mgm_get_string_parameter(it, CFG_NODE_HOST, &config_hostname);	  if (config_hostname == 0 || config_hostname[0] == 0)	    config_hostname= "any host";	  ndbout_c(" (not connected, accepting connect from %s)",		   config_hostname);	}	else	{	  ndbout_c("Unable to find node with id: %d", node_id);	}      }    }  }  ndbout << endl;}intCommandInterpreter::executePurge(char* parameters) {   int command_ok= 0;  do {    if (emptyString(parameters))      break;    char* firstToken = strtok(parameters, " ");    char* nextToken = strtok(NULL, " \0");    if (strcasecmp(firstToken,"STALE") == 0 &&	nextToken &&	strcasecmp(nextToken, "SESSIONS") == 0) {      command_ok= 1;      break;    }  } while(0);  if (!command_ok) {    ndbout_c("Unexpected command, expected: PURGE STALE SESSIONS");    return -1;  }  int i;  char *str;    if (ndb_mgm_purge_stale_sessions(m_mgmsrv, &str)) {    ndbout_c("Command failed");    return -1;  }  if (str) {    ndbout_c("Purged sessions with node id's: %s", str);    free(str);  }  else  {    ndbout_c("No sessions purged");  }  return 0;}intCommandInterpreter::executeShow(char* parameters) {   int i;  if (emptyString(parameters)) {    ndb_mgm_cluster_state *state = ndb_mgm_get_status(m_mgmsrv);    if(state == NULL) {      ndbout_c("Could not get status");      printError();      return -1;    }    NdbAutoPtr<char> ap1((char*)state);    ndb_mgm_configuration * conf = ndb_mgm_get_configuration(m_mgmsrv,0);    if(conf == 0){      ndbout_c("Could not get configuration");      printError();      return -1;    }    ndb_mgm_configuration_iterator * it;    it = ndb_mgm_create_configuration_iterator((struct ndb_mgm_configuration *)conf, CFG_SECTION_NODE);

⌨️ 快捷键说明

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