MySQL Lists are EOL. Please join:

List:Internals« Previous MessageNext Message »
From:Petr Chardin Date:June 1 2005 8:13pm
Subject:bk commit into 5.0 tree (petr:1.1935) BUG#10229
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of cps. When cps does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1935 05/06/02 00:13:21 petr@stripped +7 -0
  fix IM to display version string in "show instance status"
  (Bug #10229) (rev.2 with several issues fixed)

  server-tools/instance-manager/parse_output.h
    1.3 05/06/02 00:13:11 petr@stripped +2 -1
    prototype changed

  server-tools/instance-manager/parse_output.cc
    1.8 05/06/02 00:13:11 petr@stripped +18 -6
    Add an option to parse_output_and_get_value in order to be
    able to get the rest of the string after the found word in
    the output of popen() (E.g. a version string).

  server-tools/instance-manager/options.cc
    1.15 05/06/02 00:13:11 petr@stripped +1 -1
    fix valgrind error

  server-tools/instance-manager/instance_options.h
    1.13 05/06/02 00:13:11 petr@stripped +8 -1
     add a version string option, and added caching of the mysqld_path length

  server-tools/instance-manager/instance_options.cc
    1.18 05/06/02 00:13:11 petr@stripped +97 -20
    compute and store the version string

  server-tools/instance-manager/commands.cc
    1.22 05/06/02 00:13:11 petr@stripped +4 -5
    send version string

  server-tools/instance-manager/buffer.h
    1.7 05/06/02 00:13:11 petr@stripped +1 -1
    fix the valgring error

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	petr
# Host:	owlet.
# Root:	/home/cps/mysql/devel/im-version-bug/mysql-5.0

--- 1.14/server-tools/instance-manager/options.cc	2005-05-16 01:53:56 +04:00
+++ 1.15/server-tools/instance-manager/options.cc	2005-06-02 00:13:11 +04:00
@@ -224,10 +224,10 @@
 
   /* config-file options are prepended to command-line ones */
   load_defaults("my", default_groups, &argc, &argv);
+  Options::saved_argv= argv;
 
   if ((rc= handle_options(&argc, &argv, my_long_options, get_one_option)) != 0)
     return rc;
-  Options::saved_argv= argv;
   return 0;
 }
 

--- 1.6/server-tools/instance-manager/buffer.h	2005-02-27 18:41:29 +03:00
+++ 1.7/server-tools/instance-manager/buffer.h	2005-06-02 00:13:11 +04:00
@@ -52,7 +52,7 @@
 
   ~Buffer()
   {
-    free(buffer);
+    my_free(buffer, MYF(0));
   }
 
 public:

--- 1.21/server-tools/instance-manager/commands.cc	2005-05-19 04:13:30 +04:00
+++ 1.22/server-tools/instance-manager/commands.cc	2005-06-02 00:13:11 +04:00
@@ -203,15 +203,14 @@
     if (!(instance= instance_map->find(instance_name, strlen(instance_name))))
       goto err;
     if (instance->is_running())
-    {
       store_to_string(&send_buff, (char*) "online", &position);
-      store_to_string(&send_buff, "unknown", &position);
-    }
     else
-    {
       store_to_string(&send_buff, (char*) "offline", &position);
+
+    if (instance->options.mysqld_version)
+      store_to_string(&send_buff, instance->options.mysqld_version, &position);
+    else
       store_to_string(&send_buff, (char*) "unknown", &position);
-    }
 
 
     if (send_buff.is_error() ||

--- 1.17/server-tools/instance-manager/instance_options.cc	2005-05-18 14:33:38 +04:00
+++ 1.18/server-tools/instance-manager/instance_options.cc	2005-06-02 00:13:11 +04:00
@@ -27,6 +27,39 @@
 #include <signal.h>
 #include <m_string.h>
 
+#ifdef __WIN__
+#define NEWLINE_LEN 2
+#else
+#define NEWLINE_LEN 1
+#endif
+
+
+/* Create "mysqld ..." command in the buffer */
+
+static inline int create_mysqld_command(Buffer *buf,
+                                        const char *mysqld_path_str,
+                                        uint mysqld_path_len,
+                                        const char *option,
+                                        uint option_len)
+{
+  int position= 0;
+
+  if (buf->get_size()) /* malloc succeeded */
+  {
+    buf->append(position, mysqld_path_str, mysqld_path_len);
+    position+= mysqld_path_len;
+    /* here the '\0' character is copied from the option string */
+    buf->append(position, option, option_len);
+
+    if (buf->is_error())
+      return 1;
+  }
+  else
+    return 1;
+
+  return 0;
+}
+
 
 /*
   Get compiled-in value of default_option
@@ -50,44 +83,85 @@
 int Instance_options::get_default_option(char *result, size_t result_len,
                                          const char *option_name)
 {
-  int position= 0;
   int rc= 1;
   char verbose_option[]= " --no-defaults --verbose --help";
 
-  Buffer cmd(strlen(mysqld_path) + sizeof(verbose_option) + 1);
-  if (cmd.get_size()) /* malloc succeeded */
-  {
-    cmd.append(position, mysqld_path, strlen(mysqld_path));
-    position+=  strlen(mysqld_path);
-    cmd.append(position, verbose_option, sizeof(verbose_option) - 1);
-    position+= sizeof(verbose_option) - 1;
-    cmd.append(position, "\0", 1);
+  /* reserve space fot the path + option + final '\0' */
+  Buffer cmd(mysqld_path_len + sizeof(verbose_option));
 
-    if (cmd.is_error())
-      goto err;
-    /* get the value from "mysqld --help --verbose" */
-    rc= parse_output_and_get_value(cmd.buffer, option_name + 2,
+  if (create_mysqld_command(&cmd, mysqld_path, mysqld_path_len,
+                            verbose_option, sizeof(verbose_option)))
+    goto err;
+
+  /* +2 eats first "--" from the option string (E.g. "--datadir") */
+  rc= parse_output_and_get_value(cmd.buffer, option_name + 2,
                                    result, result_len);
+
+  return rc;
+err:
+  return 1;
+}
+
+
+/*
+  Fill mysqld_version option (used at initialization stage)
+
+  SYNOPSYS
+    fill_instance_version()
+
+  DESCRIPTION
+
+  Get mysqld version string from "mysqld --version" output.
+
+  RETURN
+    0 - ok
+    1 - error occured
+*/
+
+int Instance_options::fill_instance_version()
+{
+  enum { MAX_VERSION_STRING_LENGTH= 160 };
+  enum { RETURN_LINE= 1 };
+  char result[MAX_VERSION_STRING_LENGTH];
+  char version_option[]= " --no-defaults --version";
+  int rc= 1;
+  Buffer cmd(mysqld_path_len + sizeof(version_option));
+
+  bzero(result, MAX_VERSION_STRING_LENGTH);
+
+  if (create_mysqld_command(&cmd, mysqld_path, mysqld_path_len,
+                            version_option, sizeof(version_option)))
+    goto err;
+
+  rc= parse_output_and_get_value(cmd.buffer, mysqld_path,
+                                 result, MAX_VERSION_STRING_LENGTH,
+                                 RETURN_LINE);
+
+  if (*result != '\0')
+  {
+    /* chop the newline from the end of the version string */
+    result[strlen(result) - NEWLINE_LEN]= '\0';
+    mysqld_version= strdup_root(&alloc, result);
   }
 
   return rc;
+
 err:
   return 1;
 }
 
 
 /*
-  Get compiled-in value of default_option
+  Fill various log options
 
   SYNOPSYS
-    get_default_option()
-    result            buffer to put found value
-    result_len        buffer size
-    option_name       the name of the option, prefixed with "--"
+    fill_log_options()
 
   DESCRIPTION
 
-   Get compile-in value of requested option from server
+  Compute paths to enabled log files. If the path is not specified in the
+  instance explicitly (I.e. log=/home/user/mysql.log), we try to guess the
+  file name and placement.
 
   RETURN
     0 - ok
@@ -276,6 +350,8 @@
       goto err;
   }
 
+  mysqld_path_len= strlen(mysqld_path);
+
   if (mysqld_port)
     mysqld_port_val= atoi(strchr(mysqld_port, '=') + 1);
 
@@ -330,7 +406,8 @@
          options_array.elements*sizeof(char*));
   argv[filled_default_options + options_array.elements]= 0;
 
-  fill_log_options();
+  if (fill_log_options() || fill_instance_version())
+    goto err;
 
   return 0;
 

--- 1.12/server-tools/instance-manager/instance_options.h	2005-05-16 01:53:56 +04:00
+++ 1.13/server-tools/instance-manager/instance_options.h	2005-06-02 00:13:11 +04:00
@@ -38,7 +38,7 @@
 {
 public:
   Instance_options() :
-    mysqld_socket(0), mysqld_datadir(0),
+    mysqld_version(0), mysqld_socket(0), mysqld_datadir(0),
     mysqld_bind_address(0), mysqld_pid_file(0), mysqld_port(0),
     mysqld_port_val(0), mysqld_path(0), nonguarded(0), shutdown_delay(0),
     shutdown_delay_val(0), filled_default_options(0)
@@ -64,6 +64,11 @@
   enum { MEM_ROOT_BLOCK_SIZE= 512 };
   char pid_file_with_path[MAX_PATH_LEN];
   char **argv;
+  /*
+    Here we cache the version string, obtained from mysqld --version.
+    In the case when mysqld binary is not found we get "unknown" here.
+  */
+  const char *mysqld_version;
   /* We need the some options, so we store them as a separate pointers */
   const char *mysqld_socket;
   const char *mysqld_datadir;
@@ -74,6 +79,7 @@
   const char *instance_name;
   uint instance_name_len;
   const char *mysqld_path;
+  uint mysqld_path_len;
   const char *nonguarded;
   const char *shutdown_delay;
   uint shutdown_delay_val;
@@ -84,6 +90,7 @@
   DYNAMIC_ARRAY options_array;
 private:
   int fill_log_options();
+  int fill_instance_version();
   int add_to_argv(const char *option);
   int get_default_option(char *result, size_t result_len,
                          const char *option_name);

--- 1.7/server-tools/instance-manager/parse_output.cc	2005-04-09 14:28:34 +04:00
+++ 1.8/server-tools/instance-manager/parse_output.cc	2005-06-02 00:13:11 +04:00
@@ -32,10 +32,13 @@
     word         the word to look for (usually an option name)
     result       the buffer to store the next word (option value)
     result_len   self-explanatory
+    get_all_line flag, which is set if we want to get all the line after
+                 the matched word.
 
   DESCRIPTION
 
     Parse output of the "command". Find the "word" and return the next one
+    if get_all_line is 0. Return the rest of the parsed string otherwise.
 
   RETURN
     0 - ok
@@ -43,7 +46,8 @@
 */
 
 int parse_output_and_get_value(const char *command, const char *word,
-                               char *result, size_t result_len)
+                               char *result, size_t result_len,
+                               int get_all_line)
 {
   FILE *output;
   uint wordlen;
@@ -81,11 +85,19 @@
         an option value.
       */
       linep+= lineword_len;                     /* swallow the previous one */
-      get_word((const char **) &linep, &lineword_len, NONSPACE);
-      if (result_len <= lineword_len)
-        goto err;
-      strncpy(result, linep, lineword_len);
-      result[lineword_len]= '\0';
+      if (!get_all_line)
+      {
+        get_word((const char **) &linep, &lineword_len, NONSPACE);
+        if (result_len <= lineword_len)
+          goto err;
+        strncpy(result, linep, lineword_len);
+        result[lineword_len]= '\0';
+      }
+      else
+      {
+        strncpy(result, linep, result_len);
+        result[result_len]= '\0'; /* safety */
+      }
       goto pclose;
     }
   }

--- 1.2/server-tools/instance-manager/parse_output.h	2005-04-09 14:28:34 +04:00
+++ 1.3/server-tools/instance-manager/parse_output.h	2005-06-02 00:13:11 +04:00
@@ -17,6 +17,7 @@
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
 int parse_output_and_get_value(const char *command, const char *word,
-                               char *result, size_t result_len);
+                               char *result, size_t result_len,
+                               int get_all_line= 0);
 
 #endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_PARSE_OUTPUT_H */
Thread
bk commit into 5.0 tree (petr:1.1935) BUG#10229Petr Chardin1 Jun