]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_domain: Introduce qemuDomainObjBeginJobNowait
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 7 Jun 2018 08:19:52 +0000 (10:19 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 19 Jun 2018 05:08:12 +0000 (07:08 +0200)
The aim of this API is to allow the caller to do best effort.
Some functions can work even when acquiring the job fails (e.g.
qemuConnectGetAllDomainStats()). But what they can't bear is
delay if they have to wait up to 30 seconds for each domain that
is processing some other job.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h

index 21d54938b69897451d3b62f4f0ac688154943229..8a2d4750a56aae45ee4651bae19a6ea3ba02ca3d 100644 (file)
@@ -6359,11 +6359,16 @@ qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv, qemuDomainJob job)
  * @obj: domain object
  * @job: qemuDomainJob to start
  * @asyncJob: qemuDomainAsyncJob to start
+ * @nowait: don't wait trying to acquire @job
  *
  * Acquires job for a domain object which must be locked before
  * calling. If there's already a job running waits up to
  * QEMU_JOB_WAIT_TIME after which the functions fails reporting
- * an error.
+ * an error unless @nowait is set.
+ *
+ * If @nowait is true this function tries to acquire job and if
+ * it fails, then it returns immediately without waiting. No
+ * error is reported in this case.
  *
  * Returns: 0 on success,
  *         -2 if unable to start job because of timeout or
@@ -6374,7 +6379,8 @@ static int ATTRIBUTE_NONNULL(1)
 qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
                               virDomainObjPtr obj,
                               qemuDomainJob job,
-                              qemuDomainAsyncJob asyncJob)
+                              qemuDomainAsyncJob asyncJob,
+                              bool nowait)
 {
     qemuDomainObjPrivatePtr priv = obj->privateData;
     unsigned long long now;
@@ -6414,12 +6420,18 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
     }
 
     while (!nested && !qemuDomainNestedJobAllowed(priv, job)) {
+        if (nowait)
+            goto cleanup;
+
         VIR_DEBUG("Waiting for async job (vm=%p name=%s)", obj, obj->def->name);
         if (virCondWaitUntil(&priv->job.asyncCond, &obj->parent.lock, then) < 0)
             goto error;
     }
 
     while (priv->job.active) {
+        if (nowait)
+            goto cleanup;
+
         VIR_DEBUG("Waiting for job (vm=%p name=%s)", obj, obj->def->name);
         if (virCondWaitUntil(&priv->job.cond, &obj->parent.lock, then) < 0)
             goto error;
@@ -6536,7 +6548,7 @@ int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
                           qemuDomainJob job)
 {
     if (qemuDomainObjBeginJobInternal(driver, obj, job,
-                                      QEMU_ASYNC_JOB_NONE) < 0)
+                                      QEMU_ASYNC_JOB_NONE, false) < 0)
         return -1;
     else
         return 0;
@@ -6551,7 +6563,7 @@ int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
     qemuDomainObjPrivatePtr priv;
 
     if (qemuDomainObjBeginJobInternal(driver, obj, QEMU_JOB_ASYNC,
-                                      asyncJob) < 0)
+                                      asyncJob, false) < 0)
         return -1;
 
     priv = obj->privateData;
@@ -6580,9 +6592,31 @@ qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
 
     return qemuDomainObjBeginJobInternal(driver, obj,
                                          QEMU_JOB_ASYNC_NESTED,
-                                         QEMU_ASYNC_JOB_NONE);
+                                         QEMU_ASYNC_JOB_NONE,
+                                         false);
 }
 
+/**
+ * qemuDomainObjBeginJobNowait:
+ *
+ * @driver: qemu driver
+ * @obj: domain object
+ * @job: qemuDomainJob to start
+ *
+ * Acquires job for a domain object which must be locked before
+ * calling. If there's already a job running it returns
+ * immediately without any error reported.
+ *
+ * Returns: see qemuDomainObjBeginJobInternal
+ */
+int
+qemuDomainObjBeginJobNowait(virQEMUDriverPtr driver,
+                            virDomainObjPtr obj,
+                            qemuDomainJob job)
+{
+    return qemuDomainObjBeginJobInternal(driver, obj, job,
+                                         QEMU_ASYNC_JOB_NONE, true);
+}
 
 /*
  * obj must be locked and have a reference before calling
index fd8d9b53053733c682b9f21c58e4a097c3746e90..9e2da0a37cdd084248199b7dcccab95f070ef47c 100644 (file)
@@ -510,6 +510,10 @@ int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
                                 virDomainObjPtr obj,
                                 qemuDomainAsyncJob asyncJob)
     ATTRIBUTE_RETURN_CHECK;
+int qemuDomainObjBeginJobNowait(virQEMUDriverPtr driver,
+                                virDomainObjPtr obj,
+                                qemuDomainJob job)
+    ATTRIBUTE_RETURN_CHECK;
 
 void qemuDomainObjEndJob(virQEMUDriverPtr driver,
                          virDomainObjPtr obj);