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,70 +5063,93 @@ 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
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()
......
......@@ -199,6 +199,9 @@ 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 +3824,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 +4480,8 @@ we force server id to 2, but this MySQL server will not act as a slave.");
#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
}
......
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