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

[Xen-tools] Re: xenstored crash



On Wed, Sep 14, 2005 at 03:09:47PM +1000, Rusty Russell wrote:
> On Tue, 2005-09-13 at 22:12 +0100, Christian Limpach wrote:
> > Rusty,
> > 
> > could you take a look at the following crash:
> > (gdb) run -N --pid-file=/var/run/xenstore.pid -T 
> > /var/log/xenstored-trace.log
> > Starting program: /usr/sbin/xenstored -N --pid-file=/var/run/xenstore.pid 
> > -T /var/log/xenstored-trace.log
> > xenstored: xenstored_core.c:512: send_reply: Assertion `conn->state != 
> > BLOCKED' failed.
> 
> And here's the one-line fix, plus test case.

Thanks for the quick fix!

    christian

> 
> Rusty.
> 
> # HG changeset patch
> # User Rusty Russell <rusty@xxxxxxxxxxxxxxx>
> # Node ID 7882eb8eec92a90929904a9daa7857a2ce44f294
> # Parent  0d8c0db042580571be501be5b59cb5beb8417cef
> Fix Christian's xenstored watch crash.
> 
> When a connection blocked waiting on a transaction, don't queue watch events.
> Sure, they'd be ignored and re-transmitted, but it hits an assert that we 
> don't
> send data out blocked connections, and it's wasteful.
> 
> Signed-off-by: Rusty Russell <rusty@xxxxxxxxxxxxxxx> (authored)
> 
> diff -r 0d8c0db04258 -r 7882eb8eec92 tools/xenstore/xenstored_watch.c
> --- a/tools/xenstore/xenstored_watch.c        Tue Sep 13 21:52:24 2005
> +++ b/tools/xenstore/xenstored_watch.c        Wed Sep 14 05:07:51 2005
> @@ -144,7 +144,7 @@
>                       else
>                               continue;
>                       /* If connection not doing anything, queue this. */
> -                     if (!i->out)
> +                     if (i->state == OK)
>                               queue_next_event(i);
>               }
>       }
> diff -r 0d8c0db04258 -r 7882eb8eec92 tools/xenstore/xs_test.c
> --- a/tools/xenstore/xs_test.c        Tue Sep 13 21:52:24 2005
> +++ b/tools/xenstore/xs_test.c        Wed Sep 14 05:07:51 2005
> @@ -398,12 +398,16 @@
>  static void do_readack(unsigned int handle)
>  {
>       enum xsd_sockmsg_type type;
> -     char *ret;
> -
> -     ret = read_reply(handles[handle]->fd, &type, NULL);
> -     if (!ret)
> -             failed(handle);
> -     free(ret);
> +     char *ret = NULL;
> +
> +     /* Watches can have fired before reply comes: daemon detects
> +      * and re-transmits, so we can ignore this. */
> +     do {
> +             free(ret);
> +             ret = read_reply(handles[handle]->fd, &type, NULL);
> +             if (!ret)
> +                     failed(handle);
> +     } while (type == XS_WATCH_EVENT);
>  }
>  
>  static void do_setid(unsigned int handle, char *id)
> diff -r 0d8c0db04258 -r 7882eb8eec92 
> tools/xenstore/testsuite/16block-watch-crash.test
> --- /dev/null Tue Sep 13 21:52:24 2005
> +++ b/tools/xenstore/testsuite/16block-watch-crash.test       Wed Sep 14 
> 05:07:51 2005
> @@ -0,0 +1,13 @@
> +# Test case where blocked connection gets sent watch.
> +
> +mkdir /test
> +watch /test token
> +1 start /test
> +# This will block on above
> +noackwrite /test/entry create contents
> +1 write /test/entry2 create contents
> +1 commit
> +readack
> +expect /test/entry2:token
> +waitwatch
> +ackwatch token
> 
> -- 
> A bad analogy is like a leaky screwdriver -- Richard Braakman
> 
> 

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


 


Rackspace

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