[PATCH 15/30] conf: Add support for setting timeout and readahead size for network disks

Peter Krempa pkrempa at redhat.com
Mon Mar 9 16:22:55 UTC 2020


Some disk backends support configuring the readahead buffer or timeout
for requests. Add the knobs to the XML.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 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




More information about the libvir-list mailing list