[libvirt] [PATCH 5/5] qemu: Avoid duplicate resume events and state changes
Jiri Denemark
jdenemar at redhat.com
Fri Sep 21 13:11:02 UTC 2018
On Wed, Sep 19, 2018 at 16:04:13 -0400, John Ferlan wrote:
> > diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> > index 825a9d399b..4771f26938 100644
> > --- a/src/qemu/qemu_migration.c
> > +++ b/src/qemu/qemu_migration.c
>
> [...]
>
> >
> > @@ -5074,13 +5060,8 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
> > goto endjob;
> > }
> >
> > - if (inPostCopy) {
> > + if (inPostCopy)
> > doKill = false;
> > - event = virDomainEventLifecycleNewFromObj(vm,
> > - VIR_DOMAIN_EVENT_RESUMED,
> > - VIR_DOMAIN_EVENT_RESUMED_POSTCOPY);
> > - virObjectEventStateQueue(driver->domainEventState, event);
> > - }
> > }
> >
> > if (mig->jobInfo) {
> > @@ -5111,11 +5092,6 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
> >
> > dom = virGetDomain(dconn, vm->def->name, vm->def->uuid, vm->def->id);
> >
> > - event = virDomainEventLifecycleNewFromObj(vm,
> > - VIR_DOMAIN_EVENT_RESUMED,
> > - VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
> > - virObjectEventStateQueue(driver->domainEventState, event);
> > -
> > if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
> > virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER);
> > event = virDomainEventLifecycleNewFromObj(vm,
>
> For this path 2 events were generated if @inPostCopy == True - one right
> after the qemuProcessStartCPUs for RESUMED_POSTCOPY and then one for
> SUSPENDED_PAUSED once qemuMigrationDstWaitForCompletion occurred.
I guess you meant s/SUSPENDED_PAUSED/RESUMED_MIGRATED/. Anyway, you made
me think about this and you're right. Or docs even say that two RESUMED
events are sent during post-copy migration. RESUMED_POSTCOPY when the
domain switches from source to the destination host and RESUMED_MIGRATED
once migration is complete... v2 is in progress.
> IIUC, the changes here when @inPostCopy == true would only generate the
> POSTCOPY event, but not the MIGRATED event. Or is there something subtle
> I'm missing. Will the post copy processing generate two resume events?
> If so, we perhaps should document that. If not, then perhaps this second
> event that's being deleted needs to be moved inside that inPostCopy
> condition just above with the note that this one case is "abnormal"
Yes.
> (or you could just do the *StartCPUs again with the RESUMED_MIGRATED
> and close your eyes ;-)).
This wouldn't work, the RESUME handler ignores the event if the domain
is not paused.
> Curious, for the future, would it be useful to change the FakeReboot
> path to generate a different detail reason? It's hard to distinguish
> between someone using virsh resume (or recovery from Save, Dump,
> Snapshot failure) from that fake reboot path - at least from just the
> event. I guess it seems VIR_DOMAIN_EVENT_RESUMED_UNPAUSED is just too
> generic since it's more than just a "normal resume due to admin
> unpause", but that I would think would be extra given the "scope" of
> this particular problem.
Yeah, a new resume reason would be nice in this case, but I don't think
it's a big issue. The guest-agent driven reboot is much better and
hopefully used more often than fake reboot.
> Second curiosity... would it be useful/easy to generate an event on the
> failure scenario for StartCPUs? Knowing from whence we were called, we
> should be able to generate a suspended event rather than having the
> callers decide.
Not really, if StartCPUs fails the vCPUs just remain paused as if
nothing happened. That is, there's no state change to signal using an
event. And I think "cont" can't really fail anyway. Normally it would
just succeed and another STOP event would be sent right away in case the
reason for pausing the CPUs (such as I/O error) is still valid.
Jirka
More information about the libvir-list
mailing list