[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/5] Revert "migration: move only_migratable
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH v2 2/5] Revert "migration: move only_migratable to MigrationState" |
Date: |
Mon, 1 Apr 2019 14:35:26 +0100 |
User-agent: |
Mutt/1.11.3 (2019-02-01) |
* Daniel P. Berrangé (address@hidden) wrote:
> On Mon, Apr 01, 2019 at 01:31:47PM +0200, Markus Armbruster wrote:
> > Daniel P. Berrangé <address@hidden> writes:
> >
> > > On Mon, Apr 01, 2019 at 10:27:49AM +0100, Dr. David Alan Gilbert wrote:
> > >> * Markus Armbruster (address@hidden) wrote:
> > >> > This reverts commit 3df663e575f1876d7f3bc684f80e72fca0703d39.
> > >> > This reverts commit b605c47b57b58e61a901a50a0762dccf43d94783.
> > >> >
> > >> > Command line option --only-migratable is for disallowing any
> > >> > configuration that can block migration.
> > >> >
> > >> > Initially, --only-migratable set global variable @only_migratable.
> > >> >
> > >> > Commit 3df663e575 "migration: move only_migratable to MigrationState"
> > >> > replaced it by MigrationState member @only_migratable. That was a
> > >> > mistake.
> > >> >
> > >> > First, it doesn't make sense on the design level. MigrationState
> > >> > captures the state of an individual migration, but --only-migratable
> > >> > isn't a property of an individual migration, it's a restriction on
> > >> > QEMU configuration. With fault tolerance, we could have several
> > >> > migrations at once. --only-migratable would certainly protect all of
> > >> > them. Storing it in MigrationState feels inappropriate.
> > >> >
> > >> > Second, it contributes to a dependency cycle that manifests itself as
> > >> > a bug now.
> > >> >
> > >> > Putting @only_migratable into MigrationState means its available only
> > >> > after migration_object_init().
> > >> >
> > >> > We can't set it before migration_object_init(), so we delay setting it
> > >> > with a global property (this is fixup commit b605c47b57 "migration:
> > >> > fix handling for --only-migratable").
> > >> >
> > >> > We can't get it before migration_object_init(), so anything that uses
> > >> > it can only run afterwards.
> > >> >
> > >> > Since migrate_add_blocker() needs to obey --only-migratable, any code
> > >> > adding migration blockers can run only afterwards. This contributes
> > >> > to the following dependency cycle:
> > >> >
> > >> > * configure_blockdev() must run before machine_set_property()
> > >> > so machine properties can refer to block backends
> > >> >
> > >> > * machine_set_property() before configure_accelerator()
> > >> > so machine properties like kvm-irqchip get applied
> > >> >
> > >> > * configure_accelerator() before migration_object_init()
> > >> > so that Xen's accelerator compat properties get applied.
> > >> >
> > >> > * migration_object_init() before configure_blockdev()
> > >> > so configure_blockdev() can add migration blockers
> > >> >
> > >> > The cycle was closed when recent commit cda4aa9a5a0 "Create block
> > >> > backends before setting machine properties" added the first
> > >> > dependency, and satisfied it by violating the last one. Broke block
> > >> > backends that add migration blockers.
> > >> >
> > >> > Moving @only_migratable into MigrationState was a mistake. Revert it.
> > >> >
> > >> > This doesn't quite break the "migration_object_init() before
> > >> > configure_blockdev() dependency, since migrate_add_blocker() still has
> > >> > another dependency on migration_object_init(). To be addressed the
> > >> > next commit
> > >> >
> > >> > Conflicts:
> > >> > include/migration/misc.h
> > >> > migration/migration.c
> > >> > migration/migration.h
> > >> > vl.c
> > >> >
> > >> > Signed-off-by: Markus Armbruster <address@hidden>
> > >> > ---
> > >> > include/sysemu/sysemu.h | 1 +
> > >> > migration/migration.c | 5 ++---
> > >> > migration/migration.h | 3 ---
> > >> > migration/savevm.c | 2 +-
> > >> > vl.c | 9 ++-------
> > >> > 5 files changed, 6 insertions(+), 14 deletions(-)
> > >> >
> > >> > diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> > >> > index 6065d9e420..5f133cae83 100644
> > >> > --- a/include/sysemu/sysemu.h
> > >> > +++ b/include/sysemu/sysemu.h
> > >> > @@ -14,6 +14,7 @@
> > >> > /* vl.c */
> > >> >
> > >> > extern const char *bios_name;
> > >> > +extern int only_migratable;
> > >> > extern const char *qemu_name;
> > >> > extern QemuUUID qemu_uuid;
> > >> > extern bool qemu_uuid_set;
> > >> > diff --git a/migration/migration.c b/migration/migration.c
> > >> > index 69f75124c9..f6076e5295 100644
> > >> > --- a/migration/migration.c
> > >> > +++ b/migration/migration.c
> > >> > @@ -1707,7 +1707,7 @@ static GSList *migration_blockers;
> > >> >
> > >> > int migrate_add_blocker(Error *reason, Error **errp)
> > >> > {
> > >> > - if (migrate_get_current()->only_migratable) {
> > >> > + if (only_migratable) {
> > >> > error_propagate_prepend(errp, error_copy(reason),
> > >> > "disallowing migration blocker "
> > >> > "(--only_migratable) for: ");
> > >> > @@ -3337,7 +3337,7 @@ void migration_global_dump(Monitor *mon)
> > >> > monitor_printf(mon, "store-global-state: %s\n",
> > >> > ms->store_global_state ? "on" : "off");
> > >> > monitor_printf(mon, "only-migratable: %s\n",
> > >> > - ms->only_migratable ? "on" : "off");
> > >> > + only_migratable ? "on" : "off");
> > >> > monitor_printf(mon, "send-configuration: %s\n",
> > >> > ms->send_configuration ? "on" : "off");
> > >> > monitor_printf(mon, "send-section-footer: %s\n",
> > >> > @@ -3352,7 +3352,6 @@ void migration_global_dump(Monitor *mon)
> > >> > static Property migration_properties[] = {
> > >> > DEFINE_PROP_BOOL("store-global-state", MigrationState,
> > >> > store_global_state, true),
> > >> > - DEFINE_PROP_BOOL("only-migratable", MigrationState,
> > >> > only_migratable, false),
> > >>
> > >> So I'm generally OK at this patch, but I'm worried whether this
> > >> is API?
> >
> > Uh, forgot to discuss this in my commit message, sorry!
> >
> > > IIUC, old code can use either
> > >
> > > -global migration.only-migratable=true
> > > -only-migratable
> > >
> > > After this patch only
> > >
> > > -only-migratable
> > >
> > > is valid. So from that POV it is an API break.
> > >
> > > From libvirt's POV this is a non-issue as we never use either of these
> > > options.
> > > We did have a BZ filed to support it, but never did.
> > >
> > > To avoid the API break I guess there would been to be a special case early
> > > loop iterating over argv[] looking for '-global
> > > migration.only-migratable=true',
> > > making that set the static 'bool only_migratable', instead of letting it
> > > get
> > > handled by the object infra.
> >
> > Is this is worth the trouble?
>
> Probably not.
>
> > -global migration.only-migratable=on is entirely undocumented. The
> > property appears in -device migration,help and device-list-properties,
> > but that's all.
> >
> > Why would any sane person risk using arcane & undocumented -global
> > migration.only-migratable=on instead of the obvious & documented
> > -only-migratable?
>
> Given the combination of no known users, current broken impl, and its
> existance not documented, I think there's a reasonable case for just
> removing it.
Yes, agreed - it should be noted though.
Dave
> Regards,
> Daniel
> --
> |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org -o- https://fstop138.berrange.com :|
> |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK
- Re: [Qemu-devel] [PATCH v2 1/5] Revert "vl: Fix to create migration object before block backends again", (continued)
Re: [Qemu-devel] [PATCH v2 2/5] Revert "migration: move only_migratable to MigrationState", Igor Mammedov, 2019/04/02
[Qemu-devel] [PATCH v2 5/5] accel: Unbreak accelerator fallback, Markus Armbruster, 2019/04/01