[libvirt] [PATCH 6/7] storage:dir: adapts .refreshVol .refreshPool for ploop volumes

Olga Krishtal okrishtal at virtuozzo.com
Wed Apr 6 12:57:17 UTC 2016


On 06/04/16 15:11, Ján Tomko wrote:
> On Wed, Apr 06, 2016 at 11:18:22AM +0300, Olga Krishtal wrote:
>> On 05/04/16 18:01, Ján Tomko wrote:
>>> On Mon, Mar 14, 2016 at 07:00:39PM +0300, Olga Krishtal wrote:
>>>> Refreshes meta-information such as allocation, capacity, format, etc.
>>>> Ploop volumes differ from other volume types. Path to volume is the path
>>>> to directory with image file root.hds and DiskDescriptor.xml.
>>>> https://openvz.org/Ploop/format
>>>> Due to this fact, operations of opening the volume have to be done once
>>>> again. get the information.
>>>>
>>>> To decide whether the given volume is ploops one, it is necessary to check
>>>> the presence of root.hds and DiskDescriptor.xml files in volumes' directory.
>>>> Only in this case the volume can be manipulated as the ploops one.
>>>> Such strategy helps us to resolve problems that might occure, when we
>>>> upload some other volume type from ploop source.
>>>>
>>>> Signed-off-by: Olga Krishtal <okrishtal at virtuozzo.com>
>>>> ---
>>>>    src/storage/storage_backend.c    | 62 ++++++++++++++++++++++++++++++++++++--
>>>>    src/storage/storage_backend.h    |  5 ++++
>>>>    src/storage/storage_backend_fs.c | 64 +++++++++++++++++++++++++++++++++++++---
>>>>    src/util/virstoragefile.c        |  7 +++--
>>>>    4 files changed, 129 insertions(+), 9 deletions(-)
>>>>
>>>> @@ -69,6 +109,7 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
>>>>        int fd = -1;
>>>>        int ret = -1;
>>>>        int rc;
>>>> +    int format = VIR_STORAGE_FILE_AUTO;
>>>>        virStorageSourcePtr meta = NULL;
>>>>        struct stat sb;
>>>>    
>>>> @@ -84,14 +125,26 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
>>>>            goto cleanup;
>>>>    
>>>>        if (S_ISDIR(sb.st_mode)) {
>>>> -        target->format = VIR_STORAGE_FILE_DIR;
>>>> -        ret = 0;
>>>> -        goto cleanup;
>>>> +        if (virStorageBackendIsPloopDir(target->path)) {
>>>> +            if (virStorageBackendRedoPloopUpdate(target, &sb, &fd,
>>>> +                                                 VIR_STORAGE_VOL_FS_PROBE_FLAGS)
>>>> +                < 0)
>>>> +                goto cleanup;
>>>> +            /* Refresh information stored in DiskDescriptor.xml according
>>>> +             * to ploop image file content.*/
>>>> +            if (virStorageBackendPloopRestoreDesc(target->path) < 0)
>>>> +                goto cleanup;
>>> Probing a volume should not change its contents - libvirt should only
>>> refresh this XML when it changed the volume.
>>>
>>> The rest looks good to me.
>>>
>>> Jan
>> The thing is that if we changed the size, the content of root.hds and
>> had left the old DiskDeskriptor.xml - it becomes impossible to operate.
>> I mean that DiskDescriptor.xml stores this info - size, Celinders,
>> Sectors, and what is more important - all information about snapshot.
>> In the situation when we have uploaded previously snapshoted volume -
>> the content of volume and DiskDescriptor will be inconsistent.
>> And work upon such volume will be impossible.
>> But if you have any idea, where such refresh of DiskDescriptor.xml could
>> be done - I will be glad to know.
> DiskDeskriptor should be changed at the same time as root.hds -
> if libvirt does the resize/content change, it should refresh the XML as
> part of the API that changes the volume.
>
> Libvirt's pool refresh or vol refresh should only update libvirtd's
> in-memory metadata to match the on-disk state.
DiskDescriptor.xml content is based on root.hsd - ploop 
restore-desciptor uses root.hds header.
 From this point of view I just copy the info from root.hds yo DD.xml

>
> If the on-disk state was left inconsistent by some other application,
> it's a problem of that application. I don't think libvirt should be
> working around that.
>
> Jan
But what about the uploadVol. As I understand volume ulpload is 
asynchronous operation - I mean,
that virStorageVolUpload will returned before the content will be updated:
  if (virStorageVolUpload(vol, st, offset, length, 0) < 0) { ------ 
returned from ulpoad, but I can not generate new DiskDeskriptor.xml it 
is too early. I need volume with new content.
         vshError(ctl, _("cannot upload to volume %s"), name);
         goto cleanup;
     }

     if (virStreamSendAll(st, cmdVolUploadSource, &fd) < 0) { ----- I 
can do it. Volume is ready to use.
         vshError(ctl, _("cannot send data to volume %s"), name);
         goto cleanup;
     }
I




More information about the libvir-list mailing list