[libvirt] [PATCH 1/2] qemu: set jobinfo type to CANCELLED if migration is cancelled in all conditions
Wang Rui
moon.wangrui at huawei.com
Fri Nov 28 06:24:56 UTC 2014
On 2014/11/27 18:48, Martin Kletzander wrote:
> On Thu, Nov 27, 2014 at 04:26:24PM +0800, Wang Rui wrote:
>> The migration job status is traced in qemuMigrationUpdateJobStatus which is
>> called in qemuMigrationRun. But if migration is cancelled before the trace
>> such as in qemuMigrationDriveMirror, the jobinfo type won't be update to
>> CANCELLED. After this patch, we can get jobinfo type as CANCELLED if migration
>> is cancelled during the drive mirror migration.
>>
>> Signed-off-by: Wang Rui <moon.wangrui at huawei.com>
>> ---
>> src/qemu/qemu_migration.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
>> index a1b1458..c678ba7 100644
>> --- a/src/qemu/qemu_migration.c
>> +++ b/src/qemu/qemu_migration.c
>> @@ -1504,6 +1504,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>> * as this is a critical section so we are guaranteed
>> * priv->job.asyncAbort will not change */
>> qemuDomainObjExitMonitor(driver, vm);
>> + priv->job.current->type = VIR_DOMAIN_JOB_CANCELLED;
>> virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
>> qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
>> _("canceled by client"));
>> @@ -3611,6 +3612,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>> * as this is a critical section so we are guaranteed
>> * priv->job.asyncAbort will not change */
>> qemuDomainObjExitMonitor(driver, vm);
>> + priv->job.current->type = VIR_DOMAIN_JOB_CANCELLED;
>> virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
>> qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
>> _("canceled by client"));
>> --
>> 1.7.12.4
>>
>
> Can't we use qemuMigrationUpdateJobStatus() here?
>
> Martin
Hi, thanks for your reply.
I don't think we can.
I tried this way but couldn't get jobinfo type as CANCELLED if I cancelled it
during drive mirror migration. When libvirt sends qmp "migrate_cancel" to QEMU,
QEMU only sets its state if its old state is MIG_STATE_SETUP or MIG_STATE_ACTIVE.
But in drive mirror migration, QEMU's state is MIG_STATE_NONE.
static void migrate_fd_cancel(MigrationState *s)
{
...
old_state = s->state;
if (old_state != MIG_STATE_SETUP && old_state != MIG_STATE_ACTIVE) {
break;
...
}
So we haven't set QEMU's state to CANCELLED. And then if we query status in libvirt
by qemuMigrationUpdateJobStatus, QEMU won't tell us the right status.
MigrationInfo *qmp_query_migrate(Error **errp)
{
...
switch (s->state) {
case MIG_STATE_NONE:
/* no migration has happened ever */
break;
...
}
Another reason why I don't use qemuMigrationUpdateJobStatus is considering job failed in
libvirt(in my patch 2/2). If job is failed in libvirt, it's not accurate to query job
status from QEMU.
More information about the libvir-list
mailing list