[libvirt] [PATCH v2 05/12] getstats: rearrange blockinfo gathering

Eric Blake eblake at redhat.com
Wed Dec 17 06:30:13 UTC 2014


On 12/16/2014 04:33 PM, Eric Blake wrote:
> On 12/16/2014 06:54 AM, Peter Krempa wrote:
>> On 12/16/14 09:04, Eric Blake wrote:
>>> We want to avoid read()ing a file while qemu is running.  We still
>>> have to open() block devices to determine their physical size, but
>>> that is safer.  This patch rearranges code to make it easier to
>>> skip the metadata collection when possible.
>>>
>>> * src/qemu/qemu_driver.c (qemuDomainGetBlockInfo): Check for empty
>>> disk up front.  Perform stat first.  Place metadata reading next
>>> to use.
>>>
> 
>>> +        if (stat(disk->src->path, &sb) < 0) {
>>> +            virReportSystemError(errno,
>>> +                                 _("cannot stat file '%s'"), disk->src->path);
>>>              goto endjob;
>>>          }
>>
>> Um this will cause problems on NFS. The code after that that you are
>> moving uses the FD to do the stat() call. The fd is opened by the helper
>> that opens the file with correct perms.
> 
> Oh, you're right.  I'll see how hairy it is to pull this patch out of
> the current series, and save the rework of avoiding open()ing the files
> to later (I may end up with a situation that is less efficient, by
> possibly open()ing some files twice for offline domains, once for
> capacity, and once for determining the last offset of a block device,
> instead of the current code that tries to do both from a single fd but
> becomes harder to untangle).  1-4 are pushed, and I'm seeing what
> happens to the rest of the series if I leave this out for now...
> 

>> Otherwise looks okay.
>> 
>> Peter
> 

Turned out to be a little bit hairy; what I ended up pushing was JUST
the refactoring for earlier checking for empty images and later grouping
of read-related code, leaving the open-code untouched for later:

diff --git c/src/qemu/qemu_driver.c i/src/qemu/qemu_driver.c
index 75ea218..3d81a5b 100644
--- c/src/qemu/qemu_driver.c
+++ i/src/qemu/qemu_driver.c
@@ -11057,6 +11057,12 @@ qemuDomainGetBlockInfo(virDomainPtr dom,

     disk = vm->def->disks[idx];
     src = disk->src;
+    if (virStorageSourceIsEmpty(src)) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("disk '%s' does not currently have a source
assigned"),
+                       path);
+        goto endjob;
+    }

     /* FIXME: For an offline domain, we always want to check current
      * on-disk statistics (as users have been known to change offline
@@ -11079,13 +11085,6 @@ qemuDomainGetBlockInfo(virDomainPtr dom,
      * change.
      */
     if (virStorageSourceIsLocalStorage(src)) {
-        if (!src->path) {
-            virReportError(VIR_ERR_INVALID_ARG,
-                           _("disk '%s' does not currently have a
source assigned"),
-                           path);
-            goto endjob;
-        }
-
         if ((fd = qemuOpenFile(driver, vm, src->path, O_RDONLY,
                                NULL, NULL)) == -1)
             goto endjob;
@@ -11116,26 +11115,6 @@ qemuDomainGetBlockInfo(virDomainPtr dom,
         }
     }

-    /* Probe for magic formats */
-    if (virDomainDiskGetFormat(disk)) {
-        format = virDomainDiskGetFormat(disk);
-    } else {
-        if (!cfg->allowDiskFormatProbing) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("no disk format for %s and probing is
disabled"),
-                           path);
-            goto endjob;
-        }
-
-        if ((format = virStorageFileProbeFormatFromBuf(src->path,
-                                                       buf, len)) < 0)
-            goto endjob;
-    }
-
-    if (!(meta = virStorageFileGetMetadataFromBuf(src->path, buf, len,
-                                                  format, NULL)))
-        goto endjob;
-
     /* Get info for normal formats */
     if (S_ISREG(sb.st_mode) || fd == -1) {
 #ifndef WIN32
@@ -11164,6 +11143,21 @@ qemuDomainGetBlockInfo(virDomainPtr dom,

     /* If the file we probed has a capacity set, then override
      * what we calculated from file/block extents */
+    if (!(format = src->format)) {
+        if (!cfg->allowDiskFormatProbing) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("no disk format for %s and probing is
disabled"),
+                           path);
+            goto endjob;
+        }
+
+        if ((format = virStorageFileProbeFormatFromBuf(src->path,
+                                                       buf, len)) < 0)
+            goto endjob;
+    }
+    if (!(meta = virStorageFileGetMetadataFromBuf(src->path, buf, len,
+                                                  format, NULL)))
+        goto endjob;
     if (meta->capacity)
         src->capacity = meta->capacity;



-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 539 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141216/25fa5415/attachment-0001.sig>


More information about the libvir-list mailing list