"modify",
"abort",
"migration operation",
+ "modify migration safe",
"none", /* async job is never stored in job.active */
"async nested",
);
VIR_JOB_MODIFY, /* May change state */
VIR_JOB_ABORT, /* Abort current async job */
VIR_JOB_MIGRATION_OP, /* Operation influencing outgoing migration */
+ VIR_JOB_MODIFY_MIGRATION_SAFE, /* Internal only job for event handlers which
+ need to be processed even during migration.
+ The code may only change state in a way
+ that does not affect migration. */
/* The following two items must always be the last items before JOB_LAST */
VIR_JOB_ASYNC, /* Asynchronous job */
JOB_MASK(VIR_JOB_SUSPEND) |
JOB_MASK(VIR_JOB_MIGRATION_OP);
}
+ mask |= JOB_MASK(VIR_JOB_MODIFY_MIGRATION_SAFE);
if (qemuDomainObjBeginAsyncJob(driver, vm, job, op, apiFlags) < 0)
return -1;
op = VIR_DOMAIN_JOB_OPERATION_MIGRATION_OUT;
allowedJobs = VIR_JOB_DEFAULT_MASK | JOB_MASK(VIR_JOB_MIGRATION_OP);
}
+ allowedJobs |= JOB_MASK(VIR_JOB_MODIFY_MIGRATION_SAFE);
qemuDomainObjRestoreAsyncJob(vm, job->asyncJob, job->phase,
job->asyncStarted, op,
*/
break;
+ case VIR_JOB_MODIFY_MIGRATION_SAFE:
+ /* event handlers, the reconnection code already handles them as we
+ * might as well just missed the event while we were not running
+ */
+ break;
+
case VIR_JOB_MIGRATION_OP:
case VIR_JOB_ABORT:
case VIR_JOB_ASYNC: