Nir Soffer
2021-Jan-22 22:45 UTC
[Libguestfs] [PATCH 2/6] v2v: rhv-upload-plugin: Use API_VERSION 2
Update the callbacks to use new API, avoiding copies in pread(). Since pread() is not used during import, this is not very useful, but it allow using parallel threading model. Signed-off-by: Nir Soffer <nsoffer at redhat.com> --- v2v/rhv-upload-plugin.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py index e261dfdb..0f8101dd 100644 --- a/v2v/rhv-upload-plugin.py +++ b/v2v/rhv-upload-plugin.py @@ -32,6 +32,9 @@ from urllib.parse import urlparse import ovirtsdk4 as sdk import ovirtsdk4.types as types +# Using version 2 supporting the buffer protocol for better performance. +API_VERSION = 2 + # Timeout to wait for oVirt disks to change status, or the transfer # object to finish initializing [seconds]. timeout = 5 * 60 @@ -190,7 +193,8 @@ def request_failed(r, msg): @failing -def pread(h, count, offset): +def pread(h, buf, offset, flags): + count = len(buf) http = h['http'] headers = {"Range": "bytes=%d-%d" % (offset, offset + count - 1)} @@ -203,11 +207,26 @@ def pread(h, count, offset): "could not read sector offset %d size %d" % (offset, count)) - return r.read() + content_length = int(r.getheader("content-length")) + if content_length != count: + # Should never happen. + request_failed(r, + "unexpected Content-Length offset %d size %d got %d" % + (offset, count, content_length)) + + with memoryview(buf) as view: + got = 0 + while got < count: + n = r.readinto(view[got:]) + if n == 0: + request_failed(r, + "short read offset %d size %d got %d" % + (offset, count, got)) + got += n @failing -def pwrite(h, buf, offset): +def pwrite(h, buf, offset, flags): http = h['http'] count = len(buf) @@ -234,7 +253,7 @@ def pwrite(h, buf, offset): @failing -def zero(h, count, offset, may_trim): +def zero(h, count, offset, flags): http = h['http'] # Unlike the trim and flush calls, there is no 'can_zero' method @@ -292,7 +311,7 @@ def emulate_zero(h, count, offset): @failing -def flush(h): +def flush(h, flags): http = h['http'] # Construct the JSON request for flushing. -- 2.26.2
Richard W.M. Jones
2021-Jan-23 06:27 UTC
[Libguestfs] [PATCH 2/6] v2v: rhv-upload-plugin: Use API_VERSION 2
On Sat, Jan 23, 2021 at 12:45:20AM +0200, Nir Soffer wrote:> @failing > -def pwrite(h, buf, offset): > +def pwrite(h, buf, offset, flags): > http = h['http'] > > count = len(buf) > @@ -234,7 +253,7 @@ def pwrite(h, buf, offset): > > > @failing > -def zero(h, count, offset, may_trim): > +def zero(h, count, offset, flags):Assume there's no way to pass the possible FUA flag through to oVirt here? Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org