[ovs-dev] [PATCH 3/3] xenserver: Gracefully refresh network UUIDs on pool join or leave.

Ben Pfaff blp at nicira.com
Wed Apr 21 18:37:36 UTC 2010


The vswitch database is supposed to maintain an up-to-date UUID for the
system's networks in the Bridge table as external-ids:network-uuids.  On
XenServer systems, /opt/xensource/libexec/interface-reconfigure updates
these fields as bridges are brought up and down.  Most of the time, that is
sufficient.  However, this is one exception: when a XenServer host enters
or leaves a pool, interface-reconfigure is not invoked, and neither is any
other script.  So this commit adds monitoring of the XenServer's pool
membership status and refreshes the network UUIDs (by invoking the
refresh-network-uuids script) if it changes.

This functionality should have no effect on non-XenServer systems, since
they will have neither /etc/xensource/pool.conf nor refresh-network-uuids.

Bug #2097.
---
 vswitchd/ovs-vswitchd.c |    3 +
 vswitchd/xenserver.c    |   95 +++++++++++++++++++++++++++++++++++++++++++++-
 vswitchd/xenserver.h    |    4 +-
 3 files changed, 98 insertions(+), 4 deletions(-)

diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
index c1acfc4..0450efb 100644
--- a/vswitchd/ovs-vswitchd.c
+++ b/vswitchd/ovs-vswitchd.c
@@ -46,6 +46,7 @@
 #include "util.h"
 #include "vconn.h"
 #include "vswitchd/vswitch-idl.h"
+#include "xenserver.h"
 
 #include "vlog.h"
 #define THIS_MODULE VLM_vswitchd
@@ -119,6 +120,7 @@ main(int argc, char *argv[])
         unixctl_server_run(unixctl);
         dp_run();
         netdev_run();
+        xenserver_run();
 
         signal_wait(sighup);
         if (inited) {
@@ -128,6 +130,7 @@ main(int argc, char *argv[])
         unixctl_server_wait(unixctl);
         dp_wait();
         netdev_wait();
+        xenserver_wait();
         poll_block();
     }
 
diff --git a/vswitchd/xenserver.c b/vswitchd/xenserver.c
index 03c4955..32e5a49 100644
--- a/vswitchd/xenserver.c
+++ b/vswitchd/xenserver.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,13 +15,16 @@
 
 #include <config.h>
 #include "xenserver.h"
-#include <ctype.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
+#include <time.h>
 #include <unistd.h>
-#include "dynamic-string.h"
+#include "dirs.h"
+#include "poll-loop.h"
 #include "process.h"
+#include "socket-util.h"
 
 #include "vlog.h"
 #define THIS_MODULE VLM_xenserver
@@ -76,4 +79,90 @@ xenserver_get_host_uuid(void)
     }
     return host_uuid;
 }
+
+/* Network UUID refreshing.
+ *
+ * The vswitch database is supposed to maintain an up-to-date UUID for the
+ * system's networks in the Bridge table as external-ids:network-uuids.  On
+ * XenServer systems, /opt/xensource/libexec/interface-reconfigure updates
+ * these fields as bridges are brought up and down.  Most of the time, that is
+ * sufficient.  However, this is one exception: when a XenServer host enters or
+ * leaves a pool, interface-reconfigure is not invoked, and neither is any
+ * other script.  So we need to monitor the XenServer's pool membership status
+ * and refresh the network UUIDs (by invoking the refresh-network-uuids script)
+ * if it changes.
+ *
+ * This functionality should be harmless on non-XenServer systems, since they
+ * will have neither /etc/xensource/pool.conf nor refresh-network-uuids.
+ */
+
+/* Timestamp of /etc/xensource/pool.conf, or zeros if it does not exist. */
+static struct timespec pool_conf_mtime;
+
+/* The executing instance of refresh-network-uuids, or NULL if none. */
+static struct process *refresh_script;
+
+void
+xenserver_run(void)
+{
+    struct timespec new_mtime;
+
+    /* If a script is running, don't do anything until it finishes. */
+    if (refresh_script) {
+        char *s;
+
+        if (!process_exited(refresh_script)) {
+            return;
+        }
+
+        s = process_status_msg(process_status(refresh_script));
+        VLOG_INFO("refresh-network-uuids exited, %s", s);
+        free(s);
+
+        process_destroy(refresh_script);
+        refresh_script = NULL;
+    }
+
+    /* Otherwise, check for a change in timestamp.
+     *
+     * (We will always detect a change in timestamp when we start up.  That's
+     * good, since it means that the refresh-network-uuids script gets
+     * thoroughly tested and we can't miss pool changes that happen when
+     * ovs-vswitchd isn't running.)  */
+    get_mtime("/etc/xensource/pool.conf", &new_mtime);
+    if (new_mtime.tv_sec != pool_conf_mtime.tv_sec ||
+        new_mtime.tv_nsec != pool_conf_mtime.tv_nsec) {
+        struct stat s;
+        char *argv[2];
+
+        argv[0] = xasprintf("%s/scripts/refresh-network-uuids",
+                            ovs_pkgdatadir);
+        argv[1] = NULL;
+
+        if (!stat(argv[0], &s)) {
+            int error = process_start(argv, NULL, 0, NULL, 0, &refresh_script);
+            if (error) {
+                VLOG_ERR("failed to refresh network UUIDs: %s could "
+                         "not be started (%s)", argv[0], strerror(error));
+            } else {
+                VLOG_INFO("refreshing network UUIDs: started %s", argv[0]);
+            }
+        } else {
+            VLOG_ERR("failed to refresh network UUIDs: could not stat %s (%s)",
+                     argv[0], strerror(errno));
+        }
 
+        pool_conf_mtime = new_mtime;
+        free(argv[0]);
+    }
+}
+
+void
+xenserver_wait(void)
+{
+    if (refresh_script) {
+        process_wait(refresh_script);
+    } else if (pool_conf_mtime.tv_sec) {
+        poll_timer_wait(1000);
+    }
+}
diff --git a/vswitchd/xenserver.h b/vswitchd/xenserver.h
index ad9ed8c..034ee3a 100644
--- a/vswitchd/xenserver.h
+++ b/vswitchd/xenserver.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,5 +17,7 @@
 #define VSWITCHD_XENSERVER_H 1
 
 const char *xenserver_get_host_uuid(void);
+void xenserver_run(void);
+void xenserver_wait(void);
 
 #endif /* xenserver.h */
-- 
1.6.6.1





More information about the dev mailing list