From: Jason Dillaman <dillaman(a)redhat.com>
When this attribute is set to 'capacity', refreshing volume
allocations within the pool will report the capacity for the
allocation. This is useful for certain backends where computing
the actual allocation of a volume might be an expensive
operation.
Signed-off-by: Jason Dillaman <dillaman(a)redhat.com>
---
docs/formatstorage.html.in | 15 +++++++++---
docs/schemas/storagecommon.rng | 7 ++++++
docs/schemas/storagepool.rng | 5 ++++
src/conf/storage_conf.c | 23 +++++++++++++++++++
src/conf/storage_conf.h | 9 ++++++++
.../pool-rbd-refresh-volume-allocation.xml | 12 ++++++++++
.../pool-rbd-refresh-volume-allocation.xml | 15 ++++++++++++
tests/storagepoolxml2xmltest.c | 1 +
8 files changed, 84 insertions(+), 3 deletions(-)
create mode 100644 tests/storagepoolxml2xmlin/pool-rbd-refresh-volume-allocation.xml
create mode 100644 tests/storagepoolxml2xmlout/pool-rbd-refresh-volume-allocation.xml
diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index 968651330f..d40e463167 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -16,7 +16,7 @@
</p>
<p>
The top level tag for a storage pool document is 'pool'. It has
- a single attribute <code>type</code>, which is one of
<code>dir</code>,
+ an attribute <code>type</code>, which is one of
<code>dir</code>,
<code>fs</code>, <code>netfs</code>,
<code>disk</code>,
<code>iscsi</code>, <code>logical</code>,
<code>scsi</code>
(all <span class="since">since 0.4.1</span>),
@@ -27,8 +27,17 @@
<code>zfs</code> (<span class="since">since
1.2.8</span>),
<code>vstorage</code> (<span class="since">since
3.1.0</span>),
or <code>iscsi-direct</code> (<span class="since">since
4.7.0</span>).
- This corresponds to the
- storage backend drivers listed further along in this document.
+ This corresponds to the storage backend drivers listed further along in
+ this document.
+ </p>
+ <p>
+ The 'pool' element may also have an optional
+ <code>refresh_volume_allocation</code> attribute to control how
+ volume allocation is computed during a refresh. Valid values
+ are <code>default</code> to compute the actual usage or
+ <code>capacity</code> to default the allocation to the logical
+ capacity for cases where computing the allocation is too expensive.
+ <span class="since">Since 5.1.1</span>
</p>
<h3><a id="StoragePoolFirst">General
metadata</a></h3>
diff --git a/docs/schemas/storagecommon.rng b/docs/schemas/storagecommon.rng
index 63b51470a0..d837f92bc7 100644
--- a/docs/schemas/storagecommon.rng
+++ b/docs/schemas/storagecommon.rng
@@ -236,4 +236,11 @@
</optional>
</define>
+ <define name='refreshVolumeAllocation'>
+ <choice>
+ <value>default</value>
+ <value>capacity</value>
+ </choice>
+ </define>
+
</grammar>
diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index 3907f70afe..e44ecdb3f3 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -11,6 +11,11 @@
<define name='pool'>
<element name='pool'>
+ <optional>
+ <attribute name='refresh_volume_allocation'>
+ <ref name="refreshVolumeAllocation"/>
+ </attribute>
+ </optional>
<choice>
<ref name='pooldir'/>
<ref name='poolfs'/>
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index c7ab5b8802..dc4838058c 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -94,6 +94,11 @@ VIR_ENUM_IMPL(virStorageVolFormatDisk,
"extended",
);
+VIR_ENUM_IMPL(virStorageVolRefreshAllocation,
+ VIR_STORAGE_VOL_REFRESH_ALLOCATION_LAST,
+ "default", "capacity",
+);
+
VIR_ENUM_IMPL(virStoragePartedFs,
VIR_STORAGE_PARTED_FS_TYPE_LAST,
"ext2", "ext2", "fat16",
@@ -797,6 +802,7 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
xmlNodePtr source_node;
VIR_AUTOPTR(virStoragePoolDef) def = NULL;
VIR_AUTOFREE(char *) type = NULL;
+ VIR_AUTOFREE(char *) refresh_volume_allocation = NULL;
VIR_AUTOFREE(char *) uuid = NULL;
VIR_AUTOFREE(char *) target_path = NULL;
@@ -819,6 +825,18 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
if ((options = virStoragePoolOptionsForPoolType(def->type)) == NULL)
return NULL;
+ refresh_volume_allocation =
virXPathString("string(./@refresh_volume_allocation)",
+ ctxt);
+ if (refresh_volume_allocation) {
+ if ((def->refresh_volume_allocation =
+ virStorageVolRefreshAllocationTypeFromString(refresh_volume_allocation))
< 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown storage pool volume refresh allocation
type %s"),
+ refresh_volume_allocation);
+ return NULL;
+ }
+ }
+
source_node = virXPathNode("./source", ctxt);
if (source_node) {
if (virStoragePoolDefParseSource(ctxt, &def->source, def->type,
@@ -1107,8 +1125,13 @@ virStoragePoolDefFormatBuf(virBufferPtr buf,
return -1;
}
virBufferAsprintf(buf, "<pool type='%s'", type);
+ if (def->refresh_volume_allocation)
+ virBufferAsprintf(buf, " refresh_volume_allocation='%s'",
+
virStorageVolRefreshAllocationTypeToString(def->refresh_volume_allocation));
if (def->namespaceData && def->ns.href)
virBufferAsprintf(buf, " %s", (def->ns.href)());
+
+
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
virBufferEscapeString(buf, "<name>%s</name>\n", def->name);
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index bfbebd15bd..f61d8f5a18 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -83,6 +83,13 @@ struct _virStorageVolSource {
* backend for partition type creation */
};
+typedef enum {
+ VIR_STORAGE_VOL_REFRESH_ALLOCATION_DEFAULT, /* compute actual allocation */
+ VIR_STORAGE_VOL_REFRESH_ALLOCATION_CAPACITY, /* use logical capacity */
+ VIR_STORAGE_VOL_REFRESH_ALLOCATION_LAST,
+} virStorageVolRefreshAllocationType;
+
+VIR_ENUM_DECL(virStorageVolRefreshAllocation);
typedef struct _virStorageVolDef virStorageVolDef;
typedef virStorageVolDef *virStorageVolDefPtr;
@@ -243,6 +250,8 @@ struct _virStoragePoolDef {
unsigned char uuid[VIR_UUID_BUFLEN];
int type; /* virStoragePoolType */
+ int refresh_volume_allocation; /* virStorageVolRefreshAllocationType */
+
unsigned long long allocation; /* bytes */
unsigned long long capacity; /* bytes */
unsigned long long available; /* bytes */
diff --git a/tests/storagepoolxml2xmlin/pool-rbd-refresh-volume-allocation.xml
b/tests/storagepoolxml2xmlin/pool-rbd-refresh-volume-allocation.xml
new file mode 100644
index 0000000000..632d895310
--- /dev/null
+++ b/tests/storagepoolxml2xmlin/pool-rbd-refresh-volume-allocation.xml
@@ -0,0 +1,12 @@
+<pool type='rbd' refresh_volume_allocation='capacity'>
+ <name>ceph</name>
+ <uuid>47c1faee-0207-e741-f5ae-d9b019b98fe2</uuid>
+ <source>
+ <name>rbd</name>
+ <host name='localhost' port='6789'/>
+ <host name='localhost' port='6790'/>
+ <auth username='admin' type='ceph'>
+ <secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
+ </auth>
+ </source>
+</pool>
diff --git a/tests/storagepoolxml2xmlout/pool-rbd-refresh-volume-allocation.xml
b/tests/storagepoolxml2xmlout/pool-rbd-refresh-volume-allocation.xml
new file mode 100644
index 0000000000..c40c0b5bd5
--- /dev/null
+++ b/tests/storagepoolxml2xmlout/pool-rbd-refresh-volume-allocation.xml
@@ -0,0 +1,15 @@
+<pool type='rbd' refresh_volume_allocation='capacity'>
+ <name>ceph</name>
+ <uuid>47c1faee-0207-e741-f5ae-d9b019b98fe2</uuid>
+ <capacity unit='bytes'>0</capacity>
+ <allocation unit='bytes'>0</allocation>
+ <available unit='bytes'>0</available>
+ <source>
+ <host name='localhost' port='6789'/>
+ <host name='localhost' port='6790'/>
+ <name>rbd</name>
+ <auth type='ceph' username='admin'>
+ <secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
+ </auth>
+ </source>
+</pool>
diff --git a/tests/storagepoolxml2xmltest.c b/tests/storagepoolxml2xmltest.c
index bd3408e8b8..2ae514f346 100644
--- a/tests/storagepoolxml2xmltest.c
+++ b/tests/storagepoolxml2xmltest.c
@@ -95,6 +95,7 @@ mymain(void)
DO_TEST("pool-zfs-sourcedev");
DO_TEST("pool-rbd");
#ifdef WITH_STORAGE_RBD
+ DO_TEST("pool-rbd-refresh-volume-allocation");
DO_TEST("pool-rbd-ns-configopts");
#endif
DO_TEST("pool-vstorage");
--
2.20.1