# disk), uncomment this
#
# lock_manager = "sanlock"
+
+# Set limit of maximum APIs queued on one domain. All other APIs
+# over this threshold will fail on acquiring job lock. Specially,
+# setting to zero turns this feature off.
+# Note, that job lock is per domain.
+#
+# max_queued = 0
unsigned long long then;
bool nested = job == QEMU_JOB_ASYNC_NESTED;
+ priv->jobs_queued++;
+
if (virTimeMs(&now) < 0)
return -1;
then = now + QEMU_JOB_WAIT_TIME;
qemuDriverUnlock(driver);
retry:
+ if (driver->max_queued &&
+ priv->jobs_queued > driver->max_queued) {
+ goto error;
+ }
+
while (!nested && !qemuDomainJobAllowed(priv, job)) {
if (virCondWaitUntil(&priv->job.asyncCond, &obj->lock, then) < 0)
goto error;
if (errno == ETIMEDOUT)
qemuReportError(VIR_ERR_OPERATION_TIMEOUT,
"%s", _("cannot acquire state change lock"));
+ else if (driver->max_queued &&
+ priv->jobs_queued > driver->max_queued)
+ qemuReportError(VIR_ERR_OPERATION_FAILED,
+ "%s", _("cannot acquire state change lock "
+ "due to max_queued limit"));
else
virReportSystemError(errno,
"%s", _("cannot acquire job mutex"));
+ priv->jobs_queued--;
if (driver_locked) {
virDomainObjUnlock(obj);
qemuDriverLock(driver);
{
qemuDomainObjPrivatePtr priv = obj->privateData;
+ priv->jobs_queued--;
+
qemuDomainObjResetJob(priv);
qemuDomainObjSaveJob(driver, obj);
virCondSignal(&priv->job.cond);
{
qemuDomainObjPrivatePtr priv = obj->privateData;
+ priv->jobs_queued--;
+
qemuDomainObjResetAsyncJob(priv);
qemuDomainObjSaveJob(driver, obj);
virCondBroadcast(&priv->job.asyncCond);