Message ID | 1255037747-3340-8-git-send-email-lcapitulino@redhat.com |
---|---|
State | Under Review |
Headers | show |
Luiz Capitulino <lcapitulino@redhat.com> writes: > Return a QDict, which may contain another QDict if the migration > process is active. > > The main QDict contains the following: > > - "status": migration status > - "ram": only present if "status" is "active", it is a QDict with the > following information (in bytes): > - "transferred": amount of RAM transferred > - "remaining": amount of RAM remaining > - "total": total RAM > > IMPORTANT: as a QInt stores a int64_t integer, those RAM values > are going to stored as int64_t and not as uint64_t as they are > today. If this is a problem QInt will have to be changed. > > This commit should not change user output, the following is an > example of the returned QDict: > > { "status": "active", "ram": > { "transferred": 885030912, "remaining": 198529024, "total": 1082392576 } } [...] > diff --git a/migration.c b/migration.c > index 112a5b6..b3bf00f 100644 > --- a/migration.c > +++ b/migration.c [...] > @@ -158,29 +159,79 @@ void do_migrate_set_downtime(Monitor *mon, const QDict *qdict) [...] > +/** > + * do_info_migrate(): Show migration status > + * > + * Return a QDict. If migration is active there will be another > + * QDict with RAM information. > + * > + * The main QDict contains the following: > + * > + * - "status": migration status > + * - "ram": only present if "status" is "active", it is a QDict with the > + * following information (in bytes): > + * - "transferred": amount of RAM transferred > + * - "remaining": amount of RAM remaining > + * - "total": total RAM > + * > + * Examples: > + * > + * 1. If migration is "completed", "error" or "cancelled": > + * > + * { "status": "completed" } This suggests that a failed or cancelled migration is reported with "completed", which is wrong. Since it's just an example, you could leave out the ', "error" or "cancelled"' part. > + * > + * 2. If migration is "active": > + * > + * { "status": "active", "ram": > + * { "transferred": 123, "remaining": 123, "total": 246 } } > + */ > +void do_info_migrate(Monitor *mon, QObject **ret_data) > { > MigrationState *s = current_migration; > > if (s) { > - monitor_printf(mon, "Migration status: "); > switch (s->get_status(s)) { > case MIG_STATE_ACTIVE: > - monitor_printf(mon, "active\n"); > - monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n", ram_bytes_transferred() >> 10); > - monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n", ram_bytes_remaining() >> 10); > - monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n", ram_bytes_total() >> 10); > + *ret_data = qobject_from_fmt("{ s: s, s: { s: i, s: i, s: i } }", > + "status", "active", > + "ram", > + "transferred", ram_bytes_transferred(), > + "remaining", ram_bytes_remaining(), > + "total", ram_bytes_total()); > break; > case MIG_STATE_COMPLETED: > - monitor_printf(mon, "completed\n"); > + *ret_data = qobject_from_fmt("{ s: s }", "status", "completed"); > break; > case MIG_STATE_ERROR: > - monitor_printf(mon, "failed\n"); > + *ret_data = qobject_from_fmt("{ s: s }", "status", "failed"); > break; > case MIG_STATE_CANCELLED: > - monitor_printf(mon, "cancelled\n"); > + *ret_data = qobject_from_fmt("{ s: s }", "status", "cancelled"); > break; > } > + if (*ret_data == NULL) > + monitor_printf(mon, "Migration: could not build QObject\n"); > } > } > [...]
Luiz Capitulino wrote: > Return a QDict, which may contain another QDict if the migration > process is active. > > The main QDict contains the following: > > - "status": migration status > - "ram": only present if "status" is "active", it is a QDict with the > following information (in bytes): > - "transferred": amount of RAM transferred > - "remaining": amount of RAM remaining > - "total": total RAM > > IMPORTANT: as a QInt stores a int64_t integer, those RAM values > are going to stored as int64_t and not as uint64_t as they are > today. If this is a problem QInt will have to be changed. > > This commit should not change user output, the following is an > example of the returned QDict: > > { "status": "active", "ram": > { "transferred": 885030912, "remaining": 198529024, "total": 1082392576 } } > > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> > --- > migration.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++------- > migration.h | 3 +- > monitor.c | 3 +- > 3 files changed, 64 insertions(+), 11 deletions(-) > > diff --git a/migration.c b/migration.c > index 112a5b6..b3bf00f 100644 > --- a/migration.c > +++ b/migration.c > @@ -18,6 +18,7 @@ > #include "sysemu.h" > #include "block.h" > #include "qemu_socket.h" > +#include "qmisc.h" > > //#define DEBUG_MIGRATION > > @@ -158,29 +159,79 @@ void do_migrate_set_downtime(Monitor *mon, const QDict *qdict) > max_downtime = (uint64_t)d; > } > > -void do_info_migrate(Monitor *mon) > +void migration_user_print(Monitor *mon, const QObject *data) > +{ > + QDict *qdict; > + > + assert(qobject_type(data) == QTYPE_QDICT); > + qdict = qobject_to_qdict(data); > + > + monitor_printf(mon, "Migration status: %s\n", > + qdict_get_str(qdict, "status")); > + > + if (qdict_haskey(qdict, "ram")) { > + QDict *qdict_ram = qobject_to_qdict(qdict_get(qdict, "ram")); > + monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n", > + qdict_get_int(qdict_ram, "transferred") >> 10); > + monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n", > + qdict_get_int(qdict_ram, "remaining") >> 10); > + monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n", > + qdict_get_int(qdict_ram, "total") >> 10); > + } > +} > + > +/** > + * do_info_migrate(): Show migration status > + * > + * Return a QDict. If migration is active there will be another > + * QDict with RAM information. > + * > + * The main QDict contains the following: > + * > + * - "status": migration status > + * - "ram": only present if "status" is "active", it is a QDict with the > + * following information (in bytes): > + * - "transferred": amount of RAM transferred > + * - "remaining": amount of RAM remaining > + * - "total": total RAM > + * > + * Examples: > + * > + * 1. If migration is "completed", "error" or "cancelled": > + * > + * { "status": "completed" } > + * > + * 2. If migration is "active": > + * > + * { "status": "active", "ram": > + * { "transferred": 123, "remaining": 123, "total": 246 } } > + */ > +void do_info_migrate(Monitor *mon, QObject **ret_data) > { > MigrationState *s = current_migration; > > if (s) { > - monitor_printf(mon, "Migration status: "); > switch (s->get_status(s)) { > case MIG_STATE_ACTIVE: > - monitor_printf(mon, "active\n"); > - monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n", ram_bytes_transferred() >> 10); > - monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n", ram_bytes_remaining() >> 10); > - monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n", ram_bytes_total() >> 10); > + *ret_data = qobject_from_fmt("{ s: s, s: { s: i, s: i, s: i } }", > + "status", "active", > + "ram", > + "transferred", ram_bytes_transferred(), > + "remaining", ram_bytes_remaining(), > + "total", ram_bytes_total()); > While we're at it, let's add string parsing support. So this becomes *ret_data = qobject_from_fmt("{'status': %s, 'ram': {'transferred': %d, 'remaining': %d, 'total': %d}}", ram_bytes_transferred(), ram_bytes_remaining(), ram_bytes_total()); Regards, Anthony Liguori
diff --git a/migration.c b/migration.c index 112a5b6..b3bf00f 100644 --- a/migration.c +++ b/migration.c @@ -18,6 +18,7 @@ #include "sysemu.h" #include "block.h" #include "qemu_socket.h" +#include "qmisc.h" //#define DEBUG_MIGRATION @@ -158,29 +159,79 @@ void do_migrate_set_downtime(Monitor *mon, const QDict *qdict) max_downtime = (uint64_t)d; } -void do_info_migrate(Monitor *mon) +void migration_user_print(Monitor *mon, const QObject *data) +{ + QDict *qdict; + + assert(qobject_type(data) == QTYPE_QDICT); + qdict = qobject_to_qdict(data); + + monitor_printf(mon, "Migration status: %s\n", + qdict_get_str(qdict, "status")); + + if (qdict_haskey(qdict, "ram")) { + QDict *qdict_ram = qobject_to_qdict(qdict_get(qdict, "ram")); + monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n", + qdict_get_int(qdict_ram, "transferred") >> 10); + monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n", + qdict_get_int(qdict_ram, "remaining") >> 10); + monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n", + qdict_get_int(qdict_ram, "total") >> 10); + } +} + +/** + * do_info_migrate(): Show migration status + * + * Return a QDict. If migration is active there will be another + * QDict with RAM information. + * + * The main QDict contains the following: + * + * - "status": migration status + * - "ram": only present if "status" is "active", it is a QDict with the + * following information (in bytes): + * - "transferred": amount of RAM transferred + * - "remaining": amount of RAM remaining + * - "total": total RAM + * + * Examples: + * + * 1. If migration is "completed", "error" or "cancelled": + * + * { "status": "completed" } + * + * 2. If migration is "active": + * + * { "status": "active", "ram": + * { "transferred": 123, "remaining": 123, "total": 246 } } + */ +void do_info_migrate(Monitor *mon, QObject **ret_data) { MigrationState *s = current_migration; if (s) { - monitor_printf(mon, "Migration status: "); switch (s->get_status(s)) { case MIG_STATE_ACTIVE: - monitor_printf(mon, "active\n"); - monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n", ram_bytes_transferred() >> 10); - monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n", ram_bytes_remaining() >> 10); - monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n", ram_bytes_total() >> 10); + *ret_data = qobject_from_fmt("{ s: s, s: { s: i, s: i, s: i } }", + "status", "active", + "ram", + "transferred", ram_bytes_transferred(), + "remaining", ram_bytes_remaining(), + "total", ram_bytes_total()); break; case MIG_STATE_COMPLETED: - monitor_printf(mon, "completed\n"); + *ret_data = qobject_from_fmt("{ s: s }", "status", "completed"); break; case MIG_STATE_ERROR: - monitor_printf(mon, "failed\n"); + *ret_data = qobject_from_fmt("{ s: s }", "status", "failed"); break; case MIG_STATE_CANCELLED: - monitor_printf(mon, "cancelled\n"); + *ret_data = qobject_from_fmt("{ s: s }", "status", "cancelled"); break; } + if (*ret_data == NULL) + monitor_printf(mon, "Migration: could not build QObject\n"); } } diff --git a/migration.h b/migration.h index 2d28b8f..7666c4b 100644 --- a/migration.h +++ b/migration.h @@ -60,7 +60,8 @@ uint64_t migrate_max_downtime(void); void do_migrate_set_downtime(Monitor *mon, const QDict *qdict); -void do_info_migrate(Monitor *mon); +void migration_user_print(Monitor *mon, const QObject *data); +void do_info_migrate(Monitor *mon, QObject **ret_data); int exec_start_incoming_migration(const char *host_port); diff --git a/monitor.c b/monitor.c index a095971..7e5c07d 100644 --- a/monitor.c +++ b/monitor.c @@ -2177,7 +2177,8 @@ static const mon_cmd_t info_cmds[] = { .args_type = "", .params = "", .help = "show migration status", - .mhandler.info = do_info_migrate, + .user_print = migration_user_print, + .mhandler.info_new = do_info_migrate, }, { .name = "balloon",
Return a QDict, which may contain another QDict if the migration process is active. The main QDict contains the following: - "status": migration status - "ram": only present if "status" is "active", it is a QDict with the following information (in bytes): - "transferred": amount of RAM transferred - "remaining": amount of RAM remaining - "total": total RAM IMPORTANT: as a QInt stores a int64_t integer, those RAM values are going to stored as int64_t and not as uint64_t as they are today. If this is a problem QInt will have to be changed. This commit should not change user output, the following is an example of the returned QDict: { "status": "active", "ram": { "transferred": 885030912, "remaining": 198529024, "total": 1082392576 } } Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> --- migration.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++------- migration.h | 3 +- monitor.c | 3 +- 3 files changed, 64 insertions(+), 11 deletions(-)