On 03/22/2011 07:00 AM, Jan Kiszka wrote:
We had a few migration related regressions recently. Do we have sufficient test cases in autotest for them? Also for migrating from older to the latest version?
Autotest is too late and also not nearly rigorous enough for what you're trying to catch.
Here's how I propose we tackle this. This patch adds a -dump-savevm option that takes a version. It spits out all of the fields we save for a particular version (well, not really, but it should). We also can add type information. The idea is that we'd write a simple test case (using gtester) that ran through and dumped the schema for each version. We'd store the schema's in the tree and the test can compare old schema's to the current schema to check for failure.
This was thrown together in just a few minutes. I'll try to put together something more complete later today but I wanted to share this before the call at least.
Regards, Anthony Liguori
Jan
>From 43fb56c4ee68905d886ea21dad338f3e76350ba5 Mon Sep 17 00:00:00 2001 From: Anthony Liguori <aligu...@us.ibm.com> Date: Tue, 22 Mar 2011 08:21:00 -0500 Subject: [PATCH] vl: add -dump-savevm option to display VMState schema This can be used to verify whether the savevm schema has changed for a given version of the migration protocol. Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> --- hw/hw.h | 2 ++ qemu-options.hx | 9 +++++++++ savevm.c | 22 ++++++++++++++++++++++ vl.c | 9 +++++++++ 4 files changed, 42 insertions(+), 0 deletions(-) diff --git a/hw/hw.h b/hw/hw.h index 1b09039..55816da 100644 --- a/hw/hw.h +++ b/hw/hw.h @@ -914,4 +914,6 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id, int required_for_version); void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd, void *opaque); +void vmstate_dump(FILE *f, int version); + #endif diff --git a/qemu-options.hx b/qemu-options.hx index badb730..801757b 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2349,6 +2349,15 @@ Specify a trace file to log output traces to. ETEXI #endif +DEF("dump-savevm", HAS_ARG, QEMU_OPTION_dump_savevm, + "-dump-savevm VERSION\n" + " dump the savevm schema for a given version\n", + QEMU_ARCH_ALL) +STEXI +@item -dump-savevm +@findex -dump-savevm +ETEXI + HXCOMM This is the last statement. Insert new options before this line! STEXI @end table diff --git a/savevm.c b/savevm.c index 03fce62..da1fea1 100644 --- a/savevm.c +++ b/savevm.c @@ -1436,6 +1436,28 @@ static void vmstate_save(QEMUFile *f, SaveStateEntry *se) vmstate_save_state(f,se->vmsd, se->opaque); } +void vmstate_dump(FILE *f, int version) +{ + SaveStateEntry *se; + bool first = true; + + QTAILQ_FOREACH(se, &savevm_handlers, entry) { + VMStateField *field; + if (!se->vmsd) { + continue; + } + if (first) { + first = false; + } else { + fprintf(f, "\n"); + } + fprintf(f, "%s.__version__ = %d\n", se->vmsd->name, se->version_id); + for (field = se->vmsd->fields; field->name; field++) { + fprintf(f, "%s.%s\n", se->vmsd->name, field->name); + } + } +} + #define QEMU_VM_FILE_MAGIC 0x5145564d #define QEMU_VM_FILE_VERSION_COMPAT 0x00000002 #define QEMU_VM_FILE_VERSION 0x00000003 diff --git a/vl.c b/vl.c index ac47211..361fcef 100644 --- a/vl.c +++ b/vl.c @@ -1941,6 +1941,7 @@ int main(int argc, char **argv, char **envp) int show_vnc_port = 0; int defconfig = 1; const char *trace_file = NULL; + int dump_savevm = -1; atexit(qemu_run_exit_notifiers); error_set_progname(argv[0]); @@ -2760,6 +2761,9 @@ int main(int argc, char **argv, char **envp) fclose(fp); break; } + case QEMU_OPTION_dump_savevm: + dump_savevm = atoi(optarg); + break; default: os_parse_cmd_args(popt->index, optarg); } @@ -3013,6 +3017,11 @@ int main(int argc, char **argv, char **envp) cpu_synchronize_all_post_init(); + if (dump_savevm != -1) { + vmstate_dump(stdout, dump_savevm); + exit(0); + } + /* must be after terminal init, SDL library changes signal handlers */ os_setup_signal_handling(); -- 1.7.0.4