cfg: Log changes to config, not whole config, in cfg_read().
authorBen Pfaff <blp@nicira.com>
Fri, 8 May 2009 17:39:17 +0000 (10:39 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 12 May 2009 23:21:56 +0000 (16:21 -0700)
The configuration file is re-read on a regular basis by brcompatd and
vswitchd in practice.  When debug-level logging is enabled on the cfg
module, it was logging the entire config file each time.  Not only is this
a waste of log-file space, it's difficult for humans to see what actually
changed, if anything.

So this commit changes cfg_read() to log a diff instead of the whole config
file.

lib/cfg.c
lib/cfg.h

index 83e9a43941c13bd13b0b6a0adb4d1a03edc52467..53a71cda828606ddcf35e1fc9262372b923df8a6 100644 (file)
--- a/lib/cfg.c
+++ b/lib/cfg.c
@@ -166,10 +166,11 @@ update_cookie(void)
 
 /* Reads all of the configuration files or directories that have been added
  * with cfg_add_file(), merges their content.  Any previous configuration is
- * replaced. */
-void
+ * replaced.  Returns 0 if successful, otherwise a positive errno value. */
+int
 cfg_read(void)
 {
+    struct svec old_cfg;
     struct ds ds;
     FILE *file;
     char *section;
@@ -177,11 +178,12 @@ cfg_read(void)
 
 
     if (!cfg_name) {
-        return;
+        return ENODEV;
     }
 
-    /* Clear old configuration data. */
-    svec_clear(&cfg);
+    /* Save old configuration data and clear the active configuration. */
+    svec_init(&old_cfg);
+    svec_swap(&old_cfg, &cfg);
 
     /* Read new configuration. */
     VLOG_DBG("reading configuration from %s", cfg_name);
@@ -189,7 +191,7 @@ cfg_read(void)
     file = fopen(cfg_name, "r");
     if (!file) {
         VLOG_ERR("failed to open \"%s\": %s", cfg_name, strerror(errno));
-        return;
+        return errno;
     }
 
     ds_init(&ds);
@@ -232,13 +234,27 @@ cfg_read(void)
     fclose(file);
 
     if (VLOG_IS_DBG_ENABLED()) {
+        struct svec removed, added;
         size_t i;
 
-        VLOG_DBG("new configuration:");
-        for (i = 0; i < cfg.n; i++) {
-            VLOG_DBG("%s", cfg.names[i]);
+        svec_diff(&old_cfg, &cfg, &removed, NULL, &added);
+        if (removed.n || added.n) {
+            VLOG_DBG("configuration changes:");
+            for (i = 0; i < removed.n; i++) {
+                VLOG_DBG("-%s", removed.names[i]);
+            }
+            for (i = 0; i < added.n; i++) {
+                VLOG_DBG("+%s", added.names[i]);
+            }
+        } else {
+            VLOG_DBG("configuration unchanged");
         }
+        svec_destroy(&added);
+        svec_destroy(&removed);
     }
+    svec_destroy(&old_cfg);
+
+    return 0;
 }
 
 int
index 8b21922e6ac4e42307c1530b6fb6a088e9be2e58..2b79f439a189b733533adb20c189665fd1846678 100644 (file)
--- a/lib/cfg.h
+++ b/lib/cfg.h
@@ -38,7 +38,7 @@ struct svec;
 struct ofpbuf;
 
 int cfg_set_file(const char *file_name);
-void cfg_read(void);
+int cfg_read(void);
 int cfg_lock(uint8_t *cookie, int timeout);
 void cfg_unlock(void);
 int cfg_write(void);