xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* Xen 4.4, xenstored and WATCH requests
@ 2016-02-25 12:54 Sergei Lebedev
  2016-02-26 11:26 ` Wei Liu
  0 siblings, 1 reply; 5+ messages in thread
From: Sergei Lebedev @ 2016-02-25 12:54 UTC (permalink / raw)
  To: xen-devel

Hello list,

I’m working on a Python client library for XenStore [1]. The library implements two ways to access XenStore: via Unix socket and via /dev.  The /dev interface turned out to be a bit problematic, because it ignores the req_id field for WATCH requests.

The spec [2] requires all responses (except WATCH_EVENT) to copy req_id from request. So I wonder if it’s possible that the behaviour I observe is in fact a bug in xenstored?

Below is a Python script demonstrating the issue:

    import os
    import struct

    WATCH = 4
    WRITE = 11

    def send_packet(fd, op, rq_id, tx_id, payload):
        data = struct.pack(b"IIII", op, rq_id, tx_id, len(payload)) + payload
        os.write(fd, data)


    def print_reply(fd):
        op, rq_id, tx_id, size = struct.unpack(b"IIII", os.read(fd, 16))
        payload = os.read(fd, size) if size else b""
        print(op, rq_id, tx_id, payload)


    fd = os.open("/dev/xen/xenbus", os.O_RDWR)
    try:
        send_packet(fd, WRITE, 24, 0, b"/foo\x00bar\x00")
        print_reply(fd)  # ACK for WRITE with rq_id = 24.
        send_packet(fd, WATCH, 42, 0, b"/foo\x00token\x00")
        print_reply(fd)  # Spurious (?) WATCH_EVENT.
        print_reply(fd)  # ACK for WATCH with rq_id = 0.
    finally:
        os.close(fd)

Example output:

    (11, 24, 0, 'OK\x00')
    (15, 4294967295, 892960384, '/foo\x00token\x00')
    (4, 0, 0, 'OK\x00')

I’m running Xen 4.4 on Ubuntu 14.04 inside VirtualBox.

$ uname -a
Linux xen-devel 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Regards,
Sergei

[1]: http://github.com/selectel/pyxs
[2]: http://xenbits.xen.org/docs/4.4-testing/misc/xenstore.txt


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Xen 4.4, xenstored and WATCH requests
  2016-02-25 12:54 Xen 4.4, xenstored and WATCH requests Sergei Lebedev
@ 2016-02-26 11:26 ` Wei Liu
  2016-02-26 12:07   ` Wei Liu
  2016-02-26 12:10   ` Sergei Lebedev
  0 siblings, 2 replies; 5+ messages in thread
From: Wei Liu @ 2016-02-26 11:26 UTC (permalink / raw)
  To: Sergei Lebedev; +Cc: Wei Liu, xen-devel

Hello

On Thu, Feb 25, 2016 at 03:54:14PM +0300, Sergei Lebedev wrote:
> Hello list,
> 
> I’m working on a Python client library for XenStore [1]. The library
> implements two ways to access XenStore: via Unix socket and via /dev.
> The /dev interface turned out to be a bit problematic, because it
> ignores the req_id field for WATCH requests.
> 

So the unix socket interface worked fine for you?

> The spec [2] requires all responses (except WATCH_EVENT) to copy
> req_id from request. So I wonder if it’s possible that the behaviour I
> observe is in fact a bug in xenstored?
> 
> Below is a Python script demonstrating the issue:
> 
>     import os
>     import struct
> 
>     WATCH = 4
>     WRITE = 11
> 
>     def send_packet(fd, op, rq_id, tx_id, payload):
>         data = struct.pack(b"IIII", op, rq_id, tx_id, len(payload)) + payload
>         os.write(fd, data)
> 
> 
>     def print_reply(fd):
>         op, rq_id, tx_id, size = struct.unpack(b"IIII", os.read(fd, 16))
>         payload = os.read(fd, size) if size else b""
>         print(op, rq_id, tx_id, payload)
> 
> 
>     fd = os.open("/dev/xen/xenbus", os.O_RDWR)
>     try:
>         send_packet(fd, WRITE, 24, 0, b"/foo\x00bar\x00")
>         print_reply(fd)  # ACK for WRITE with rq_id = 24.
>         send_packet(fd, WATCH, 42, 0, b"/foo\x00token\x00")
>         print_reply(fd)  # Spurious (?) WATCH_EVENT.
>         print_reply(fd)  # ACK for WATCH with rq_id = 0.
>     finally:
>         os.close(fd)
> 

> Example output:
> 
>     (11, 24, 0, 'OK\x00')
>     (15, 4294967295, 892960384, '/foo\x00token\x00')
>     (4, 0, 0, 'OK\x00')
> 
> I’m running Xen 4.4 on Ubuntu 14.04 inside VirtualBox.
> 
> $ uname -a
> Linux xen-devel 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
> 

FWIW I tried you program in my own testbox running xen-unstable with
Debian's stock 3.16 kernel, the result is the same.

And in xen.git

  $ git diff origin/stable-4.4..origin/staging -- docs/misc/xenstore.txt

shows nothing.

So this is not a problem in 4.4 only.

Wei.

> Regards,
> Sergei
> 
> [1]: http://github.com/selectel/pyxs
> [2]: http://xenbits.xen.org/docs/4.4-testing/misc/xenstore.txt
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Xen 4.4, xenstored and WATCH requests
  2016-02-26 11:26 ` Wei Liu
@ 2016-02-26 12:07   ` Wei Liu
  2016-02-26 12:10   ` Sergei Lebedev
  1 sibling, 0 replies; 5+ messages in thread
From: Wei Liu @ 2016-02-26 12:07 UTC (permalink / raw)
  To: Sergei Lebedev; +Cc: Wei Liu, xen-devel

On Fri, Feb 26, 2016 at 11:26:50AM +0000, Wei Liu wrote:
> Hello
> 
> On Thu, Feb 25, 2016 at 03:54:14PM +0300, Sergei Lebedev wrote:
> > Hello list,
> > 
> > I’m working on a Python client library for XenStore [1]. The library
> > implements two ways to access XenStore: via Unix socket and via /dev.
> > The /dev interface turned out to be a bit problematic, because it
> > ignores the req_id field for WATCH requests.
> > 
> 
> So the unix socket interface worked fine for you?
> 

BTW can you paste in the result of

  $ ps aux | grep xenstored

here?

I need to know which variant of xenstored you're running.

Wei.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Xen 4.4, xenstored and WATCH requests
  2016-02-26 11:26 ` Wei Liu
  2016-02-26 12:07   ` Wei Liu
@ 2016-02-26 12:10   ` Sergei Lebedev
  2016-02-26 12:42     ` Wei Liu
  1 sibling, 1 reply; 5+ messages in thread
From: Sergei Lebedev @ 2016-02-26 12:10 UTC (permalink / raw)
  To: Wei Liu; +Cc: xen-devel


[-- Attachment #1.1: Type: text/plain, Size: 3582 bytes --]

Hi Wei,

Yes, the Unix socket interface works okay. Here’s a relevant part of the script changed to use the socket:

    import socket
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    sock.connect("/var/run/xenstored/socket")
    fd = os.dup(sock.fileno())
    try:
        send_packet(fd, WRITE, 24, 0, b"/foo\x00bar\x00")
        print_reply(fd)  # Responds with rq_id = 24.
        send_packet(fd, WATCH, 42, 0, b"/foo\x00token\x00")
        print_reply(fd)  # ACK for WATCH with rq_id = 42.
    finally:
        os.close(fd)

> BTW can you paste in the result of
> 
>  $ ps aux | grep xenstored
> 
> here?


$ ps aux | grep xenstored
root       807  0.0  0.2  10932  2132 ?        S    00:34   0:01 /usr/lib/xen-4.4/bin/xenstored --p
id-file=/var/run/xenstore.pid

Sergei


> On 26 Feb 2016, at 14:26, Wei Liu <wei.liu2@citrix.com> wrote:
> 
> Hello
> 
> On Thu, Feb 25, 2016 at 03:54:14PM +0300, Sergei Lebedev wrote:
>> Hello list,
>> 
>> I’m working on a Python client library for XenStore [1]. The library
>> implements two ways to access XenStore: via Unix socket and via /dev.
>> The /dev interface turned out to be a bit problematic, because it
>> ignores the req_id field for WATCH requests.
>> 
> 
> So the unix socket interface worked fine for you?
> 
>> The spec [2] requires all responses (except WATCH_EVENT) to copy
>> req_id from request. So I wonder if it’s possible that the behaviour I
>> observe is in fact a bug in xenstored?
>> 
>> Below is a Python script demonstrating the issue:
>> 
>>    import os
>>    import struct
>> 
>>    WATCH = 4
>>    WRITE = 11
>> 
>>    def send_packet(fd, op, rq_id, tx_id, payload):
>>        data = struct.pack(b"IIII", op, rq_id, tx_id, len(payload)) + payload
>>        os.write(fd, data)
>> 
>> 
>>    def print_reply(fd):
>>        op, rq_id, tx_id, size = struct.unpack(b"IIII", os.read(fd, 16))
>>        payload = os.read(fd, size) if size else b""
>>        print(op, rq_id, tx_id, payload)
>> 
>> 
>>    fd = os.open("/dev/xen/xenbus", os.O_RDWR)
>>    try:
>>        send_packet(fd, WRITE, 24, 0, b"/foo\x00bar\x00")
>>        print_reply(fd)  # ACK for WRITE with rq_id = 24.
>>        send_packet(fd, WATCH, 42, 0, b"/foo\x00token\x00")
>>        print_reply(fd)  # Spurious (?) WATCH_EVENT.
>>        print_reply(fd)  # ACK for WATCH with rq_id = 0.
>>    finally:
>>        os.close(fd)
>> 
> 
>> Example output:
>> 
>>    (11, 24, 0, 'OK\x00')
>>    (15, 4294967295, 892960384, '/foo\x00token\x00')
>>    (4, 0, 0, 'OK\x00')
>> 
>> I’m running Xen 4.4 on Ubuntu 14.04 inside VirtualBox.
>> 
>> $ uname -a
>> Linux xen-devel 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
>> 
> 
> FWIW I tried you program in my own testbox running xen-unstable with
> Debian's stock 3.16 kernel, the result is the same.
> 
> And in xen.git
> 
>  $ git diff origin/stable-4.4..origin/staging -- docs/misc/xenstore.txt
> 
> shows nothing.
> 
> So this is not a problem in 4.4 only.
> 
> Wei.
> 
>> Regards,
>> Sergei
>> 
>> [1]: http://github.com/selectel/pyxs <http://github.com/selectel/pyxs>
>> [2]: http://xenbits.xen.org/docs/4.4-testing/misc/xenstore.txt <http://xenbits.xen.org/docs/4.4-testing/misc/xenstore.txt>
>> 
>> 
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xen.org <mailto:Xen-devel@lists.xen.org>
>> http://lists.xen.org/xen-devel <http://lists.xen.org/xen-devel>

[-- Attachment #1.2: Type: text/html, Size: 18023 bytes --]

[-- Attachment #2: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Xen 4.4, xenstored and WATCH requests
  2016-02-26 12:10   ` Sergei Lebedev
@ 2016-02-26 12:42     ` Wei Liu
  0 siblings, 0 replies; 5+ messages in thread
From: Wei Liu @ 2016-02-26 12:42 UTC (permalink / raw)
  To: Sergei Lebedev; +Cc: Boris Ostrovsky, Wei Liu, David Vrabel, xen-devel

(CC'ing Linux maintainers)

OK. Thanks for all the information.

This seems to be a bug in Linux xenbus driver.

Relevant code snippet in
drivers/xen/xenbus/xenbus_dev_frontend.c:xenbus_write_watch()


  /* Success.  Synthesize a reply to say all is OK. */
  {
          struct {
                  struct xsd_sockmsg hdr;
                  char body[3];
          } __packed reply = {
                  {
                          .type = msg_type,
                          .len = sizeof(reply.body)
                  },
                  "OK"
          };
  
          mutex_lock(&u->reply_mutex);
          rc = queue_reply(&u->read_buffers, &reply, sizeof(reply));
          wake_up(&u->read_waitq);
          mutex_unlock(&u->reply_mutex);
  }

The synthesised reply doesn't echo the req_id back to user.

Wei.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-02-26 12:42 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-25 12:54 Xen 4.4, xenstored and WATCH requests Sergei Lebedev
2016-02-26 11:26 ` Wei Liu
2016-02-26 12:07   ` Wei Liu
2016-02-26 12:10   ` Sergei Lebedev
2016-02-26 12:42     ` Wei Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).