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

Justin Pettit jpettit at nicira.com
Fri Apr 23 17:15:17 UTC 2010


The solution is obviously very XenServer-specific.  As we become more tightly integrated with other hypervisors, we should look to generalize some of the hypervisor-specific stuff we're doing in the binaries.

Otherwise, the set looks good to me.  I'm assuming this works under 5.5 and 5.6?  (I didn't see anything version-specific, but we've certainly missed subtleties before.)

--Justin


On Apr 21, 2010, at 11:37 AM, Ben Pfaff wrote:

> 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
> 
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org





More information about the dev mailing list