Commit 800feb16 authored by Dmitry Shulga's avatar Dmitry Shulga

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().
parent bc05efd8
...@@ -5063,67 +5063,90 @@ void sql_perror(const char *message) ...@@ -5063,67 +5063,90 @@ void sql_perror(const char *message)
} }
#ifdef __WIN__
extern "C" my_bool reopen_fstreams(const char *filename,
FILE *outstream, FILE *errstream)
{
int handle_fd;
int stream_fd;
HANDLE osfh;
DBUG_ASSERT(filename && (outstream || errstream));
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 Unfortunately, there seems to be no good way
to restore the original streams upon failure. to restore the original streams upon failure.
*/ */
static bool redirect_std_streams(const char *file) static bool redirect_std_streams(const char *file)
{ {
if (freopen(file, "a+", stdout) && freopen(file, "a+", stderr)) if (reopen_fstreams(file, stdout, stderr))
{ return TRUE;
setbuf(stderr, NULL); setbuf(stderr, NULL);
return FALSE; return FALSE;
}
return TRUE;
} }
bool flush_error_log() bool flush_error_log()
{ {
bool result=0; bool result= 0;
if (opt_error_log) 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)); 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)) if (redirect_std_streams(log_error_file))
result= 1; result= 1;
#endif
VOID(pthread_mutex_unlock(&LOCK_error_log)); VOID(pthread_mutex_unlock(&LOCK_error_log));
} }
return result; return result;
......
...@@ -199,6 +199,9 @@ typedef fp_except fp_except_t; ...@@ -199,6 +199,9 @@ typedef fp_except fp_except_t;
# endif # endif
#endif #endif
extern "C" my_bool reopen_fstreams(const char *filename,
FILE *outstream, FILE *errstream);
inline void setup_fpu() inline void setup_fpu()
{ {
#if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H)
...@@ -3821,15 +3824,17 @@ static int init_server_components() ...@@ -3821,15 +3824,17 @@ static int init_server_components()
opt_error_log= 1; // Too long file name opt_error_log= 1; // Too long file name
else else
{ {
my_bool res;
#ifndef EMBEDDED_LIBRARY #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 #endif
{
if (freopen(log_error_file, "a+", stderr)) if (!res)
setbuf(stderr, NULL); setbuf(stderr, NULL);
} }
} }
}
if (xid_cache_init()) if (xid_cache_init())
{ {
...@@ -4475,8 +4480,8 @@ we force server id to 2, but this MySQL server will not act as a slave."); ...@@ -4475,8 +4480,8 @@ we force server id to 2, but this MySQL server will not act as a slave.");
#ifdef __WIN__ #ifdef __WIN__
if (!opt_console) if (!opt_console)
{ {
freopen(log_error_file,"a+",stdout); if (reopen_fstreams(log_error_file, stdout, stderr))
freopen(log_error_file,"a+",stderr); unireg_abort(1);
setbuf(stderr, NULL); setbuf(stderr, NULL);
FreeConsole(); // Remove window FreeConsole(); // Remove window
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment