Commit b18b1be9 authored by unknown's avatar unknown
Browse files

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-4.1

into poseidon.ndb.mysql.com:/home/tomas/mysql-4.1-clean

parents 5557ae74 33d654d7
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -379,18 +379,30 @@ ndb_mgm_connect(NdbMgmHandle handle, int no_retries,
      setError(handle, NDB_MGM_COULD_NOT_CONNECT_TO_SOCKET, __LINE__,
	       "Unable to connect with connect string: %s",
	       cfg.makeConnectString(buf,sizeof(buf)));
      if (verbose == -2)
	ndbout << ", failed." << endl;
      return -1;
    }
    if (verbose == -1) {
      ndbout << "retrying every " << retry_delay_in_seconds << " seconds:";
      ndbout << "Retrying every " << retry_delay_in_seconds << " seconds";
      if (no_retries > 0)
	ndbout << ". Attempts left:";
      else
	ndbout << ", until connected.";;	
      ndbout << flush;
      verbose= -2;
    }
    NdbSleep_SecSleep(retry_delay_in_seconds);
    if (no_retries > 0) {
      if (verbose == -2) {
	ndbout << " " << no_retries;
	ndbout << flush;
      }
      no_retries--;
    }
    NdbSleep_SecSleep(retry_delay_in_seconds);
  }
  if (verbose == -2)
    ndbout << endl;

  handle->cfg_i = i;

+51 −46
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ class CommandInterpreter {
   *   Constructor
   *   @param mgmtSrvr: Management server to use when executing commands
   */
  CommandInterpreter(const char *);
  CommandInterpreter(const char *, int verbose);
  ~CommandInterpreter();
  
  /**
@@ -94,6 +94,7 @@ class CommandInterpreter {
   */
  void executeHelp(char* parameters);
  void executeShow(char* parameters);
  void executeConnect(char* parameters);
  void executePurge(char* parameters);
  void executeShutdown(char* parameters);
  void executeRun(char* parameters);
@@ -153,6 +154,7 @@ class CommandInterpreter {

  NdbMgmHandle m_mgmsrv;
  bool connected;
  int m_verbose;
  int try_reconnect;
#ifdef HAVE_GLOBAL_REPLICATION  
  NdbRepHandle m_repserver;
@@ -169,9 +171,9 @@ class CommandInterpreter {
#include "ndb_mgmclient.hpp"
#include "ndb_mgmclient.h"

Ndb_mgmclient::Ndb_mgmclient(const char *host)
Ndb_mgmclient::Ndb_mgmclient(const char *host,int verbose)
{
  m_cmd= new CommandInterpreter(host);
  m_cmd= new CommandInterpreter(host,verbose);
}
Ndb_mgmclient::~Ndb_mgmclient()
{
@@ -275,6 +277,7 @@ static const char* helpText =
"REP CONNECT <host:port>                Connect to REP server on host:port\n"
#endif
"PURGE STALE SESSIONS                   Reset reserved nodeid's in the mgmt server\n"
"CONNECT                                Connect to management server (reconnect if already connected)\n"
"QUIT                                   Quit management client\n"
;

@@ -373,7 +376,8 @@ convert(const char* s, int& val) {
/*
 * Constructor
 */
CommandInterpreter::CommandInterpreter(const char *_host) 
CommandInterpreter::CommandInterpreter(const char *_host,int verbose) 
  : m_verbose(verbose)
{
  m_mgmsrv = ndb_mgm_create_handle();
  if(m_mgmsrv == NULL) {
@@ -437,7 +441,15 @@ CommandInterpreter::connect()
{
  if(!connected) {
    if(!ndb_mgm_connect(m_mgmsrv, try_reconnect-1, 5, 1))
    {
      connected = true;
      if (m_verbose)
      {
	printf("Connected to Management Server at: %s:%d\n",
	       ndb_mgm_get_connected_host(m_mgmsrv),
	       ndb_mgm_get_connected_port(m_mgmsrv));
      }
    }
  }
  return connected;
}
@@ -445,7 +457,7 @@ CommandInterpreter::connect()
bool 
CommandInterpreter::disconnect() 
{
  if (ndb_mgm_disconnect(m_mgmsrv) == -1) {
  if (connected && (ndb_mgm_disconnect(m_mgmsrv) == -1)) {
    ndbout_c("Could not disconnect from management server");
    printError();
  }
@@ -459,18 +471,21 @@ CommandInterpreter::disconnect()
int 
CommandInterpreter::execute(const char *_line, int _try_reconnect) 
{
  DBUG_ENTER("CommandInterpreter::execute");
  DBUG_PRINT("info",("line=\"%s\"",_line));

  if (_try_reconnect >= 0)
    try_reconnect=_try_reconnect;
  char * line;
  if(_line == NULL) {
    //   ndbout << endl;
    return false;
    DBUG_RETURN(false);
  }
  line = my_strdup(_line,MYF(MY_WME));
  My_auto_ptr<char> ptr(line);
  
  if (emptyString(line)) {
    return true;
    DBUG_RETURN(true);
  }
  
  for (unsigned int i = 0; i < strlen(line); ++i) {
@@ -484,41 +499,49 @@ CommandInterpreter::execute(const char *_line, int _try_reconnect)
  if (strcmp(firstToken, "HELP") == 0 ||
      strcmp(firstToken, "?") == 0) {
    executeHelp(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if (strcmp(firstToken, "CONNECT") == 0) {
    executeConnect(allAfterFirstToken);
    DBUG_RETURN(true);
  }
  else if (strcmp(firstToken, "SHOW") == 0) {

  if (!connect())
    DBUG_RETURN(true);

  if (strcmp(firstToken, "SHOW") == 0) {
    executeShow(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if (strcmp(firstToken, "SHUTDOWN") == 0) {
    executeShutdown(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if (strcmp(firstToken, "CLUSTERLOG") == 0){
    executeClusterLog(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if(strcmp(firstToken, "START") == 0 &&
	  allAfterFirstToken != NULL &&
	  strncmp(allAfterFirstToken, "BACKUP", sizeof("BACKUP") - 1) == 0){
    executeStartBackup(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if(strcmp(firstToken, "ABORT") == 0 &&
	  allAfterFirstToken != NULL &&
	  strncmp(allAfterFirstToken, "BACKUP", sizeof("BACKUP") - 1) == 0){
    executeAbortBackup(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if (strcmp(firstToken, "PURGE") == 0) {
    executePurge(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  } 
#ifdef HAVE_GLOBAL_REPLICATION
  else if(strcmp(firstToken, "REPLICATION") == 0 ||
	  strcmp(firstToken, "REP") == 0) {
    executeRep(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
#endif // HAVE_GLOBAL_REPLICATION
  else if(strcmp(firstToken, "ENTER") == 0 &&
@@ -526,14 +549,14 @@ CommandInterpreter::execute(const char *_line, int _try_reconnect)
	  strncmp(allAfterFirstToken, "SINGLE USER MODE ", 
		  sizeof("SINGLE USER MODE") - 1) == 0){
    executeEnterSingleUser(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if(strcmp(firstToken, "EXIT") == 0 &&
	  allAfterFirstToken != NULL &&
	  strncmp(allAfterFirstToken, "SINGLE USER MODE ", 
		  sizeof("SINGLE USER MODE") - 1) == 0){
    executeExitSingleUser(allAfterFirstToken);
    return true;
    DBUG_RETURN(true);
  }
  else if (strcmp(firstToken, "ALL") == 0) {
    analyseAfterFirstToken(-1, allAfterFirstToken);
@@ -542,7 +565,7 @@ CommandInterpreter::execute(const char *_line, int _try_reconnect)
	  strcmp(firstToken, "EXIT") == 0 ||
	  strcmp(firstToken, "BYE") == 0) && 
	  allAfterFirstToken == NULL){
    return false;
    DBUG_RETURN(false);
  } else {
    /**
     * First token should be a digit, node ID
@@ -552,18 +575,18 @@ CommandInterpreter::execute(const char *_line, int _try_reconnect)
    if (! convert(firstToken, nodeId)) {
      ndbout << "Invalid command: " << line << endl;
      ndbout << "Type HELP for help." << endl << endl;
      return true;
      DBUG_RETURN(true);
    }

    if (nodeId < 0) {
      ndbout << "Invalid node ID: " << firstToken << "." << endl;
      return true;
      DBUG_RETURN(true);
    }
    
    analyseAfterFirstToken(nodeId, allAfterFirstToken);
    
  }
  return true;
  DBUG_RETURN(true);
}


@@ -692,7 +715,6 @@ CommandInterpreter::executeForAll(const char * cmd, ExecuteFunction fun,
    ndbout_c("Trying to start all nodes of system.");
    ndbout_c("Use ALL STATUS to see the system start-up phases.");
  } else {
    connect();
    struct ndb_mgm_cluster_state *cl= ndb_mgm_get_status(m_mgmsrv);
    if(cl == 0){
      ndbout_c("Unable get status from management server");
@@ -826,8 +848,6 @@ CommandInterpreter::executeHelp(char* parameters)
void
CommandInterpreter::executeShutdown(char* parameters) 
{ 
  connect();

  ndb_mgm_cluster_state *state = ndb_mgm_get_status(m_mgmsrv);
  if(state == NULL) {
    ndbout_c("Could not get status");
@@ -979,7 +999,6 @@ CommandInterpreter::executePurge(char* parameters)

  int i;
  char *str;
  connect();
  
  if (ndb_mgm_purge_stale_sessions(m_mgmsrv, &str)) {
    ndbout_c("Command failed");
@@ -999,7 +1018,6 @@ void
CommandInterpreter::executeShow(char* parameters) 
{ 
  int i;
  connect();
  if (emptyString(parameters)) {
    ndbout << "Cluster Configuration" << endl
	   << "---------------------" << endl;
@@ -1087,6 +1105,12 @@ CommandInterpreter::executeShow(char* parameters)
  }
}

void
CommandInterpreter::executeConnect(char* parameters) 
{
  disconnect();
  connect();
}

//*****************************************************************************
//*****************************************************************************
@@ -1094,7 +1118,6 @@ void
CommandInterpreter::executeClusterLog(char* parameters) 
{
  int i;
  connect();
  if (parameters != 0 && strlen(parameters) != 0) {
    enum ndb_mgm_clusterlog_level severity = NDB_MGM_CLUSTERLOG_ALL;
    int isOk = true;
@@ -1240,7 +1263,6 @@ CommandInterpreter::executeClusterLog(char* parameters)
void
CommandInterpreter::executeStop(int processId, const char *, bool all) 
{
  connect();
  int result = 0;
  if(all) {
    result = ndb_mgm_stop(m_mgmsrv, 0, 0);
@@ -1262,7 +1284,6 @@ CommandInterpreter::executeStop(int processId, const char *, bool all)
void
CommandInterpreter::executeEnterSingleUser(char* parameters) 
{
  connect();
  strtok(parameters, " ");
  struct ndb_mgm_reply reply;
  char* id = strtok(NULL, " ");
@@ -1289,7 +1310,6 @@ CommandInterpreter::executeEnterSingleUser(char* parameters)
void 
CommandInterpreter::executeExitSingleUser(char* parameters) 
{
  connect();
  int result = ndb_mgm_exit_single_user(m_mgmsrv, 0);
  if (result != 0) {
    ndbout_c("Exiting single user mode failed.");
@@ -1304,7 +1324,6 @@ void
CommandInterpreter::executeStart(int processId, const char* parameters,
				 bool all) 
{
  connect();
  int result;
  if(all) {
    result = ndb_mgm_start(m_mgmsrv, 0, 0);
@@ -1328,7 +1347,6 @@ void
CommandInterpreter::executeRestart(int processId, const char* parameters,
				   bool all) 
{
  connect();
  int result;
  int nostart = 0;
  int initialstart = 0;
@@ -1378,7 +1396,6 @@ CommandInterpreter::executeDumpState(int processId, const char* parameters,
    ndbout << "Expected argument" << endl;
    return;
  }
  connect();

  Uint32 no = 0;
  int pars[25];
@@ -1418,7 +1435,6 @@ CommandInterpreter::executeStatus(int processId,
    return;
  }

  connect();
  ndb_mgm_node_status status;
  Uint32 startPhase, version;
  bool system;
@@ -1469,7 +1485,6 @@ void
CommandInterpreter::executeLogLevel(int processId, const char* parameters, 
				    bool all) 
{
  connect();
  (void) all;
  
  BaseString tmp(parameters);
@@ -1525,7 +1540,6 @@ void CommandInterpreter::executeError(int processId,
    return;
  }

  connect();
  // Copy parameters since strtok will modify it
  char* newpar = my_strdup(parameters,MYF(MY_WME)); 
  My_auto_ptr<char> ap1(newpar);
@@ -1589,7 +1603,6 @@ void
CommandInterpreter::executeLog(int processId,
			       const char* parameters, bool all) 
{
  connect();
  struct ndb_mgm_reply reply;
  Vector<const char *> blocks;
  if (! parseBlockSpecification(parameters, blocks)) {
@@ -1657,7 +1670,6 @@ CommandInterpreter::executeTestOn(int processId,
    ndbout << "No parameters expected to this command." << endl;
    return;
  }
  connect();
  struct ndb_mgm_reply reply;
  int result = ndb_mgm_start_signallog(m_mgmsrv, processId, &reply);
  if (result != 0) {
@@ -1676,7 +1688,6 @@ CommandInterpreter::executeTestOff(int processId,
    ndbout << "No parameters expected to this command." << endl;
    return;
  }
  connect();
  struct ndb_mgm_reply reply;
  int result = ndb_mgm_stop_signallog(m_mgmsrv, processId, &reply);
  if (result != 0) {
@@ -1798,8 +1809,6 @@ CommandInterpreter::executeEventReporting(int processId,
    ndbout << "Expected argument" << endl;
    return;
  }
  connect();

  BaseString tmp(parameters);
  Vector<BaseString> spec;
  tmp.split(spec, "=");
@@ -1850,7 +1859,6 @@ CommandInterpreter::executeEventReporting(int processId,
void
CommandInterpreter::executeStartBackup(char* /*parameters*/) 
{
  connect();
  struct ndb_mgm_reply reply;
  unsigned int backupId;

@@ -1897,8 +1905,6 @@ CommandInterpreter::executeStartBackup(char* /*parameters*/)
void
CommandInterpreter::executeAbortBackup(char* parameters) 
{
  connect();

  strtok(parameters, " ");
  struct ndb_mgm_reply reply;
  char* id = strtok(NULL, "\0");
@@ -1952,7 +1958,6 @@ CommandInterpreter::executeRep(char* parameters)
    return;
  }

  connect();
  char * line = my_strdup(parameters,MYF(MY_WME));
  My_auto_ptr<char> ap1((char*)line);
  char * firstToken = strtok(line, " ");
+12 −7
Original line number Diff line number Diff line
@@ -56,17 +56,18 @@ handler(int sig){
  }
}


static const char default_prompt[]= "ndb_mgm> ";
static unsigned _try_reconnect;
static char *opt_connect_str= 0;
static const char *prompt= default_prompt;

static struct my_option my_long_options[] =
{
  NDB_STD_OPTS("ndb_mgm"),
  { "try-reconnect", 't',
    "Specify number of retries for connecting to ndb_mgmd, default infinite", 
    "Specify number of tries for connecting to ndb_mgmd (0 = infinite)", 
    (gptr*) &_try_reconnect, (gptr*) &_try_reconnect, 0,
    GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
    GET_UINT, REQUIRED_ARG, 3, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
};
static void short_usage_sub(void)
@@ -116,13 +117,13 @@ read_and_execute(int _try_reconnect)
  }
#ifdef HAVE_READLINE
  /* Get a line from the user. */
  line_read = readline ("ndb_mgm> ");    
  line_read = readline (prompt);    
  /* If the line has any text in it, save it on the history. */
  if (line_read && *line_read)
    add_history (line_read);
#else
  static char linebuffer[254];
  fputs("ndb_mgm> ", stdout);
  fputs(prompt, stdout);
  linebuffer[sizeof(linebuffer)-1]=0;
  line_read = fgets(linebuffer, sizeof(linebuffer)-1, stdin);
  if (line_read == linebuffer) {
@@ -155,12 +156,16 @@ int main(int argc, char** argv){
    opt_connect_str= buf;
  }

  if (!isatty(0))
  {
    prompt= 0;
  }

  ndbout << "-- NDB Cluster -- Management Client --" << endl;
  printf("Connecting to Management Server: %s\n", opt_connect_str ? opt_connect_str : "default");

  signal(SIGPIPE, handler);

  com = new Ndb_mgmclient(opt_connect_str);
  com = new Ndb_mgmclient(opt_connect_str,1);
  while(read_and_execute(_try_reconnect));
  delete com;
  
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ class CommandInterpreter;
class Ndb_mgmclient
{
public:
  Ndb_mgmclient(const char*);
  Ndb_mgmclient(const char*,int verbose=0);
  ~Ndb_mgmclient();
  int execute(const char *_line, int _try_reconnect=-1);
  int execute(int argc, char** argv, int _try_reconnect=-1);