conf: snapshot: Add support for <metadata_cache>

Similarly to the domain config code it may be beneficial to control the
cache size of images introduced as snapshots into the backing chain.
Wire up handling of the 'metadata_cache' element.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2021-01-07 15:30:21 +01:00
parent 154df5840d
commit 06380cb587
6 changed files with 70 additions and 2 deletions

View File

@ -186,6 +186,10 @@
with an attribute <code>type</code> giving the driver type (such with an attribute <code>type</code> giving the driver type (such
as qcow2), of the new file created by the external as qcow2), of the new file created by the external
snapshot of the new file. snapshot of the new file.
Optionally <code>metadata_cache</code> sub-element can be used
with same semantics as the identically named subelement of the
domain definition disk's driver.
</dd> </dd>
<dt><code>seclabel</code></dt> <dt><code>seclabel</code></dt>
</dl> </dl>

View File

@ -212,7 +212,15 @@
<ref name="storageFormatBacking"/> <ref name="storageFormatBacking"/>
</attribute> </attribute>
</optional> </optional>
<empty/> <optional>
<element name="metadata_cache">
<optional>
<element name="max_size">
<ref name="scaledInteger"/>
</element>
</optional>
</element>
</optional>
</element> </element>
</optional> </optional>
</define> </define>

View File

@ -190,6 +190,12 @@ virDomainSnapshotDiskDefParseXML(xmlNodePtr node,
goto cleanup; goto cleanup;
} }
if (virParseScaledValue("./driver/metadata_cache/max_size", NULL,
ctxt,
&def->src->metadataCacheMaxSize,
1, ULLONG_MAX, false) < 0)
goto cleanup;
/* validate that the passed path is absolute */ /* validate that the passed path is absolute */
if (virStorageSourceIsRelative(def->src)) { if (virStorageSourceIsRelative(def->src)) {
virReportError(VIR_ERR_XML_ERROR, virReportError(VIR_ERR_XML_ERROR,
@ -784,12 +790,27 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf,
virDomainSnapshotLocationTypeToString(disk->snapshot)); virDomainSnapshotLocationTypeToString(disk->snapshot));
if (disk->src->path || disk->src->format != 0) { if (disk->src->path || disk->src->format != 0) {
g_auto(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER;
g_auto(virBuffer) driverChildBuf = VIR_BUFFER_INIT_CHILD(&childBuf);
virBufferAsprintf(&attrBuf, " type='%s'", virStorageTypeToString(disk->src->type)); virBufferAsprintf(&attrBuf, " type='%s'", virStorageTypeToString(disk->src->type));
if (disk->src->format > 0) if (disk->src->format > 0)
virBufferEscapeString(&childBuf, "<driver type='%s'/>\n", virBufferEscapeString(&driverAttrBuf, " type='%s'",
virStorageFileFormatTypeToString(disk->src->format)); virStorageFileFormatTypeToString(disk->src->format));
if (disk->src->metadataCacheMaxSize > 0) {
g_auto(virBuffer) metadataCacheChildBuf = VIR_BUFFER_INIT_CHILD(&driverChildBuf);
virBufferAsprintf(&metadataCacheChildBuf,
"<max_size unit='bytes'>%llu</max_size>\n",
disk->src->metadataCacheMaxSize);
virXMLFormatElement(&driverChildBuf, "metadata_cache", NULL, &metadataCacheChildBuf);
}
virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, &driverChildBuf);
if (virDomainDiskSourceFormat(&childBuf, disk->src, "source", 0, false, 0, if (virDomainDiskSourceFormat(&childBuf, disk->src, "source", 0, false, 0,
false, false, xmlopt) < 0) false, false, xmlopt) < 0)
return -1; return -1;

View File

@ -0,0 +1,14 @@
<domainsnapshot>
<name>my snap name</name>
<description>!@#$%^</description>
<disks>
<disk name='hdd' snapshot='external'>
<source file='/path/to/new'/>
<driver type='qcow2'>
<metadata_cache>
<max_size unit='bytes'>1234</max_size>
</metadata_cache>
</driver>
</disk>
</disks>
</domainsnapshot>

View File

@ -0,0 +1,18 @@
<domainsnapshot>
<name>my snap name</name>
<description>!@#$%^</description>
<creationTime>1386166249</creationTime>
<disks>
<disk name='hdd' snapshot='external' type='file'>
<driver type='qcow2'>
<metadata_cache>
<max_size unit='bytes'>1234</max_size>
</metadata_cache>
</driver>
<source file='/path/to/new'/>
</disk>
</disks>
<domain>
<uuid>9d37b878-a7cc-9f9a-b78f-49b3abad25a8</uuid>
</domain>
</domainsnapshot>

View File

@ -181,6 +181,9 @@ mymain(void)
DO_TEST_IN("description_only", NULL); DO_TEST_IN("description_only", NULL);
DO_TEST_IN("name_only", NULL); DO_TEST_IN("name_only", NULL);
DO_TEST_INOUT("qcow2-metadata-cache", "9d37b878-a7cc-9f9a-b78f-49b3abad25a8",
1386166249, 0);
qemuTestDriverFree(&driver); qemuTestDriverFree(&driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;