mirror of
https://github.com/MariaDB/server.git
synced 2025-08-05 13:16:09 +03:00
Fixed bug #29751 - do not rename the error log at FLUSH LOGS.
Added open log file with FILE_SHARE_DELETE flag on Windows.
This commit is contained in:
109
sql/log.cc
109
sql/log.cc
@@ -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;
|
|||||||
# 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()
|
|||||||
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.");
|
|||||||
#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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user