[libvirt] [PATCH] rbd: Do not error out on a single image during pool refresh

John Ferlan jferlan at redhat.com
Tue Jan 5 22:56:18 UTC 2016



On 12/29/2015 08:35 AM, Wido den Hollander wrote:
> It could happen that rbd_list() returns X names, but that while
> refreshing the pool one of those RBD images is removed from Ceph
> through a different route then libvirt.
> 
> We do not need to error out in such case, we can simply ignore the
> volume and continue.
> 
>   error : volStorageBackendRBDRefreshVolInfo:289 :
>     failed to open the RBD image 'vol-998': No such file or directory
> 
> It could also be that one or more Placement Groups (PGs) inside Ceph
> are inactive due to a system failure.
> 
> If that happens it could be that some RBD images can not be refreshed
> and a timeout will be raised by librados.
> 
>   error : volStorageBackendRBDRefreshVolInfo:289 :
>     failed to open the RBD image 'vol-893': Connection timed out
> 
> Ignore the error and continue to refresh the rest of the pool's
> contents.
> 
> Signed-off-by: Wido den Hollander <wido at widodh.nl>
> ---
>  src/storage/storage_backend_rbd.c | 37 ++++++++++++++++++++++++++++---------
>  1 file changed, 28 insertions(+), 9 deletions(-)
> 

Seems reasonable - one nit...  This should be two patches..

> diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c
> index 80684eb..888e3be 100644
> --- a/src/storage/storage_backend_rbd.c
> +++ b/src/storage/storage_backend_rbd.c
> @@ -279,18 +279,17 @@ static int volStorageBackendRBDRefreshVolInfo(virStorageVolDefPtr vol,
>                                                virStoragePoolObjPtr pool,
>                                                virStorageBackendRBDStatePtr ptr)
>  {
> -    int ret = -1;
> -    int r = 0;
> -    rbd_image_t image;
> +    int r = -1;
> +    rbd_image_t image = NULL;
> +    rbd_image_info_t info;
>  
>      r = rbd_open(ptr->ioctx, vol->name, &image, NULL);
>      if (r < 0) {
>          virReportSystemError(-r, _("failed to open the RBD image '%s'"),
>                               vol->name);
> -        return ret;
> +        goto cleanup;
>      }
>  
> -    rbd_image_info_t info;
>      r = rbd_stat(image, &info, sizeof(info));
>      if (r < 0) {
>          virReportSystemError(-r, _("failed to stat the RBD image '%s'"),
> @@ -308,6 +307,8 @@ static int volStorageBackendRBDRefreshVolInfo(virStorageVolDefPtr vol,
>      vol->type = VIR_STORAGE_VOL_NETWORK;
>      vol->target.format = VIR_STORAGE_FILE_RAW;
>  
> +    r = -1;
> +
>      VIR_FREE(vol->target.path);
>      if (virAsprintf(&vol->target.path, "%s/%s",
>                      pool->def->source.name,
> @@ -320,11 +321,13 @@ static int volStorageBackendRBDRefreshVolInfo(virStorageVolDefPtr vol,
>                      vol->name) == -1)
>          goto cleanup;
>  
> -    ret = 0;
> +    r = 0;
>  
>   cleanup:
> -    rbd_close(image);
> -    return ret;
> +    if (image)
> +        rbd_close(image);

Ahhh  a bug fix - should be a separate patch...

> +
> +    return r;

Changes in this function should have been their own patch since they fix
a bug.  Also, keep "ret = -1;' at the top and then use ret as the return
rather than adjusting 'r'.

John
>  }
>  
>  static int virStorageBackendRBDRefreshPool(virConnectPtr conn,
> @@ -399,7 +402,23 @@ static int virStorageBackendRBDRefreshPool(virConnectPtr conn,
>  
>          name += strlen(name) + 1;
>  
> -        if (volStorageBackendRBDRefreshVolInfo(vol, pool, &ptr) < 0) {
> +        r = volStorageBackendRBDRefreshVolInfo(vol, pool, &ptr);
> +
> +        /* It could be that a volume has been deleted through a different route
> +         * then libvirt and that will cause a -ENOENT to be returned.
> +         *
> +         * Another possibility is that there is something wrong with the placement
> +         * group (PG) that RBD image's header is in and that causes -ETIMEDOUT
> +         * to be returned.
> +         *
> +         * Do not error out and simply ignore the volume
> +         */
> +        if (r == -ENOENT || r == -ETIMEDOUT) {
> +            virStorageVolDefFree(vol);
> +            continue;
> +        }
> +
> +        if (r < 0) {
>              virStorageVolDefFree(vol);
>              goto cleanup;
>          }
> 




More information about the libvir-list mailing list