Some disk backends support configuring the readahead buffer or timeout for requests. Add the knobs to the XML. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- docs/formatdomain.html.in | 16 +++++++++++++ docs/schemas/domaincommon.rng | 23 +++++++++++++++++++ src/conf/domain_conf.c | 19 +++++++++++++++ src/util/virstoragefile.c | 2 ++ src/util/virstoragefile.h | 3 +++ .../disk-network-http.xml | 2 ++ 6 files changed, 65 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index dfea614907..79cf82522f 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2852,6 +2852,8 @@ <cookies> <cookie name="test">somevalue</cookie> </cookies> + <readahead size='65536'/> + <timeout seconds='6'/> </source> <target dev='hde' bus='ide' tray='open'/> <readonly/> @@ -3402,6 +3404,20 @@ must conform to the HTTP specification. <span class="since">Since 6.2.0</span> </dd> + <dt><code>readahead</code></dt> + <dd> + Specifies the size of the readahead buffer for protocols + which support it. (all 'curl' based drivers in qemu). The size + is in bytes. Note that '0' is considered as if the value is not + provided. + <span class="since">Since 6.2.0</span> + </dd> + <dt><code>timeout</code></dt> + <dd> + Specifies the connection timeout for protocols which support it. + Note that '0' is considered as if the value is not provided. + <span class="since">Since 6.2.0</span> + </dd> </dl> <p> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 85d6484dbd..6805420451 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1808,6 +1808,25 @@ </element> </define> + <define name="diskSourceNetworkProtocolPropsCommon"> + <optional> + <element name="readahead"> + <attribute name="size"> + <ref name="positiveInteger"/> + </attribute> + <empty/> + </element> + </optional> + <optional> + <element name="timeout"> + <attribute name="seconds"> + <ref name="positiveInteger"/> + </attribute> + <empty/> + </element> + </optional> + </define> + <define name="diskSourceNetworkProtocolSSLVerify"> <element name="ssl"> <attribute name="verify"> @@ -1854,6 +1873,7 @@ <optional> <ref name="diskSourceNetworkProtocolHTTPCookies"/> </optional> + <ref name="diskSourceNetworkProtocolPropsCommon"/> </element> </define> @@ -1873,6 +1893,7 @@ <optional> <ref name="diskSourceNetworkProtocolHTTPCookies"/> </optional> + <ref name="diskSourceNetworkProtocolPropsCommon"/> </element> </define> @@ -1892,6 +1913,7 @@ <optional> <ref name="diskSourceNetworkProtocolSSLVerify"/> </optional> + <ref name="diskSourceNetworkProtocolPropsCommon"/> </element> </define> @@ -1910,6 +1932,7 @@ <optional> <ref name="encryption"/> </optional> + <ref name="diskSourceNetworkProtocolPropsCommon"/> </element> </define> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dc7a47dd21..81352c7b5d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9500,6 +9500,19 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, return -1; } + if (src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTP || + src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTPS || + src->protocol == VIR_STORAGE_NET_PROTOCOL_FTP || + src->protocol == VIR_STORAGE_NET_PROTOCOL_FTPS) { + + if (virXPathULongLong("string(./readahead/@size)", ctxt, &src->readahead) == -2 || + virXPathULongLong("string(./timeout/@seconds)", ctxt, &src->timeout) == -2) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("invalid readahead size or timeout")); + return -1; + } + } + return 0; } @@ -24631,6 +24644,12 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf, virDomainDiskSourceFormatNetworkCookies(childBuf, src); + if (src->readahead) + virBufferAsprintf(childBuf, "<readahead size='%llu'/>\n", src->readahead); + + if (src->timeout) + virBufferAsprintf(childBuf, "<timeout seconds='%llu'/>\n", src->timeout); + return 0; } diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index fb5fff5c5f..9e740419eb 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -2383,6 +2383,8 @@ virStorageSourceCopy(const virStorageSource *src, def->discard = src->discard; def->detect_zeroes = src->detect_zeroes; def->sslverify = src->sslverify; + def->readahead = src->readahead; + def->timeout = src->timeout; /* storage driver metadata are not copied */ def->drv = NULL; diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 95d9501dd8..dd2186c4ff 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -295,6 +295,9 @@ struct _virStorageSource { bool encryptionInherited; virStoragePRDefPtr pr; virTristateBool sslverify; + /* both values below have 0 as default value */ + unsigned long long readahead; /* size of the readahead buffer in bytes */ + unsigned long long timeout; /* connection timeout in seconds */ virStorageSourceNVMeDefPtr nvme; /* type == VIR_STORAGE_TYPE_NVME */ diff --git a/tests/genericxml2xmlindata/disk-network-http.xml b/tests/genericxml2xmlindata/disk-network-http.xml index bafb77c8ec..a8430b8365 100644 --- a/tests/genericxml2xmlindata/disk-network-http.xml +++ b/tests/genericxml2xmlindata/disk-network-http.xml @@ -49,6 +49,8 @@ <cookie name='test'>testcookievalue</cookie> <cookie name='test2'>blurb</cookie> </cookies> + <readahead size='65536'/> + <timeout seconds='10'/> </source> <target dev='vdd' bus='virtio'/> </disk> -- 2.24.1