Richard W.M. Jones
2022-Apr-14 08:09 UTC
[Libguestfs] [PATCH] -o rhv-upload: wait for VM creation task
On Wed, Apr 13, 2022 at 09:32:14PM +0300, Nir Soffer wrote:> > +# Wait for the import job to finish > > +endt = time.time() + timeout > > Since we use python 3, it is better to use time.monotonic() > which is affected by system time changes.Interesting - we use time.time() quite a lot at the moment. How about the following patch? It passes tests for me locally (so only against the test harness, not real RHV). Rich. diff --git a/output/rhv-upload-finalize.py b/output/rhv-upload-finalize.py index 4d1dcfb2f4..1221e766ac 100644 --- a/output/rhv-upload-finalize.py +++ b/output/rhv-upload-finalize.py @@ -73,7 +73,7 @@ def finalize_transfer(connection, transfer_id, disk_id): .image_transfers_service() .image_transfer_service(transfer_id)) - start = time.time() + start = time.monotonic() transfer_service.finalize() @@ -125,14 +125,14 @@ def finalize_transfer(connection, transfer_id, disk_id): raise RuntimeError( "transfer %s was paused by system" % (transfer.id,)) - if time.time() > start + timeout: + if time.monotonic() > start + timeout: raise RuntimeError( "timed out waiting for transfer %s to finalize, " "transfer is %s" % (transfer.id, transfer.phase)) debug("transfer %s finalized in %.3f seconds" - % (transfer_id, time.time() - start)) + % (transfer_id, time.monotonic() - start)) # Parameters are passed in via a JSON doc from the OCaml code. -- 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
Richard W.M. Jones
2022-Apr-14 08:11 UTC
[Libguestfs] [PATCH] -o rhv-upload: wait for VM creation task
Sorry, that patch was incomplete. Here's a better patch.
Rich.
commit d2c018676111de0d5fb895301fb9035c8763f5bb (HEAD -> master)
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Thu Apr 14 09:09:15 2022 +0100
-o rhv-upload: Use time.monotonic
In Python >= 3.3 we can use a monotonic instead of system clock, which
ensures the clock will never go backwards during these loops.
Thanks: Nir Soffer
diff --git a/output/rhv-upload-finalize.py b/output/rhv-upload-finalize.py
index 4d1dcfb2f4..1221e766ac 100644
--- a/output/rhv-upload-finalize.py
+++ b/output/rhv-upload-finalize.py
@@ -73,7 +73,7 @@ def finalize_transfer(connection, transfer_id, disk_id):
.image_transfers_service()
.image_transfer_service(transfer_id))
- start = time.time()
+ start = time.monotonic()
transfer_service.finalize()
@@ -125,14 +125,14 @@ def finalize_transfer(connection, transfer_id, disk_id):
raise RuntimeError(
"transfer %s was paused by system" %
(transfer.id,))
- if time.time() > start + timeout:
+ if time.monotonic() > start + timeout:
raise RuntimeError(
"timed out waiting for transfer %s to finalize, "
"transfer is %s"
% (transfer.id, transfer.phase))
debug("transfer %s finalized in %.3f seconds"
- % (transfer_id, time.time() - start))
+ % (transfer_id, time.monotonic() - start))
# Parameters are passed in via a JSON doc from the OCaml code.
diff --git a/output/rhv-upload-transfer.py b/output/rhv-upload-transfer.py
index cf4f8807e6..62b842b67b 100644
--- a/output/rhv-upload-transfer.py
+++ b/output/rhv-upload-transfer.py
@@ -128,13 +128,13 @@ def create_disk(connection):
# can't start if the disk is locked.
disk_service = disks_service.disk_service(disk.id)
- endt = time.time() + timeout
+ endt = time.monotonic() + timeout
while True:
time.sleep(1)
disk = disk_service.get()
if disk.status == types.DiskStatus.OK:
break
- if time.time() > endt:
+ if time.monotonic() > endt:
raise RuntimeError(
"timed out waiting for disk %s to become unlocked" %
disk.id)
@@ -176,7 +176,7 @@ def create_transfer(connection, disk, host):
# If the transfer was paused, we need to cancel it to remove the disk,
# otherwise the system will remove the disk and transfer shortly after.
- endt = time.time() + timeout
+ endt = time.monotonic() + timeout
while True:
time.sleep(1)
try:
@@ -204,7 +204,7 @@ def create_transfer(connection, disk, host):
"unexpected transfer %s phase %s"
% (transfer.id, transfer.phase))
- if time.time() > endt:
+ if time.monotonic() > endt:
transfer_service.cancel()
raise RuntimeError(
"timed out waiting for transfer %s" % transfer.id)
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top