From: Dmitry Shulga Date: August 10 2010 7:02am Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3470) Bug#29751 List-Archive: http://lists.mysql.com/commits/115365 X-Bug: 29751 Message-Id: <0L6X008SRCW30Z40@fe-emea-13.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_c6tXVMYjzWplOP5Kkr8EHw)" --Boundary_(ID_c6tXVMYjzWplOP5Kkr8EHw) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///Users/shulga/projects/mysql/5.1-bugteam-bug29751/ based on revid:davi.arnaut@stripped 3470 Dmitry Shulga 2010-08-10 Fixed bug #29751 - do not rename the error log at FLUSH LOGS. Added open log file with FILE_SHARE_DELETE flag on Windows. @ sql/log.cc added reopen_fstreams(); modified redirect_std_streams(): call to sequence of freopen() replaced to reopen_fstreams(); modified flush_error_log(): removed file rename for flushed error log file. @ sql/mysqld.cc modified main() and init_server_components(): do open log error file over call to reopen_fstreams(). modified: sql/log.cc sql/mysqld.cc === modified file 'sql/log.cc' --- a/sql/log.cc 2010-07-20 18:07:36 +0000 +++ b/sql/log.cc 2010-08-10 07:02:17 +0000 @@ -5050,70 +5050,94 @@ void sql_perror(const char *message) } +#ifdef __WIN__ +extern "C" my_bool reopen_fstreams(const char * filename, FILE *outstream, FILE *errstream) +{ + int handle_fd; /* handle of opened file */ + int stream_fd; + HANDLE osfh; /* OS handle of opened file */ + + if (!filename || (!outstream && !errstream)) + { + errno= EINVAL; + return TRUE; + } + + if ((osfh= CreateFile(filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE | + FILE_SHARE_DELETE, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) + return TRUE; + + if ((handle_fd= _open_osfhandle((intptr_t)osfh, _O_APPEND | _O_TEXT)) == -1) + { + CloseHandle(osfh); + return TRUE; + } + + if (outstream) + { + stream_fd= _fileno(outstream); + if (_dup2(handle_fd, stream_fd) < 0) + { + CloseHandle(osfh); + return TRUE; + } + } + + if (errstream) + { + stream_fd= _fileno(errstream); + if (_dup2(handle_fd, stream_fd) < 0) + { + CloseHandle(osfh); + return TRUE; + } + } + + _close(handle_fd); + return FALSE; +} +#else +extern "C" my_bool reopen_fstreams(const char * filename, FILE *outstream, FILE *errstream) +{ + if (outstream && !freopen(filename,"a+",outstream)) + return TRUE; + + if (errstream && !freopen(filename,"a+",errstream)) + return TRUE; + + return FALSE; +} +#endif + + /* Unfortunately, there seems to be no good way to restore the original streams upon failure. */ static bool redirect_std_streams(const char *file) { - if (freopen(file, "a+", stdout) && freopen(file, "a+", stderr)) - { - setbuf(stderr, NULL); - return FALSE; - } + if (reopen_fstreams(file, stdout, stderr)) + return TRUE; - return TRUE; + setbuf(stderr, NULL); + return FALSE; } bool flush_error_log() { - bool result=0; + bool result= 0; if (opt_error_log) { - char err_renamed[FN_REFLEN], *end; - end= strmake(err_renamed,log_error_file,FN_REFLEN-5); - strmov(end, "-old"); VOID(pthread_mutex_lock(&LOCK_error_log)); -#ifdef __WIN__ - char err_temp[FN_REFLEN+5]; - /* - On Windows is necessary a temporary file for to rename - the current error file. - */ - strxmov(err_temp, err_renamed,"-tmp",NullS); - (void) my_delete(err_temp, MYF(0)); - if (freopen(err_temp,"a+",stdout)) - { - int fd; - size_t bytes; - uchar buf[IO_SIZE]; - - freopen(err_temp,"a+",stderr); - setbuf(stderr, NULL); - (void) my_delete(err_renamed, MYF(0)); - my_rename(log_error_file,err_renamed,MYF(0)); - redirect_std_streams(log_error_file); - - if ((fd = my_open(err_temp, O_RDONLY, MYF(0))) >= 0) - { - while ((bytes= my_read(fd, buf, IO_SIZE, MYF(0))) && - bytes != MY_FILE_ERROR) - my_fwrite(stderr, buf, bytes, MYF(0)); - my_close(fd, MYF(0)); - } - (void) my_delete(err_temp, MYF(0)); - } - else - result= 1; -#else - my_rename(log_error_file,err_renamed,MYF(0)); - if (redirect_std_streams(log_error_file)) - result= 1; -#endif + if (redirect_std_streams(log_error_file)) + result= 1; VOID(pthread_mutex_unlock(&LOCK_error_log)); } - return result; + return result; } void MYSQL_BIN_LOG::signal_update() === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-07-21 10:14:11 +0000 +++ b/sql/mysqld.cc 2010-08-10 07:02:17 +0000 @@ -199,6 +199,8 @@ typedef fp_except fp_except_t; # endif #endif +extern "C" my_bool reopen_fstreams(const char * filename, FILE *outstream, FILE *errstream); + inline void setup_fpu() { #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) @@ -3821,13 +3823,15 @@ static int init_server_components() opt_error_log= 1; // Too long file name else { + my_bool res; #ifndef EMBEDDED_LIBRARY - if (freopen(log_error_file, "a+", stdout)) + res= reopen_fstreams(log_error_file, stdout, stderr); +#else + res= reopen_fstreams(log_error_file, NULL, stderr); #endif - { - if (freopen(log_error_file, "a+", stderr)) - setbuf(stderr, NULL); - } + + if (!res) + setbuf(stderr, NULL); } } @@ -4475,8 +4479,8 @@ we force server id to 2, but this MySQL #ifdef __WIN__ if (!opt_console) { - freopen(log_error_file,"a+",stdout); - freopen(log_error_file,"a+",stderr); + if (reopen_fstreams(log_error_file, stdout, stderr)) + unireg_abort(1); setbuf(stderr, NULL); FreeConsole(); // Remove window } --Boundary_(ID_c6tXVMYjzWplOP5Kkr8EHw) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/dmitry.shulga@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/dmitry.shulga@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.shulga@stripped # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug29751/ # testament_sha1: bad3006ffbbf2f644f8dbc5fc5d5370571663638 # timestamp: 2010-08-10 14:02:25 +0700 # base_revision_id: davi.arnaut@stripped\ # wff7axt7ykr7ybn4 # # Begin bundle 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 --Boundary_(ID_c6tXVMYjzWplOP5Kkr8EHw)--