mirror of https://gitee.com/openkylin/libvirt.git
storage: optional 'refresh' elemement on pool
The new 'refresh' element can override the default refresh operations for a storage pool. The only currently supported override is to set the volume allocation size to the volume capacity. This can be specified by adding the following snippet: <pool> ... <refresh> <volume allocation='capacity'/> </refresh> ... </pool> 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@redhat.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
21deeaf02f
commit
669018bc9c
|
@ -508,6 +508,32 @@
|
||||||
device, measured in bytes. <span class="since">Since 0.4.1</span>
|
device, measured in bytes. <span class="since">Since 0.4.1</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h3><a id="StoragePoolRefresh">Refresh overrides</a></h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The optional <code>refresh</code> element can control how the pool and
|
||||||
|
associated volumes are refreshed (pool type <code>rbd</code>). The
|
||||||
|
<code>allocation</code> attribute of the <code>volume</code> child element
|
||||||
|
controls the method used for computing the allocation of a volume. The
|
||||||
|
valid attribute values are <code>default</code> to compute the actual
|
||||||
|
usage or <code>capacity</code> to use the logical capacity for cases where
|
||||||
|
computing the allocation is too expensive. The following XML snippet
|
||||||
|
shows the syntax:
|
||||||
|
<pre>
|
||||||
|
<pool type="rbd">
|
||||||
|
<name>myrbdpool</name>
|
||||||
|
...
|
||||||
|
<source/>
|
||||||
|
...
|
||||||
|
<refresh>
|
||||||
|
<volume allocation='capacity'/>
|
||||||
|
</refresh>
|
||||||
|
...
|
||||||
|
</pool>
|
||||||
|
</pre>
|
||||||
|
<span class="since">Since 5.2.0</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
<h3><a id="StoragePoolNamespaces">Storage Pool Namespaces</a></h3>
|
<h3><a id="StoragePoolNamespaces">Storage Pool Namespaces</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
|
@ -236,4 +236,11 @@
|
||||||
</optional>
|
</optional>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
|
<define name='refreshVolumeAllocation'>
|
||||||
|
<choice>
|
||||||
|
<value>default</value>
|
||||||
|
<value>capacity</value>
|
||||||
|
</choice>
|
||||||
|
</define>
|
||||||
|
|
||||||
</grammar>
|
</grammar>
|
||||||
|
|
|
@ -155,6 +155,7 @@
|
||||||
<ref name='commonMetadataNameOptional'/>
|
<ref name='commonMetadataNameOptional'/>
|
||||||
<ref name='sizing'/>
|
<ref name='sizing'/>
|
||||||
<ref name='sourcerbd'/>
|
<ref name='sourcerbd'/>
|
||||||
|
<ref name='refresh'/>
|
||||||
</interleave>
|
</interleave>
|
||||||
<optional>
|
<optional>
|
||||||
<ref name='rbd_config_opts'/>
|
<ref name='rbd_config_opts'/>
|
||||||
|
@ -691,6 +692,28 @@
|
||||||
</data>
|
</data>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
|
<define name='refresh'>
|
||||||
|
<optional>
|
||||||
|
<element name='refresh'>
|
||||||
|
<interleave>
|
||||||
|
<ref name='refreshVolume'/>
|
||||||
|
</interleave>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
|
</define>
|
||||||
|
|
||||||
|
<define name='refreshVolume'>
|
||||||
|
<optional>
|
||||||
|
<element name='volume'>
|
||||||
|
<optional>
|
||||||
|
<attribute name='allocation'>
|
||||||
|
<ref name="refreshVolumeAllocation"/>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
|
</define>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Optional storage pool extensions in their own namespace:
|
Optional storage pool extensions in their own namespace:
|
||||||
"fs" or "netfs"
|
"fs" or "netfs"
|
||||||
|
|
|
@ -94,6 +94,11 @@ VIR_ENUM_IMPL(virStorageVolFormatDisk,
|
||||||
"extended",
|
"extended",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VIR_ENUM_IMPL(virStorageVolDefRefreshAllocation,
|
||||||
|
VIR_STORAGE_VOL_DEF_REFRESH_ALLOCATION_LAST,
|
||||||
|
"default", "capacity",
|
||||||
|
);
|
||||||
|
|
||||||
VIR_ENUM_IMPL(virStoragePartedFs,
|
VIR_ENUM_IMPL(virStoragePartedFs,
|
||||||
VIR_STORAGE_PARTED_FS_TYPE_LAST,
|
VIR_STORAGE_PARTED_FS_TYPE_LAST,
|
||||||
"ext2", "ext2", "fat16",
|
"ext2", "ext2", "fat16",
|
||||||
|
@ -789,6 +794,51 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virStoragePoolDefRefreshParse(xmlXPathContextPtr ctxt,
|
||||||
|
virStoragePoolDefPtr def)
|
||||||
|
{
|
||||||
|
VIR_AUTOFREE(virStoragePoolDefRefreshPtr) refresh = NULL;
|
||||||
|
VIR_AUTOFREE(char *) allocation = NULL;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
allocation = virXPathString("string(./refresh/volume/@allocation)", ctxt);
|
||||||
|
|
||||||
|
if (!allocation)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((tmp = virStorageVolDefRefreshAllocationTypeFromString(allocation)) < 0) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("unknown storage pool volume refresh allocation type %s"),
|
||||||
|
allocation);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VIR_ALLOC(refresh) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
refresh->volume.allocation = tmp;
|
||||||
|
VIR_STEAL_PTR(def->refresh, refresh);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virStoragePoolDefRefreshFormat(virBufferPtr buf,
|
||||||
|
virStoragePoolDefRefreshPtr refresh)
|
||||||
|
{
|
||||||
|
if (!refresh)
|
||||||
|
return;
|
||||||
|
|
||||||
|
virBufferAddLit(buf, "<refresh>\n");
|
||||||
|
virBufferAdjustIndent(buf, 2);
|
||||||
|
virBufferAsprintf(buf, "<volume allocation='%s'/>\n",
|
||||||
|
virStorageVolDefRefreshAllocationTypeToString(refresh->volume.allocation));
|
||||||
|
virBufferAdjustIndent(buf, -2);
|
||||||
|
virBufferAddLit(buf, "</refresh>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virStoragePoolDefPtr
|
virStoragePoolDefPtr
|
||||||
virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
|
virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
|
||||||
{
|
{
|
||||||
|
@ -799,6 +849,7 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
|
||||||
VIR_AUTOFREE(char *) type = NULL;
|
VIR_AUTOFREE(char *) type = NULL;
|
||||||
VIR_AUTOFREE(char *) uuid = NULL;
|
VIR_AUTOFREE(char *) uuid = NULL;
|
||||||
VIR_AUTOFREE(char *) target_path = NULL;
|
VIR_AUTOFREE(char *) target_path = NULL;
|
||||||
|
VIR_AUTOFREE(char *) refresh_volume_allocation = NULL;
|
||||||
|
|
||||||
if (VIR_ALLOC(def) < 0)
|
if (VIR_ALLOC(def) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -931,6 +982,9 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (virStoragePoolDefRefreshParse(ctxt, def) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* Make a copy of all the callback pointers here for easier use,
|
/* Make a copy of all the callback pointers here for easier use,
|
||||||
* especially during the virStoragePoolSourceClear method */
|
* especially during the virStoragePoolSourceClear method */
|
||||||
def->ns = options->ns;
|
def->ns = options->ns;
|
||||||
|
@ -1163,6 +1217,8 @@ virStoragePoolDefFormatBuf(virBufferPtr buf,
|
||||||
virBufferAddLit(buf, "</target>\n");
|
virBufferAddLit(buf, "</target>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virStoragePoolDefRefreshFormat(buf, def->refresh);
|
||||||
|
|
||||||
if (def->namespaceData && def->ns.format) {
|
if (def->namespaceData && def->ns.format) {
|
||||||
if ((def->ns.format)(buf, def->namespaceData) < 0)
|
if ((def->ns.format)(buf, def->namespaceData) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -83,6 +83,13 @@ struct _virStorageVolSource {
|
||||||
* backend for partition type creation */
|
* backend for partition type creation */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VIR_STORAGE_VOL_DEF_REFRESH_ALLOCATION_DEFAULT, /* compute actual allocation */
|
||||||
|
VIR_STORAGE_VOL_DEF_REFRESH_ALLOCATION_CAPACITY, /* use logical capacity */
|
||||||
|
VIR_STORAGE_VOL_DEF_REFRESH_ALLOCATION_LAST,
|
||||||
|
} virStorageVolDefRefreshAllocation;
|
||||||
|
|
||||||
|
VIR_ENUM_DECL(virStorageVolDefRefreshAllocation);
|
||||||
|
|
||||||
typedef struct _virStorageVolDef virStorageVolDef;
|
typedef struct _virStorageVolDef virStorageVolDef;
|
||||||
typedef virStorageVolDef *virStorageVolDefPtr;
|
typedef virStorageVolDef *virStorageVolDefPtr;
|
||||||
|
@ -236,6 +243,21 @@ struct _virStoragePoolTarget {
|
||||||
virStoragePerms perms; /* Default permissions for volumes */
|
virStoragePerms perms; /* Default permissions for volumes */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _virStorageVolDefRefresh virStorageVolDefRefresh;
|
||||||
|
typedef virStorageVolDefRefresh *virStorageVolDefRefreshPtr;
|
||||||
|
struct _virStorageVolDefRefresh {
|
||||||
|
int allocation; /* virStorageVolDefRefreshAllocation */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _virStoragePoolDefRefresh virStoragePoolDefRefresh;
|
||||||
|
typedef virStoragePoolDefRefresh *virStoragePoolDefRefreshPtr;
|
||||||
|
struct _virStoragePoolDefRefresh {
|
||||||
|
virStorageVolDefRefresh volume;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct _virStoragePoolDef virStoragePoolDef;
|
typedef struct _virStoragePoolDef virStoragePoolDef;
|
||||||
typedef virStoragePoolDef *virStoragePoolDefPtr;
|
typedef virStoragePoolDef *virStoragePoolDefPtr;
|
||||||
struct _virStoragePoolDef {
|
struct _virStoragePoolDef {
|
||||||
|
@ -243,6 +265,8 @@ struct _virStoragePoolDef {
|
||||||
unsigned char uuid[VIR_UUID_BUFLEN];
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
||||||
int type; /* virStoragePoolType */
|
int type; /* virStoragePoolType */
|
||||||
|
|
||||||
|
virStoragePoolDefRefreshPtr refresh;
|
||||||
|
|
||||||
unsigned long long allocation; /* bytes */
|
unsigned long long allocation; /* bytes */
|
||||||
unsigned long long capacity; /* bytes */
|
unsigned long long capacity; /* bytes */
|
||||||
unsigned long long available; /* bytes */
|
unsigned long long available; /* bytes */
|
||||||
|
|
|
@ -942,6 +942,8 @@ virStorageVolDefFree;
|
||||||
virStorageVolDefParseFile;
|
virStorageVolDefParseFile;
|
||||||
virStorageVolDefParseNode;
|
virStorageVolDefParseNode;
|
||||||
virStorageVolDefParseString;
|
virStorageVolDefParseString;
|
||||||
|
virStorageVolDefRefreshAllocationTypeFromString;
|
||||||
|
virStorageVolDefRefreshAllocationTypeToString;
|
||||||
virStorageVolTypeFromString;
|
virStorageVolTypeFromString;
|
||||||
virStorageVolTypeToString;
|
virStorageVolTypeToString;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<pool type='rbd'>
|
||||||
|
<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>
|
||||||
|
<refresh>
|
||||||
|
<volume allocation='capacity'/>
|
||||||
|
</refresh>
|
||||||
|
</pool>
|
|
@ -0,0 +1,18 @@
|
||||||
|
<pool type='rbd'>
|
||||||
|
<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>
|
||||||
|
<refresh>
|
||||||
|
<volume allocation='capacity'/>
|
||||||
|
</refresh>
|
||||||
|
</pool>
|
|
@ -95,6 +95,7 @@ mymain(void)
|
||||||
DO_TEST("pool-zfs-sourcedev");
|
DO_TEST("pool-zfs-sourcedev");
|
||||||
DO_TEST("pool-rbd");
|
DO_TEST("pool-rbd");
|
||||||
#ifdef WITH_STORAGE_RBD
|
#ifdef WITH_STORAGE_RBD
|
||||||
|
DO_TEST("pool-rbd-refresh-volume-allocation");
|
||||||
DO_TEST("pool-rbd-ns-configopts");
|
DO_TEST("pool-rbd-ns-configopts");
|
||||||
#endif
|
#endif
|
||||||
DO_TEST("pool-vstorage");
|
DO_TEST("pool-vstorage");
|
||||||
|
|
Loading…
Reference in New Issue