List:Commits« Previous MessageNext Message »
From:kpettersson Date:November 2 2006 8:47am
Subject:bk commit into 5.1 tree (thek:1.2341)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of thek. When thek 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@stripped, 2006-11-02 08:47:21+01:00, thek@stripped +9 -0
  Merge kpdesk.mysql.com:/home/thek/dev/mysql-5.0-maint
  into  kpdesk.mysql.com:/home/thek/dev/mysql-5.1-maint
  MERGE: 1.1810.2078.88

  client/mysqltest.c@stripped, 2006-11-02 08:47:16+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.155.9.64

  mysql-test/lib/mtr_io.pl@stripped, 2006-11-02 08:47:16+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.3.1.4

  mysql-test/lib/mtr_process.pl@stripped, 2006-11-02 08:47:16+01:00, thek@stripped +0 -1
    Auto merged
    MERGE: 1.25.2.15

  mysql-test/mysql-test-run.pl@stripped, 2006-11-02 08:47:16+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.30.1.109

  mysys/mf_iocache.c@stripped, 2006-11-02 08:47:17+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.56.1.2

  mysys/my_lock.c@stripped, 2006-11-02 08:47:17+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.12.1.1

  mysys/my_seek.c@stripped, 2006-11-02 08:47:17+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.11.1.3

  sql/sql_delete.cc@stripped, 2006-11-02 08:47:17+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.144.1.37

  sql/sql_show.cc@stripped, 2006-11-02 08:47:17+01:00, thek@stripped +0 -0
    Auto merged
    MERGE: 1.253.1.78

# 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:	thek
# Host:	kpdesk.mysql.com
# Root:	/home/thek/dev/mysql-5.1-maint/RESYNC

--- 1.58/mysys/mf_iocache.c	2006-11-02 08:47:28 +01:00
+++ 1.59/mysys/mf_iocache.c	2006-11-02 08:47:28 +01:00
@@ -445,11 +445,24 @@ int _my_b_read(register IO_CACHE *info, 
 
   /* pos_in_file always point on where info->buffer was read */
   pos_in_file=info->pos_in_file+(uint) (info->read_end - info->buffer);
+
+  /* 
+    Whenever a function which operates on IO_CACHE flushes/writes
+    some part of the IO_CACHE to disk it will set the property
+    "seek_not_done" to indicate this to other functions operating
+    on the IO_CACHE.
+  */
   if (info->seek_not_done)
-  {					/* File touched, do seek */
-    VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)));
+  {
+    if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) 
+        == MY_FILEPOS_ERROR)
+    {
+        info->error= -1;
+        DBUG_RETURN(1);
+    }
     info->seek_not_done=0;
   }
+
   diff_length=(uint) (pos_in_file & (IO_SIZE-1));
   if (Count >= (uint) (IO_SIZE+(IO_SIZE-diff_length)))
   {					/* Fill first intern buffer */
@@ -950,8 +963,22 @@ int _my_b_read_r(register IO_CACHE *cach
         len= 0;
       else
       {
-        if (cache->seek_not_done)             /* File touched, do seek */
-          VOID(my_seek(cache->file, pos_in_file, MY_SEEK_SET, MYF(0)));
+        /*
+          Whenever a function which operates on IO_CACHE flushes/writes
+          some part of the IO_CACHE to disk it will set the property
+          "seek_not_done" to indicate this to other functions operating
+          on the IO_CACHE.
+        */
+        if (cache->seek_not_done)
+        {
+          if (my_seek(cache->file, pos_in_file, MY_SEEK_SET, MYF(0))
+              == MY_FILEPOS_ERROR)
+          {
+            cache->error= -1;
+            unlock_io_cache(cache);
+            DBUG_RETURN(1);
+          }
+        }
         len= (int) my_read(cache->file, cache->buffer, length, cache->myflags);
       }
       DBUG_PRINT("io_cache_share", ("read %d bytes", len));
@@ -1053,11 +1080,16 @@ static void copy_to_read_buffer(IO_CACHE
 
 
 /*
-  Do sequential read from the SEQ_READ_APPEND cache
-  we do this in three stages:
+  Do sequential read from the SEQ_READ_APPEND cache.
+  
+  We do this in three stages:
    - first read from info->buffer
    - then if there are still data to read, try the file descriptor
    - afterwards, if there are still data to read, try append buffer
+
+  RETURNS
+    0  Success
+    1  Failed to read
 */
 
 int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count)
@@ -1085,7 +1117,13 @@ int _my_b_seq_read(register IO_CACHE *in
     With read-append cache we must always do a seek before we read,
     because the write could have moved the file pointer astray
   */
-  VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)));
+  if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0))
+      == MY_FILEPOS_ERROR)
+  {
+   info->error= -1;
+   unlock_append_buffer(info);
+   return (1);
+  }
   info->seek_not_done=0;
 
   diff_length=(uint) (pos_in_file & (IO_SIZE-1));
@@ -1201,6 +1239,21 @@ read_append_buffer:
 
 #ifdef HAVE_AIOWAIT
 
+/*
+  Read from the IO_CACHE into a buffer and feed asynchronously
+  from disk when needed.
+
+  SYNOPSIS
+    _my_b_async_read()
+      info                      IO_CACHE pointer
+      Buffer                    Buffer to retrieve count bytes from file
+      Count                     Number of bytes to read into Buffer
+
+  RETURN VALUE
+    -1          An error has occurred; my_errno is set.
+     0          Success
+     1          An error has occurred; IO_CACHE to error state.
+*/
 int _my_b_async_read(register IO_CACHE *info, byte *Buffer, uint Count)
 {
   uint length,read_length,diff_length,left_length,use_length,org_Count;
@@ -1291,13 +1344,20 @@ int _my_b_async_read(register IO_CACHE *
       info->error=(int) (read_length+left_length);
       return 1;
     }
-    VOID(my_seek(info->file,next_pos_in_file,MY_SEEK_SET,MYF(0)));
+    
+    if (my_seek(info->file,next_pos_in_file,MY_SEEK_SET,MYF(0))
+        == MY_FILEPOS_ERROR)
+    {
+      info->error= -1;
+      return (1);
+    }
+
     read_length=IO_SIZE*2- (uint) (next_pos_in_file & (IO_SIZE-1));
     if (Count < read_length)
     {					/* Small block, read to cache */
       if ((read_length=my_read(info->file,info->request_pos,
 			       read_length, info->myflags)) == (uint) -1)
-	return info->error= -1;
+        return info->error= -1;
       use_length=min(Count,read_length);
       memcpy(Buffer,info->request_pos,(size_t) use_length);
       info->read_pos=info->request_pos+Count;
@@ -1384,7 +1444,15 @@ int _my_b_get(IO_CACHE *info)
   return (int) (uchar) buff;
 }
 
-	/* Returns != 0 if error on write */
+/* 
+   Write a byte buffer to IO_CACHE and flush to disk
+   if IO_CACHE is full.
+
+   RETURN VALUE
+    1 On error on write
+    0 On success
+   -1 On error; my_errno contains error code.
+*/
 
 int _my_b_write(register IO_CACHE *info, const byte *Buffer, uint Count)
 {
@@ -1408,8 +1476,18 @@ int _my_b_write(register IO_CACHE *info,
   {					/* Fill first intern buffer */
     length=Count & (uint) ~(IO_SIZE-1);
     if (info->seek_not_done)
-    {					/* File touched, do seek */
-      VOID(my_seek(info->file,info->pos_in_file,MY_SEEK_SET,MYF(0)));
+    {
+      /*
+        Whenever a function which operates on IO_CACHE flushes/writes
+        some part of the IO_CACHE to disk it will set the property
+        "seek_not_done" to indicate this to other functions operating
+        on the IO_CACHE.
+      */
+      if (my_seek(info->file,info->pos_in_file,MY_SEEK_SET,MYF(0)))
+      {
+        info->error= -1;
+        return (1);
+      }
       info->seek_not_done=0;
     }
     if (my_write(info->file,Buffer,(uint) length,info->myflags | MY_NABP))

--- 1.13/mysys/my_lock.c	2006-11-02 08:47:28 +01:00
+++ 1.14/mysys/my_lock.c	2006-11-02 08:47:28 +01:00
@@ -30,7 +30,14 @@
 #include <nks/fsio.h>
 #endif
 
-	/* Lock a part of a file */
+/* 
+  Lock a part of a file 
+
+  RETURN VALUE
+    0   Success
+    -1  An error has occured and 'my_errno' is set
+        to indicate the actual error code.
+*/
 
 int my_lock(File fd, int locktype, my_off_t start, my_off_t length,
 	    myf MyFlags)
@@ -94,10 +101,22 @@ int my_lock(File fd, int locktype, my_of
 #elif defined(HAVE_LOCKING)
   /* Windows */
   {
-    my_bool error;
+    my_bool error= false;
     pthread_mutex_lock(&my_file_info[fd].mutex);
-    if (MyFlags & MY_SEEK_NOT_DONE)
-      VOID(my_seek(fd,start,MY_SEEK_SET,MYF(MyFlags & ~MY_SEEK_NOT_DONE)));
+    if (MyFlags & MY_SEEK_NOT_DONE) 
+    {
+      if( my_seek(fd,start,MY_SEEK_SET,MYF(MyFlags & ~MY_SEEK_NOT_DONE))
+           == MY_FILEPOS_ERROR )
+      {
+        /*
+          If my_seek fails my_errno will already contain an error code;
+          just unlock and return error code.
+         */
+        DBUG_PRINT("error",("my_errno: %d (%d)",my_errno,errno));
+        pthread_mutex_unlock(&my_file_info[fd].mutex);
+        DBUG_RETURN(-1);
+      }
+    }
     error= locking(fd,locktype,(ulong) length) && errno != EINVAL;
     pthread_mutex_unlock(&my_file_info[fd].mutex);
     if (!error)
@@ -135,7 +154,17 @@ int my_lock(File fd, int locktype, my_of
   }
 #else
   if (MyFlags & MY_SEEK_NOT_DONE)
-    VOID(my_seek(fd,start,MY_SEEK_SET,MYF(MyFlags & ~MY_SEEK_NOT_DONE)));
+  {
+    if (my_seek(fd,start,MY_SEEK_SET,MYF(MyFlags & ~MY_SEEK_NOT_DONE))
+        == MY_FILEPOS_ERROR)
+    {
+      /*
+        If an error has occured in my_seek then we will already
+        have an error code in my_errno; Just return error code.
+      */
+      DBUG_RETURN(-1);
+    }
+  }
   if (lockf(fd,locktype,length) != -1)
     DBUG_RETURN(0);
 #endif /* HAVE_FCNTL */

--- 1.14/mysys/my_seek.c	2006-11-02 08:47:28 +01:00
+++ 1.15/mysys/my_seek.c	2006-11-02 08:47:28 +01:00
@@ -16,8 +16,30 @@
 
 #include "mysys_priv.h"
 
-	/* Seek to position in file */
-	/*ARGSUSED*/
+/* 
+  Seek to a position in a file.
+
+  ARGUMENTS
+  File fd          The file descriptor
+  my_off_t pos     The expected position (absolute or relative)
+  int whence       A direction parameter and one of 
+                   {SEEK_SET, SEEK_CUR, SEEK_END}
+  myf MyFlags      Not used.
+
+  DESCRIPTION
+    The my_seek  function  is a wrapper around the system call lseek and
+    repositions  the  offset of the file descriptor fd to the argument 
+    offset according to the directive whence as follows:
+      SEEK_SET    The offset is set to offset bytes.
+      SEEK_CUR    The offset is set to its current location plus offset bytes
+      SEEK_END    The offset is set to the size of the file plus offset bytes
+
+  RETURN VALUE
+    my_off_t newpos    The new position in the file.
+    MY_FILEPOS_ERROR   An error was encountered while performing 
+                       the seek. my_errno is set to indicate the
+                       actual error.
+*/
 
 my_off_t my_seek(File fd, my_off_t pos, int whence,
 		 myf MyFlags __attribute__((unused)))

--- 1.7/mysql-test/lib/mtr_io.pl	2006-11-02 08:47:28 +01:00
+++ 1.8/mysql-test/lib/mtr_io.pl	2006-11-02 08:47:28 +01:00
@@ -37,18 +37,16 @@ sub mtr_get_pid_from_file ($) {
     open(FILE, '<', $pid_file_path)
       or mtr_error("can't open file \"$pid_file_path\": $!");
 
+    # Read pid number from file
     my $pid= <FILE>;
-
-    chomp($pid) if defined $pid;
-
     close FILE;
 
-    return $pid if defined $pid && $pid ne '';
+    return $pid if $pid=~ /^(\d+)/;
 
-    mtr_debug("Pid file '$pid_file_path' is empty. " .
-              "Sleeping $timeout second(s)...");
+    mtr_debug("Pid file '$pid_file_path' does not yet contain pid number.\n" .
+              "Sleeping $timeout second(s) more...");
 
-    sleep(1);
+    sleep($timeout);
   }
 
   mtr_error("Pid file '$pid_file_path' is corrupted. " .

--- 1.58/mysql-test/lib/mtr_process.pl	2006-11-02 08:47:28 +01:00
+++ 1.59/mysql-test/lib/mtr_process.pl	2006-11-02 08:47:28 +01:00
@@ -438,25 +438,35 @@ sub mtr_kill_leftovers () {
 
     while ( my $elem= readdir(RUNDIR) )
     {
-      my $pidfile= "$rundir/$elem";
-
-      if ( -f $pidfile )
+      # Only read pid from files that end with .pid
+      if ( $elem =~ /.*[.]pid$/)
       {
-        mtr_debug("Processing PID file: '$pidfile'...");
 
-        my $pid= mtr_get_pid_from_file($pidfile);
+	my $pidfile= "$rundir/$elem";
+
+	if ( -f $pidfile )
+	{
+	  mtr_debug("Processing PID file: '$pidfile'...");
 
-        mtr_debug("Got pid: $pid from file '$pidfile'");
+	  my $pid= mtr_get_pid_from_file($pidfile);
 
-        if ( $::glob_cygwin_perl or kill(0, $pid) )
-        {
-          mtr_debug("There is process with pid $pid -- scheduling for kill.");
-          push(@pids, $pid);            # We know (cygwin guess) it exists
-        }
-        else
-        {
-          mtr_debug("There is no process with pid $pid -- skipping.");
-        }
+	  mtr_debug("Got pid: $pid from file '$pidfile'");
+
+	  if ( $::glob_cygwin_perl or kill(0, $pid) )
+	  {
+	    mtr_debug("There is process with pid $pid -- scheduling for kill.");
+	    push(@pids, $pid);            # We know (cygwin guess) it exists
+	  }
+	  else
+	  {
+	    mtr_debug("There is no process with pid $pid -- skipping.");
+	  }
+	}
+      }
+      else
+      {
+	mtr_warning("Found non pid file $elem in $rundir");
+	next;
       }
     }
     closedir(RUNDIR);

--- 1.214/mysql-test/mysql-test-run.pl	2006-11-02 08:47:28 +01:00
+++ 1.215/mysql-test/mysql-test-run.pl	2006-11-02 08:47:28 +01:00
@@ -1801,14 +1801,16 @@ sub environment_setup () {
   # ----------------------------------------------------
   # Setup env so childs can execute mysql_fix_system_tables
   # ----------------------------------------------------
-  my $cmdline_mysql_fix_system_tables=
-    "$exe_mysql_fix_system_tables --no-defaults --host=localhost " .
-    "--user=root --password= " .
-    "--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " .
-    "--port=$master->[0]->{'port'} " .
-    "--socket=$master->[0]->{'path_sock'}";
-
-  $ENV{'MYSQL_FIX_SYSTEM_TABLES'}=  $cmdline_mysql_fix_system_tables;
+  if ( ! $glob_win32 )
+  {
+    my $cmdline_mysql_fix_system_tables=
+      "$exe_mysql_fix_system_tables --no-defaults --host=localhost " .
+      "--user=root --password= " .
+      "--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " .
+      "--port=$master->[0]->{'port'} " .
+      "--socket=$master->[0]->{'path_sock'}";
+    $ENV{'MYSQL_FIX_SYSTEM_TABLES'}=  $cmdline_mysql_fix_system_tables;
+  }
 
   # ----------------------------------------------------
   # Setup env so childs can execute my_print_defaults

--- 1.242/client/mysqltest.c	2006-11-02 08:47:28 +01:00
+++ 1.243/client/mysqltest.c	2006-11-02 08:47:28 +01:00
@@ -1409,7 +1409,7 @@ int open_file(const char *name)
 
 void do_source(struct st_command *command)
 {
-  DYNAMIC_STRING ds_filename;
+  static DYNAMIC_STRING ds_filename;
   const struct command_arg source_args[] = {
     "filename", ARG_STRING, TRUE, &ds_filename, "File to source"
   };
@@ -1697,7 +1697,7 @@ void do_system(struct st_command *comman
 void do_remove_file(struct st_command *command)
 {
   int error;
-  DYNAMIC_STRING ds_filename;
+  static DYNAMIC_STRING ds_filename;
   const struct command_arg rm_args[] = {
     "filename", ARG_STRING, TRUE, &ds_filename, "File to delete"
   };
@@ -1730,8 +1730,8 @@ void do_remove_file(struct st_command *c
 void do_copy_file(struct st_command *command)
 {
   int error;
-  DYNAMIC_STRING ds_from_file;
-  DYNAMIC_STRING ds_to_file;
+  static DYNAMIC_STRING ds_from_file;
+  static DYNAMIC_STRING ds_to_file;
   const struct command_arg copy_file_args[] = {
     "from_file", ARG_STRING, TRUE, &ds_from_file, "Filename to copy from",
     "to_file", ARG_STRING, TRUE, &ds_to_file, "Filename to copy to"
@@ -1766,7 +1766,7 @@ void do_copy_file(struct st_command *com
 void do_file_exist(struct st_command *command)
 {
   int error;
-  DYNAMIC_STRING ds_filename;
+  static DYNAMIC_STRING ds_filename;
   const struct command_arg file_exist_args[] = {
     "filename", ARG_STRING, TRUE, &ds_filename, "File to check if it exist"
   };
@@ -1873,9 +1873,9 @@ void read_until_delimiter(DYNAMIC_STRING
 
 void do_write_file(struct st_command *command)
 {
-  DYNAMIC_STRING ds_content;
-  DYNAMIC_STRING ds_filename;
-  DYNAMIC_STRING ds_delimiter;
+  static DYNAMIC_STRING ds_content;
+  static DYNAMIC_STRING ds_filename;
+  static DYNAMIC_STRING ds_delimiter;
   const struct command_arg write_file_args[] = {
     "filename", ARG_STRING, TRUE, &ds_filename, "File to write to",
     "delimiter", ARG_STRING, FALSE, &ds_delimiter, "Delimiter to read until"
@@ -1927,8 +1927,8 @@ void do_perl(struct st_command *command)
   int error;
   char buf[FN_REFLEN];
   FILE *res_file;
-  DYNAMIC_STRING ds_script;
-  DYNAMIC_STRING ds_delimiter;
+  static DYNAMIC_STRING ds_script;
+  static DYNAMIC_STRING ds_delimiter;
   const struct command_arg perl_args[] = {
     "delimiter", ARG_STRING, FALSE, &ds_delimiter, "Delimiter to read until"
   };
@@ -2985,14 +2985,14 @@ void do_connect(struct st_command *comma
   bool con_ssl= 0, con_compress= 0;
   char *ptr;
 
-  DYNAMIC_STRING ds_connection_name;
-  DYNAMIC_STRING ds_host;
-  DYNAMIC_STRING ds_user;
-  DYNAMIC_STRING ds_password;
-  DYNAMIC_STRING ds_database;
-  DYNAMIC_STRING ds_port;
-  DYNAMIC_STRING ds_sock;
-  DYNAMIC_STRING ds_options;
+  static DYNAMIC_STRING ds_connection_name;
+  static DYNAMIC_STRING ds_host;
+  static DYNAMIC_STRING ds_user;
+  static DYNAMIC_STRING ds_password;
+  static DYNAMIC_STRING ds_database;
+  static DYNAMIC_STRING ds_port;
+  static DYNAMIC_STRING ds_sock;
+  static DYNAMIC_STRING ds_options;
   const struct command_arg connect_args[] = {
     "connection name", ARG_STRING, TRUE, &ds_connection_name,
     "Name of the connection",
Thread
bk commit into 5.1 tree (thek:1.2341)kpettersson2 Nov