vlog: Skip reopening a log file if it would have no effect.
authorBen Pfaff <blp@nicira.com>
Fri, 14 Oct 2011 18:37:24 +0000 (11:37 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 18 Oct 2011 20:51:11 +0000 (13:51 -0700)
Avoids redundant "closing log file"/"opened log file" messages in log files.

Reported-by: Reid Price <reid@nicira.com>
Bug #7750.

lib/vlog.c

index 301473cd827462e9d781ede7e15e42a31cbd9c37..11b2f7cc4ef48be324b4f90412ff1fef40995432 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <syslog.h>
 #include <time.h>
@@ -322,7 +323,25 @@ vlog_set_log_file(const char *file_name)
 int
 vlog_reopen_log_file(void)
 {
-    return log_file_name ? vlog_set_log_file(log_file_name) : 0;
+    struct stat old, new;
+
+    /* Skip re-opening if there's nothing to reopen. */
+    if (!log_file_name) {
+        return 0;
+    }
+
+    /* Skip re-opening if it would be a no-op because the old and new files are
+     * the same.  (This avoids writing "closing log file" followed immediately
+     * by "opened log file".) */
+    if (log_file
+        && !fstat(fileno(log_file), &old)
+        && !stat(log_file_name, &new)
+        && old.st_dev == new.st_dev
+        && old.st_ino == new.st_ino) {
+        return 0;
+    }
+
+    return vlog_set_log_file(log_file_name);
 }
 
 /* Set debugging levels: