mirror of https://github.com/xemu-project/xemu.git
tests: add postcopy recovery test
Test the postcopy recovery procedure by emulating a network failure using migrate-pause command. Tested-by: Balamuruhan S <bala24@linux.vnet.ibm.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20180710091902.28780-10-peterx@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
2f6d313836
commit
d5f496407d
|
@ -352,6 +352,29 @@ static void migrate_set_parameter(QTestState *who, const char *parameter,
|
||||||
migrate_check_parameter(who, parameter, value);
|
migrate_check_parameter(who, parameter, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void migrate_pause(QTestState *who)
|
||||||
|
{
|
||||||
|
QDict *rsp;
|
||||||
|
|
||||||
|
rsp = wait_command(who, "{ 'execute': 'migrate-pause' }");
|
||||||
|
g_assert(qdict_haskey(rsp, "return"));
|
||||||
|
qobject_unref(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void migrate_recover(QTestState *who, const char *uri)
|
||||||
|
{
|
||||||
|
QDict *rsp;
|
||||||
|
gchar *cmd = g_strdup_printf(
|
||||||
|
"{ 'execute': 'migrate-recover', "
|
||||||
|
" 'id': 'recover-cmd', "
|
||||||
|
" 'arguments': { 'uri': '%s' } }", uri);
|
||||||
|
|
||||||
|
rsp = wait_command(who, cmd);
|
||||||
|
g_assert(qdict_haskey(rsp, "return"));
|
||||||
|
g_free(cmd);
|
||||||
|
qobject_unref(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
static void migrate_set_capability(QTestState *who, const char *capability,
|
static void migrate_set_capability(QTestState *who, const char *capability,
|
||||||
const char *value)
|
const char *value)
|
||||||
{
|
{
|
||||||
|
@ -608,6 +631,62 @@ static void test_postcopy(void)
|
||||||
migrate_postcopy_complete(from, to);
|
migrate_postcopy_complete(from, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_postcopy_recovery(void)
|
||||||
|
{
|
||||||
|
QTestState *from, *to;
|
||||||
|
char *uri;
|
||||||
|
|
||||||
|
if (migrate_postcopy_prepare(&from, &to)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Turn postcopy speed down, 4K/s is slow enough on any machines */
|
||||||
|
migrate_set_parameter(from, "max-postcopy-bandwidth", "4096");
|
||||||
|
|
||||||
|
/* Now we start the postcopy */
|
||||||
|
migrate_postcopy_start(from, to);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait until postcopy is really started; we can only run the
|
||||||
|
* migrate-pause command during a postcopy
|
||||||
|
*/
|
||||||
|
wait_for_migration_status(from, "postcopy-active");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Manually stop the postcopy migration. This emulates a network
|
||||||
|
* failure with the migration socket
|
||||||
|
*/
|
||||||
|
migrate_pause(from);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for destination side to reach postcopy-paused state. The
|
||||||
|
* migrate-recover command can only succeed if destination machine
|
||||||
|
* is in the paused state
|
||||||
|
*/
|
||||||
|
wait_for_migration_status(to, "postcopy-paused");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a new socket to emulate a new channel that is different
|
||||||
|
* from the broken migration channel; tell the destination to
|
||||||
|
* listen to the new port
|
||||||
|
*/
|
||||||
|
uri = g_strdup_printf("unix:%s/migsocket-recover", tmpfs);
|
||||||
|
migrate_recover(to, uri);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to rebuild the migration channel using the resume flag and
|
||||||
|
* the newly created channel
|
||||||
|
*/
|
||||||
|
wait_for_migration_status(from, "postcopy-paused");
|
||||||
|
migrate(from, uri, ", 'resume': true");
|
||||||
|
g_free(uri);
|
||||||
|
|
||||||
|
/* Restore the postcopy bandwidth to unlimited */
|
||||||
|
migrate_set_parameter(from, "max-postcopy-bandwidth", "0");
|
||||||
|
|
||||||
|
migrate_postcopy_complete(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_baddest(void)
|
static void test_baddest(void)
|
||||||
{
|
{
|
||||||
QTestState *from, *to;
|
QTestState *from, *to;
|
||||||
|
@ -698,6 +777,7 @@ int main(int argc, char **argv)
|
||||||
module_call_init(MODULE_INIT_QOM);
|
module_call_init(MODULE_INIT_QOM);
|
||||||
|
|
||||||
qtest_add_func("/migration/postcopy/unix", test_postcopy);
|
qtest_add_func("/migration/postcopy/unix", test_postcopy);
|
||||||
|
qtest_add_func("/migration/postcopy/recovery", test_postcopy_recovery);
|
||||||
qtest_add_func("/migration/deprecated", test_deprecated);
|
qtest_add_func("/migration/deprecated", test_deprecated);
|
||||||
qtest_add_func("/migration/bad_dest", test_baddest);
|
qtest_add_func("/migration/bad_dest", test_baddest);
|
||||||
qtest_add_func("/migration/precopy/unix", test_precopy_unix);
|
qtest_add_func("/migration/precopy/unix", test_precopy_unix);
|
||||||
|
|
Loading…
Reference in New Issue