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

Re: [Xen-devel] [PATCH 3 of 9] libxl: signal caller if domain already destroyed on domain death event



On Mon, 26 Jul 2010, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1280140562 -3600
> # Node ID 1e0b63948031587b958ea307410d19c7b2be9614
> # Parent  f6300d42a667cf6a1a02fc065ecd9eaea0e10ecc
> libxl: signal caller if domain already destroyed on domain death event
> 
> Currently libxl_event_get_domain_death_info returns 0 if the event was
> not a domain death event and 1 if it was but does not infom the user
> if someone else has already cleaned up the domain, which means the
> caller must replicate some of the logic from within libxl.
> 
> Instead have the libxl_event_get_XXX_info functions required that the
> event is of the right type (the caller must have recently switched on
> event->type anyway).
> 
> This allows the return codes to be used in an event specific way and
> we take advantage of this by returning an error from
> libxl_event_get_domain_death_info if the domain is not dying.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> 
> diff -r f6300d42a667 -r 1e0b63948031 tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c     Mon Jul 26 11:36:02 2010 +0100
> +++ b/tools/libxl/libxl.c     Mon Jul 26 11:36:02 2010 +0100
> @@ -721,54 +721,54 @@ int libxl_free_waiter(libxl_waiter *wait
>      return 0;
>  }
>  
> +/*
> + * Returns:
> + *  - 0 if the domain is dead and there is no cleanup to be done. e.g 
> because someone else has already done it.
> + *  - 1 if the domain is dead and there is cleanup to be done.
> + *
> + * Can return error if the domain exists and is still running
> + */
>  int libxl_event_get_domain_death_info(struct libxl_ctx *ctx, uint32_t domid, 
> libxl_event *event, struct libxl_dominfo *info)
>  {
> -    int rc = 0, ret;
> -    if (event && event->type == LIBXL_EVENT_DOMAIN_DEATH) {
> -        ret = libxl_domain_info(ctx, info, domid);
> +    if (libxl_domain_info(ctx, info, domid) < 0)
> +        return 0;
>  
> -        if (ret == 0 && info->domid == domid) {
> -            if (info->running || (!info->shutdown && !info->dying && 
> !info->crashed))
> -                    goto out;
> -                rc = 1;
> -                goto out;
> -        }
> -        memset(info, 0, sizeof(*info));
> -        rc = 1;
> -        goto out;
> -    }
> -out:
> -    return rc;
> +    if (info->running || (!info->shutdown && !info->dying && !info->crashed))
> +        return ERROR_INVAL;
> +
> +    return 1;
>  }
>  
> +/*
> + * Returns true and fills *disk if the caller should eject the disk
> + */
>  int libxl_event_get_disk_eject_info(struct libxl_ctx *ctx, uint32_t domid, 
> libxl_event *event, libxl_device_disk *disk)
>  {
> -    if (event && event->type == LIBXL_EVENT_DISK_EJECT) {
> -        char *path;
> -        char *backend;
> -        char *value = libxl_xs_read(ctx, XBT_NULL, event->path);
> +    char *path;
> +    char *backend;
> +    char *value;
>  
> -        if (!value || strcmp(value,  "eject"))
> -            return 0;
> +    value = libxl_xs_read(ctx, XBT_NULL, event->path);
>  
> -        path = strdup(event->path);
> -        path[strlen(path) - 6] = '\0';
> -        backend = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, 
> "%s/backend", path));
> +    if (!value || strcmp(value,  "eject"))
> +        return 0;
>  
> -        disk->backend_domid = 0;
> -        disk->domid = domid;
> -        disk->physpath = NULL;
> -        disk->phystype = 0;
> -        /* this value is returned to the user: do not free right away */
> -        disk->virtpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, 
> "%s/dev", backend));
> -        disk->unpluggable = 1;
> -        disk->readwrite = 0;
> -        disk->is_cdrom = 1;
> +    path = strdup(event->path);
> +    path[strlen(path) - 6] = '\0';
> +    backend = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/backend", 
> path));
>  
> -        free(path);
> -        return 1;
> -    }
> -    return 0;
> +    disk->backend_domid = 0;
> +    disk->domid = domid;
> +    disk->physpath = NULL;
> +    disk->phystype = 0;
> +    /* this value is returned to the user: do not free right away */
> +    disk->virtpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, 
> "%s/dev", backend));
> +    disk->unpluggable = 1;
> +    disk->readwrite = 0;
> +    disk->is_cdrom = 1;
> +
> +    free(path);
> +    return 1;
>  }
>  
>  static int libxl_destroy_device_model(struct libxl_ctx *ctx, uint32_t domid)
> diff -r f6300d42a667 -r 1e0b63948031 tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c        Mon Jul 26 11:36:02 2010 +0100
> +++ b/tools/libxl/xl_cmdimpl.c        Mon Jul 26 11:36:02 2010 +0100
> @@ -1338,7 +1338,6 @@ start:
>          struct libxl_dominfo info;
>          libxl_event event;
>          libxl_device_disk disk;
> -        memset(&info, 0x00, sizeof(xc_domaininfo_t));
>  
>          FD_ZERO(&rfds);
>          FD_SET(fd, &rfds);
> @@ -1349,12 +1348,17 @@ start:
>          libxl_get_event(&ctx, &event);
>          switch (event.type) {
>              case LIBXL_EVENT_DOMAIN_DEATH:
> -                if (libxl_event_get_domain_death_info(&ctx, domid, &event, 
> &info)) {
> -                    LOG("Domain %d is dead", domid);
> -                    if (info.crashed || info.dying || (info.shutdown && 
> info.shutdown_reason != SHUTDOWN_suspend)) {
> +                ret = libxl_event_get_domain_death_info(&ctx, domid, &event, 
> &info);
> +
> +                if (ret < 0) continue;
> +
> +                LOG("Domain %d is dead", domid);
> +
> +                if (ret) {
> +                    if (info.shutdown_reason != SHUTDOWN_suspend) {
>                          LOG("Domain %d needs to be clean: destroying the 
> domain", domid);
>                          libxl_domain_destroy(&ctx, domid, 0);
> -                        if (info.shutdown && info.shutdown_reason == 
> SHUTDOWN_reboot) {
> +                        if (info.shutdown_reason == SHUTDOWN_reboot) {

Isn't still possible to get here and have info.shutdown == 0 (and even
info.dying == 0, after reading the fourth patch)?
If so, the previous test is probably clearer.

The rest of the series looks fine.

_______________________________________________
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®.