diff options
author | unknown <thek@kpdesk.mysql.com> | 2006-11-02 08:47:21 +0100 |
---|---|---|
committer | unknown <thek@kpdesk.mysql.com> | 2006-11-02 08:47:21 +0100 |
commit | dfc8d06c186692db815371f05fc53a2bba1eb48f (patch) | |
tree | 0dd1b4b2ac91bb32d567b5e70724f511710ac3c7 | |
parent | 5b063712f0cf7d6a11438705b08a0a7c53c8f694 (diff) | |
parent | 35f18203585d569a6df941536159b0806a19f8ff (diff) | |
download | mariadb-git-dfc8d06c186692db815371f05fc53a2bba1eb48f.tar.gz |
Merge kpdesk.mysql.com:/home/thek/dev/mysql-5.0-maint
into kpdesk.mysql.com:/home/thek/dev/mysql-5.1-maint
client/mysqltest.c:
Auto merged
mysql-test/lib/mtr_io.pl:
Auto merged
mysql-test/lib/mtr_process.pl:
Auto merged
mysql-test/mysql-test-run.pl:
Auto merged
mysys/mf_iocache.c:
Auto merged
mysys/my_lock.c:
Auto merged
mysys/my_seek.c:
Auto merged
sql/sql_delete.cc:
Auto merged
sql/sql_show.cc:
Auto merged
-rw-r--r-- | client/mysqltest.c | 36 | ||||
-rw-r--r-- | mysql-test/include/wait_for_query_to_suceed.inc | 25 | ||||
-rw-r--r-- | mysql-test/lib/mtr_io.pl | 12 | ||||
-rw-r--r-- | mysql-test/lib/mtr_process.pl | 40 | ||||
-rwxr-xr-x | mysql-test/mysql-test-run.pl | 18 | ||||
-rw-r--r-- | mysql-test/t/rename.test | 11 | ||||
-rw-r--r-- | mysys/mf_iocache.c | 102 | ||||
-rw-r--r-- | mysys/my_chsize.c | 6 | ||||
-rw-r--r-- | mysys/my_lock.c | 39 | ||||
-rw-r--r-- | mysys/my_seek.c | 26 |
10 files changed, 244 insertions, 71 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index 9f41586afae..7c1ce19283f 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -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 *command) 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 *command) 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 *command) 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 *ds, 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 *command) 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", diff --git a/mysql-test/include/wait_for_query_to_suceed.inc b/mysql-test/include/wait_for_query_to_suceed.inc new file mode 100644 index 00000000000..6ac1144620e --- /dev/null +++ b/mysql-test/include/wait_for_query_to_suceed.inc @@ -0,0 +1,25 @@ +# +# Run a query over and over until it suceeds ot timeout occurs +# + + +let $counter= 100; + +disable_abort_on_error; +disable_query_log; +disable_result_log; +eval $query; +while ($mysql_errno) +{ + eval $query; + sleep 0.1; + dec $counter; + + if (!$counter) + { + die("Waited too long for query to suceed"); + } +} +enable_abort_on_error; +enable_query_log; +enable_result_log; diff --git a/mysql-test/lib/mtr_io.pl b/mysql-test/lib/mtr_io.pl index a1d7ffe87d8..984d834486c 100644 --- a/mysql-test/lib/mtr_io.pl +++ b/mysql-test/lib/mtr_io.pl @@ -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. " . diff --git a/mysql-test/lib/mtr_process.pl b/mysql-test/lib/mtr_process.pl index affe8278376..048c336f8a3 100644 --- a/mysql-test/lib/mtr_process.pl +++ b/mysql-test/lib/mtr_process.pl @@ -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"; - mtr_debug("Got pid: $pid from file '$pidfile'"); + if ( -f $pidfile ) + { + mtr_debug("Processing PID 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."); - } + my $pid= mtr_get_pid_from_file($pidfile); + + 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); diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 3e25d6e933c..de2498a7246 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -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 diff --git a/mysql-test/t/rename.test b/mysql-test/t/rename.test index 054b1bd3403..5c750711853 100644 --- a/mysql-test/t/rename.test +++ b/mysql-test/t/rename.test @@ -43,8 +43,8 @@ select * from t3; drop table if exists t1,t2,t3,t4; # -# Test-case for Bug #2397 RENAME TABLES is not blocked by -# FLUSH TABLES WITH READ LOCK +# Bug #2397 RENAME TABLES is not blocked by +# FLUSH TABLES WITH READ LOCK # connect (con1,localhost,root,,); @@ -58,12 +58,17 @@ FLUSH TABLES WITH READ LOCK; connection con1; send RENAME TABLE t1 TO t2, t3 to t4; connection con2; -sleep 1; show tables; UNLOCK TABLES; connection con1; reap; connection con2; + +# Wait for the the tables to be renamed +# i.e the query below succeds +let $query= select * from t2, t4; +source include/wait_for_query_to_suceed.inc; + show tables; drop table t2, t4; diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index 4559c0c42b0..249eaf48ad2 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -445,11 +445,24 @@ int _my_b_read(register IO_CACHE *info, byte *Buffer, uint Count) /* 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 *cache, byte *Buffer, uint Count) 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 *write_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 *info, byte *Buffer, uint Count) 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, byte *Buffer, uint Count) 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, const byte *Buffer, uint Count) { /* 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)) diff --git a/mysys/my_chsize.c b/mysys/my_chsize.c index fe0d0ffa607..4b26085c870 100644 --- a/mysys/my_chsize.c +++ b/mysys/my_chsize.c @@ -86,7 +86,11 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) Fill space between requested length and true length with 'filler' We should never come here on any modern machine */ - VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE))); + if (my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)) + == MY_FILEPOS_ERROR) + { + goto err; + } swap_variables(my_off_t, newlength, oldsize); #endif } diff --git a/mysys/my_lock.c b/mysys/my_lock.c index 919727e03d6..ac91b6ce0ca 100644 --- a/mysys/my_lock.c +++ b/mysys/my_lock.c @@ -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_off_t start, my_off_t length, #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_off_t start, my_off_t length, } #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 */ diff --git a/mysys/my_seek.c b/mysys/my_seek.c index 239136c4e7c..269d1a65b31 100644 --- a/mysys/my_seek.c +++ b/mysys/my_seek.c @@ -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))) |