* [Qemu-devel] [PATCH RFC] migration: Convert 'status' of MigrationInfo to use an enum type
@ 2015-02-26 7:58 zhanghailiang
2015-02-26 15:24 ` Eric Blake
0 siblings, 1 reply; 3+ messages in thread
From: zhanghailiang @ 2015-02-26 7:58 UTC (permalink / raw)
To: qemu-devel
Cc: zhanghailiang, quintela, armbru, lcapitulino, amit.shah,
peter.huangpeng, dgilbert
The original 'status' is an open-coded 'str' type, convert it to use an
enum type.
This conversion is backwards compatible, better documented and
more convenient for future extensibility.
In addition, Fix a typo for qapi-schema.json: comppleted -> completed
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
---
Hi,
This conversion from open-coded 'str' type to enum type for 'status'
is suggested by Eric, thanks for his comment.
Actually, I will add a MIG_STATE_COLO state for COLO, and i also
saw David added MIG_STATE_POSTCOPY_ACTIVE for postcopy, after
this conversion, it will be more convenient for us to add a new state.
One more thing, i have to replace MIG_STATE_ERROR with MIG_STATE_FAILED,
and it begin from 0, not its original -1. I think it has no side effect.
Please review.
Thanks
---
hmp.c | 7 ++++---
migration/migration.c | 37 +++++++++++++++----------------------
qapi-schema.json | 34 +++++++++++++++++++++++++++++-----
3 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/hmp.c b/hmp.c
index 3825b29..8cbd135 100644
--- a/hmp.c
+++ b/hmp.c
@@ -158,7 +158,8 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
}
if (info->has_status) {
- monitor_printf(mon, "Migration status: %s\n", info->status);
+ monitor_printf(mon, "Migration status: %s\n",
+ MigState_lookup[info->status]);
monitor_printf(mon, "total time: %" PRIu64 " milliseconds\n",
info->total_time);
if (info->has_expected_downtime) {
@@ -1312,8 +1313,8 @@ static void hmp_migrate_status_cb(void *opaque)
MigrationInfo *info;
info = qmp_query_migrate(NULL);
- if (!info->has_status || strcmp(info->status, "active") == 0 ||
- strcmp(info->status, "setup") == 0) {
+ if (!info->has_status || info->status == MIG_STATE_ACTIVE ||
+ info->status == MIG_STATE_SETUP) {
if (info->has_disk) {
int progress;
diff --git a/migration/migration.c b/migration/migration.c
index b3adbc6..8b8fbbf 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -26,16 +26,6 @@
#include "qmp-commands.h"
#include "trace.h"
-enum {
- MIG_STATE_ERROR = -1,
- MIG_STATE_NONE,
- MIG_STATE_SETUP,
- MIG_STATE_CANCELLING,
- MIG_STATE_CANCELLED,
- MIG_STATE_ACTIVE,
- MIG_STATE_COMPLETED,
-};
-
#define MAX_THROTTLE (32 << 20) /* Migration speed throttling */
/* Amount of time to allocate to each "chunk" of bandwidth-throttled
@@ -189,13 +179,16 @@ MigrationInfo *qmp_query_migrate(Error **errp)
break;
case MIG_STATE_SETUP:
info->has_status = true;
- info->status = g_strdup("setup");
+ info->status = MIG_STATE_SETUP;
info->has_total_time = false;
break;
case MIG_STATE_ACTIVE:
case MIG_STATE_CANCELLING:
info->has_status = true;
- info->status = g_strdup("active");
+ /* Note: when the real state of migration is 'cancelling',
+ we still return 'active' status to user, it makes no difference
+ for user. */
+ info->status = MIG_STATE_ACTIVE;
info->has_total_time = true;
info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME)
- s->total_time;
@@ -231,7 +224,7 @@ MigrationInfo *qmp_query_migrate(Error **errp)
get_xbzrle_cache_stats(info);
info->has_status = true;
- info->status = g_strdup("completed");
+ info->status = MIG_STATE_COMPLETED;
info->has_total_time = true;
info->total_time = s->total_time;
info->has_downtime = true;
@@ -251,13 +244,13 @@ MigrationInfo *qmp_query_migrate(Error **errp)
info->ram->mbps = s->mbps;
info->ram->dirty_sync_count = s->dirty_sync_count;
break;
- case MIG_STATE_ERROR:
+ case MIG_STATE_FAILED:
info->has_status = true;
- info->status = g_strdup("failed");
+ info->status = MIG_STATE_FAILED;
break;
case MIG_STATE_CANCELLED:
info->has_status = true;
- info->status = g_strdup("cancelled");
+ info->status = MIG_STATE_CANCELLED;
break;
}
@@ -322,8 +315,8 @@ void migrate_fd_error(MigrationState *s)
{
trace_migrate_fd_error();
assert(s->file == NULL);
- s->state = MIG_STATE_ERROR;
- trace_migrate_set_state(MIG_STATE_ERROR);
+ s->state = MIG_STATE_FAILED;
+ trace_migrate_set_state(MIG_STATE_FAILED);
notifier_list_notify(&migration_state_notifiers, s);
}
@@ -376,7 +369,7 @@ bool migration_has_finished(MigrationState *s)
bool migration_has_failed(MigrationState *s)
{
return (s->state == MIG_STATE_CANCELLED ||
- s->state == MIG_STATE_ERROR);
+ s->state == MIG_STATE_FAILED);
}
static MigrationState *migrate_init(const MigrationParams *params)
@@ -465,7 +458,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
#endif
} else {
error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol");
- s->state = MIG_STATE_ERROR;
+ s->state = MIG_STATE_FAILED;
return;
}
@@ -627,7 +620,7 @@ static void *migration_thread(void *opaque)
qemu_mutex_unlock_iothread();
if (ret < 0) {
- migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_ERROR);
+ migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_FAILED);
break;
}
@@ -639,7 +632,7 @@ static void *migration_thread(void *opaque)
}
if (qemu_file_get_error(s->file)) {
- migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_ERROR);
+ migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_FAILED);
break;
}
current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
diff --git a/qapi-schema.json b/qapi-schema.json
index e16f8eb..89b14a9 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -411,18 +411,42 @@
'overflow': 'int' } }
##
+# @MigState:
+#
+# An enumeration of migration status.
+#
+# @failed: some error occurred during migration process. (since 0.14.0)
+#
+# @none: no migration has happened ever.
+#
+# @setup: migration process has been initiated. (since 0.14.0)
+#
+# @cancelling: in the process of cancelling migration. (since 2.0)
+#
+# @cancelled: cancelling migration is finished. (since 0.14.0)
+#
+# @active: in the process of doing migration. (since 0.14.0)
+#
+# @completed: migration is finished. (since 0.14.0)
+#
+# Since: 2.3
+##
+{ 'enum': 'MigState',
+ 'data': [ 'failed', 'none', 'setup', 'cancelling', 'cancelled',
+ 'active', 'completed' ] }
+
+##
# @MigrationInfo
#
# Information about current migration process.
#
-# @status: #optional string describing the current migration status.
-# As of 0.14.0 this can be 'setup', 'active', 'completed', 'failed' or
-# 'cancelled'. If this field is not returned, no migration process
+# @status: #optional @MigState describing the current migration status.
+# If this field is not returned, no migration process
# has been initiated
#
# @ram: #optional @MigrationStats containing detailed migration
# status, only returned if status is 'active' or
-# 'completed'. 'comppleted' (since 1.2)
+# 'completed'. 'completed' (since 1.2)
#
# @disk: #optional @MigrationStats containing detailed disk migration
# status, only returned if status is 'active' and it is a block
@@ -453,7 +477,7 @@
# Since: 0.14.0
##
{ 'type': 'MigrationInfo',
- 'data': {'*status': 'str', '*ram': 'MigrationStats',
+ 'data': {'*status': 'MigState', '*ram': 'MigrationStats',
'*disk': 'MigrationStats',
'*xbzrle-cache': 'XBZRLECacheStats',
'*total-time': 'int',
--
1.7.12.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH RFC] migration: Convert 'status' of MigrationInfo to use an enum type
2015-02-26 7:58 [Qemu-devel] [PATCH RFC] migration: Convert 'status' of MigrationInfo to use an enum type zhanghailiang
@ 2015-02-26 15:24 ` Eric Blake
2015-02-27 1:23 ` zhanghailiang
0 siblings, 1 reply; 3+ messages in thread
From: Eric Blake @ 2015-02-26 15:24 UTC (permalink / raw)
To: zhanghailiang, qemu-devel
Cc: quintela, armbru, peter.huangpeng, lcapitulino, amit.shah,
dgilbert
[-- Attachment #1: Type: text/plain, Size: 1637 bytes --]
On 02/26/2015 12:58 AM, zhanghailiang wrote:
> The original 'status' is an open-coded 'str' type, convert it to use an
> enum type.
> This conversion is backwards compatible, better documented and
> more convenient for future extensibility.
>
> In addition, Fix a typo for qapi-schema.json: comppleted -> completed
>
> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
> ---
> +++ b/qapi-schema.json
> @@ -411,18 +411,42 @@
> 'overflow': 'int' } }
>
> ##
> +# @MigState:
> +#
> +# An enumeration of migration status.
> +#
> +# @failed: some error occurred during migration process. (since 0.14.0)
> +#
> +# @none: no migration has happened ever.
s/happened ever/ever happened/
> +#
> +# @setup: migration process has been initiated. (since 0.14.0)
> +#
> +# @cancelling: in the process of cancelling migration. (since 2.0)
It's weird to advertise this enum value when the code goes to lengths to
hide it behind 'active', but I guess it's okay.
> +#
> +# @cancelled: cancelling migration is finished. (since 0.14.0)
> +#
> +# @active: in the process of doing migration. (since 0.14.0)
> +#
> +# @completed: migration is finished. (since 0.14.0)
> +#
> +# Since: 2.3
It's weird to see various enum values stating (since xyz) that is older
than 2.3. Generally, we only use that for an enum value that is newer
than the enumeration. I'd be just fine if you got rid of all of the
per-value '(since xyz)' strings.
Otherwise, looks good to me.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH RFC] migration: Convert 'status' of MigrationInfo to use an enum type
2015-02-26 15:24 ` Eric Blake
@ 2015-02-27 1:23 ` zhanghailiang
0 siblings, 0 replies; 3+ messages in thread
From: zhanghailiang @ 2015-02-27 1:23 UTC (permalink / raw)
To: Eric Blake, qemu-devel
Cc: hangaohuai, quintela, armbru, lcapitulino, amit.shah,
peter.huangpeng, dgilbert
On 2015/2/26 23:24, Eric Blake wrote:
> On 02/26/2015 12:58 AM, zhanghailiang wrote:
>> The original 'status' is an open-coded 'str' type, convert it to use an
>> enum type.
>> This conversion is backwards compatible, better documented and
>> more convenient for future extensibility.
>>
>> In addition, Fix a typo for qapi-schema.json: comppleted -> completed
>>
>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>> ---
>
>
>> +++ b/qapi-schema.json
>> @@ -411,18 +411,42 @@
>> 'overflow': 'int' } }
>>
>> ##
>> +# @MigState:
>> +#
>> +# An enumeration of migration status.
>> +#
>> +# @failed: some error occurred during migration process. (since 0.14.0)
>> +#
>> +# @none: no migration has happened ever.
>
> s/happened ever/ever happened/
>
>> +#
>> +# @setup: migration process has been initiated. (since 0.14.0)
>> +#
>> +# @cancelling: in the process of cancelling migration. (since 2.0)
>
> It's weird to advertise this enum value when the code goes to lengths to
> hide it behind 'active', but I guess it's okay.
>
Hmm, yes, this state is only used internally, and will return 'active' to user
instead, it is a problem left over by history, which introduced by 51cf4c1a commit.
It is no side effect, maybe a NOTE should be added.
>> +#
>> +# @cancelled: cancelling migration is finished. (since 0.14.0)
>> +#
>> +# @active: in the process of doing migration. (since 0.14.0)
>> +#
>> +# @completed: migration is finished. (since 0.14.0)
>> +#
>> +# Since: 2.3
>
> It's weird to see various enum values stating (since xyz) that is older
> than 2.3. Generally, we only use that for an enum value that is newer
> than the enumeration. I'd be just fine if you got rid of all of the
> per-value '(since xyz)' strings.
>
OK, will fix in v2.
> Otherwise, looks good to me.
>
Thanks.
zhanghailiang
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-02-27 1:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-26 7:58 [Qemu-devel] [PATCH RFC] migration: Convert 'status' of MigrationInfo to use an enum type zhanghailiang
2015-02-26 15:24 ` Eric Blake
2015-02-27 1:23 ` zhanghailiang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).