[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 3 of 3] Add xenbus-only communication switch for xenstore clients/API



Currently, xenstore clients default to socket communication mode and only 
fallback to xenbus if the former is not present. This is a reasonable choice 
for both normal hosts (Dom0) and normal VMs (DomU), but it would cause troubles 
for SDK/DDK VMs which are playing both host and VM roles. In such VMs, xenstore 
clients sometimes need to talk with the xenstored running inside the VM as a 
Dom0 client via socket, and sometimes need to talk with the xenstored running 
on the real host as a DomU client via xenbus (e.g. as guest agent to report 
information back to the real host). With current design, the xenstore clients 
in a SDK/DDK VM will always talk to its own xenstored running inside the VM, 
and there is no option for us to enforce xenbus communication when necessary.

In this patch, we add an extra flag XS_OPEN_XENBUSONLY (and also a command line 
option "-b") corresponding to the current XS_OPEN_SOCKETONLY flag (and the "-s" 
option). The algorithm of choosing communication method becomes:

* As before, XENSTORED_PATH environment variable still has the highest priority 
over any other options
* If XS_OPEN_SOCKETONLY flag is set, xenstore clients will always use socket 
communication and will not try xenbus communication even if socket 
communication is not feasible
* If XS_OPEN_XENBUSONLY flag is set, xenstore clients will always use xenbus 
communication and will not try socket communication even if xenbus 
communication is not feasible
* If both options are unset or both options are set, socket communication will 
have the higher priority, and xenbus communication will take place only when 
the socket communication is not feasible.

To avoid having to add these switches everywhere, three environment variables 
of the same name i.e. "XS_OPEN_XXXONLY" are added and will have the same effect 
(in addition to) as passing explicit flags/options to the xs_open primitive if 
not empty.

Signed-off-by: Zheng Li <zheng.li@xxxxxxxxxxxxx>


----
diff --git a/tools/python/xen/lowlevel/xs/xs.c 
b/tools/python/xen/lowlevel/xs/xs.c
--- a/tools/python/xen/lowlevel/xs/xs.c
+++ b/tools/python/xen/lowlevel/xs/xs.c
@@ -898,15 +898,21 @@ fail:
 static int
 xshandle_init(XsHandle *self, PyObject *args, PyObject *kwds)
 {
-    static char *kwd_spec[] = { "readonly", NULL };
-    static char *arg_spec = "|i";
-    int readonly = 0;
+    static char *kwd_spec[] = { "readonly", "socket", "xenbus", NULL };
+    static char *arg_spec = "|iii";
+    int readonly = 0, socket = 0, xenbus = 0;
+    unsigned long flags = 0;
 
     if (!PyArg_ParseTupleAndKeywords(args, kwds, arg_spec, kwd_spec,
-                                     &readonly))
+                                     &readonly, &socket, &xenbus))
         goto fail;
 
-    self->xh = (readonly ? xs_daemon_open_readonly() : xs_daemon_open());
+    flags |= (readonly ? XS_OPEN_READONLY : 0);
+    flags |= (socket ? XS_OPEN_SOCKETONLY : 0);
+    flags |= (xenbus ? XS_OPEN_XENBUSONLY : 0);
+
+    self->xh = xs_open(flags);
+
     if (!self->xh)
         goto fail;
 
diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c
--- a/tools/xenstore/xenstore_client.c
+++ b/tools/xenstore/xenstore_client.c
@@ -78,24 +78,24 @@ usage(enum mode mode, int incl_mode, con
        errx(1, "Usage: %s <mode> [-h] [...]", progname);
     case MODE_read:
        mstr = incl_mode ? "read " : "";
-       errx(1, "Usage: %s %s[-h] [-p] [-s] key [...]", progname, mstr);
+       errx(1, "Usage: %s %s[-h] [-p] [-s|-b] key [...]", progname, mstr);
     case MODE_write:
        mstr = incl_mode ? "write " : "";
-       errx(1, "Usage: %s %s[-h] [-s] key value [...]", progname, mstr);
+       errx(1, "Usage: %s %s[-h] [-s|-b] key value [...]", progname, mstr);
     case MODE_rm:
        mstr = incl_mode ? "rm " : "";
-       errx(1, "Usage: %s %s[-h] [-s] [-t] key [...]", progname, mstr);
+       errx(1, "Usage: %s %s[-h] [-s|-b] [-t] key [...]", progname, mstr);
     case MODE_exists:
        mstr = incl_mode ? "exists " : "";
     case MODE_list:
        mstr = mstr ? : incl_mode ? "list " : "";
-       errx(1, "Usage: %s %s[-h] [-p] [-s] key [...]", progname, mstr);
+       errx(1, "Usage: %s %s[-h] [-p] [-s|-b] key [...]", progname, mstr);
     case MODE_ls:
        mstr = mstr ? : incl_mode ? "ls " : "";
-       errx(1, "Usage: %s %s[-h] [-f] [-p] [-s] [path]", progname, mstr);
+       errx(1, "Usage: %s %s[-h] [-f] [-p] [-s|-b] [path]", progname, mstr);
     case MODE_chmod:
        mstr = incl_mode ? "chmod " : "";
-       errx(1, "Usage: %s %s[-h] [-u] [-r] [-s] key <mode [modes...]>", 
progname, mstr);
+       errx(1, "Usage: %s %s[-h] [-u] [-r] [-s|-b] key <mode [modes...]>", 
progname, mstr);
     case MODE_watch:
        mstr = incl_mode ? "watch " : "";
        errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
@@ -496,7 +496,8 @@ main(int argc, char **argv)
 {
     struct xs_handle *xsh;
     xs_transaction_t xth = XBT_NULL;
-    int ret = 0, socket = 0;
+    int ret = 0;
+    unsigned long flags = 0;
     int prefix = 0;
     int tidy = 0;
     int upto = 0;
@@ -531,6 +532,7 @@ main(int argc, char **argv)
            {"help",    0, 0, 'h'},
            {"flat",    0, 0, 'f'}, /* MODE_ls */
            {"socket",  0, 0, 's'},
+           {"xenbus",  0, 0, 'b'},
            {"prefix",  0, 0, 'p'}, /* MODE_read || MODE_list || MODE_ls */
            {"tidy",    0, 0, 't'}, /* MODE_rm */
            {"upto",    0, 0, 'u'}, /* MODE_chmod */
@@ -539,7 +541,7 @@ main(int argc, char **argv)
            {0, 0, 0, 0}
        };
 
-       c = getopt_long(argc - switch_argv, argv + switch_argv, "hfspturn:",
+       c = getopt_long(argc - switch_argv, argv + switch_argv, "hfsbpturn:",
                        long_options, &index);
        if (c == -1)
            break;
@@ -557,9 +559,12 @@ main(int argc, char **argv)
                usage(mode, switch_argv, argv[0]);
            }
             break;
-        case 's':
-            socket = 1;
-            break;
+       case 's':
+           flags |= XS_OPEN_SOCKETONLY;
+           break;
+       case 'b':
+           flags |= XS_OPEN_XENBUSONLY;
+           break;
        case 'p':
            if ( mode == MODE_read || mode == MODE_list || mode == MODE_ls )
                prefix = 1;
@@ -633,7 +638,7 @@ main(int argc, char **argv)
            max_width = ws.ws_col - 2;
     }
 
-    xsh = xs_open(socket ? XS_OPEN_SOCKETONLY : 0);
+    xsh = xs_open(flags);
     if (xsh == NULL) err(1, "xs_open");
 
 again:
diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
--- a/tools/xenstore/xs.c
+++ b/tools/xenstore/xs.c
@@ -257,12 +257,18 @@ struct xs_handle *xs_open(unsigned long 
 {
        struct xs_handle *xsh = NULL;
 
-       if (flags & XS_OPEN_READONLY)
-               xsh = get_handle(xs_daemon_socket_ro(), flags);
-       else
-               xsh = get_handle(xs_daemon_socket(), flags);
+       flags |= (getenv("XS_OPEN_READONLY") ? XS_OPEN_READONLY : 0);
+       flags |= (getenv("XS_OPEN_SOCKETONLY") ? XS_OPEN_SOCKETONLY : 0);
+       flags |= (getenv("XS_OPEN_XENBUSONLY") ? XS_OPEN_XENBUSONLY : 0);
+       
+       if ((flags & XS_OPEN_SOCKETONLY) || !(flags & XS_OPEN_XENBUSONLY)) {
+               if (flags & XS_OPEN_READONLY)
+                       xsh = get_handle(xs_daemon_socket_ro(), flags);
+               else
+                       xsh = get_handle(xs_daemon_socket(), flags);
+       }
 
-       if (!xsh && !(flags & XS_OPEN_SOCKETONLY))
+       if (!xsh && ((flags & XS_OPEN_XENBUSONLY) || !(flags & 
XS_OPEN_SOCKETONLY)))
                xsh = get_handle(xs_domain_dev(), flags);
 
        return xsh;
diff --git a/tools/xenstore/xs.h b/tools/xenstore/xs.h
--- a/tools/xenstore/xs.h
+++ b/tools/xenstore/xs.h
@@ -26,6 +26,7 @@
 
 #define XS_OPEN_READONLY       1UL<<0
 #define XS_OPEN_SOCKETONLY      1UL<<1
+#define XS_OPEN_XENBUSONLY      1UL<<2
 
 struct xs_handle;
 typedef uint32_t xs_transaction_t;
 tools/python/xen/lowlevel/xs/xs.c |  16 +++++++++++-----
 tools/xenstore/xenstore_client.c  |  29 +++++++++++++++++------------
 tools/xenstore/xs.c               |  16 +++++++++++-----
 tools/xenstore/xs.h               |   1 +
 4 files changed, 40 insertions(+), 22 deletions(-)


Attachment: xen-unstable-3.patch
Description: Text Data

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.