2f9214744a
- Don't comment out patch 0029 (the common submodule update). - Use a common/.gitattributes trick to exclude files from the common patch that are not included in virt-v2v tarball. This also requires some sed hacking. NB: I tried using ':(exclude)...' stuff and it does not work for submodules, at least not with the git version in RHEL 8. For more info see private email thread "Customer case requiring our assistance" in 2023. Reviewed-by: Laszlo Ersek <lersek@redhat.com> resolves: rhbz#2184183
81 lines
3.6 KiB
Diff
81 lines
3.6 KiB
Diff
From 987ddcd2ad7546212d3afed52b56f27a664624d6 Mon Sep 17 00:00:00 2001
|
|
From: Nir Soffer <nsoffer@redhat.com>
|
|
Date: Thu, 21 Jan 2021 03:40:00 +0200
|
|
Subject: [PATCH] v2v: rhv-upload-plugin: Defer imageio connection
|
|
|
|
When using vddk input with certain vmware version, qemu-img may spend
|
|
lot of time getting source image extents. If getting image extents takes
|
|
more than 60 seconds, imageio server closes the idle connection, and the
|
|
transfer will fail on the first write with:
|
|
|
|
nbdkit: python[1]: error: /var/tmp/rhvupload.0OKqWA/rhv-upload-plugin.py: pwrite: error:
|
|
Traceback (most recent call last):
|
|
File "/var/tmp/rhvupload.0OKqWA/rhv-upload-plugin.py", line 94, in wrapper
|
|
return func(h, *args)
|
|
File "/var/tmp/rhvupload.0OKqWA/rhv-upload-plugin.py", line 230, in pwrite
|
|
r = http.getresponse()
|
|
File "/usr/lib64/python3.6/http/client.py", line 1361, in getresponse
|
|
response.begin()
|
|
File "/usr/lib64/python3.6/http/client.py", line 311, in begin
|
|
version, status, reason = self._read_status()
|
|
File "/usr/lib64/python3.6/http/client.py", line 280, in _read_status
|
|
raise RemoteDisconnected("Remote end closed connection without"
|
|
http.client.RemoteDisconnected: Remote end closed connection without response
|
|
|
|
This happens only when not using unix socket, for example when running
|
|
on non-ovirt host, or ovirt host from another data center, or when using
|
|
-oo rhv_direct=false
|
|
|
|
When using unix socket, we close the initial HTTPSConnection, and
|
|
created a new UnixHTTPConnection. This connection is not connected to
|
|
the server yet. When qemu-img tries to access the server, the connection
|
|
is connected automatically.
|
|
|
|
Fix the issue by closing the initial connection used to get server
|
|
options and initialize the handle, and storing a closed connection in
|
|
the handle.
|
|
|
|
Here is the flow with this change:
|
|
|
|
1. Create HTTPSConnection for getting server options
|
|
2. Close the connection[1]
|
|
3. If using unix socket, create UnixHTTPConnection.
|
|
4. Store the connection in the handle.
|
|
5. When qemu-img try to write/zero, the connection is reconnects
|
|
automatically to imageio server[2]
|
|
|
|
Tested by adding a 300 milliseconds delay in nbdkit file plugin. Due to
|
|
the way qemu-img works, this cause more than 2 minutes delay after
|
|
open() but before the first pwrite(). Without this change, the import
|
|
fails consistently when using rhv_direct=false.
|
|
|
|
[1] https://github.com/python/cpython/blob/34df10a9a16b38d54421eeeaf73ec89828563be7/Lib/http/client.py#L958
|
|
[2] https://github.com/python/cpython/blob/34df10a9a16b38d54421eeeaf73ec89828563be7/Lib/http/client.py#L972
|
|
|
|
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
|
|
(cherry picked from commit 1d5fc257765c444644e5bfc6525e86ff201755f0)
|
|
---
|
|
v2v/rhv-upload-plugin.py | 9 +++++++++
|
|
1 file changed, 9 insertions(+)
|
|
|
|
diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py
|
|
index 471102da..7cd6dea6 100644
|
|
--- a/v2v/rhv-upload-plugin.py
|
|
+++ b/v2v/rhv-upload-plugin.py
|
|
@@ -117,6 +117,15 @@ def open(readonly):
|
|
destination_url = parse_transfer_url(transfer)
|
|
http = create_http(destination_url)
|
|
options = get_options(http, destination_url)
|
|
+
|
|
+ # Close the initial connection to imageio server. When qemu-img will
|
|
+ # try to access the server, HTTPConnection will reconnect
|
|
+ # automatically. If we keep this connection idle and qemu-img is too
|
|
+ # slow getting image extents, imageio server may close the connection,
|
|
+ # and the import will fail on the first write.
|
|
+ # See https://bugzilla.redhat.com/1916176.
|
|
+ http.close()
|
|
+
|
|
http = optimize_http(http, host, options)
|
|
except:
|
|
cancel_transfer(connection, transfer)
|