List:Commits« Previous MessageNext Message »
From:Dmitry Shulga Date:August 10 2010 7:02am
Subject:bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3470) Bug#29751
View as plain text  
#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
   }


Attachment: [text/bzr-bundle] bzr/dmitry.shulga@sun.com-20100810070217-epu856f2wmtb1ya9.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3470) Bug#29751Dmitry Shulga10 Aug
  • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3470)Bug#29751Davi Arnaut24 Aug