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);
|
||||
}
|
||||
|
||||
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,
|
||||
const char *value)
|
||||
{
|
||||
@ -608,6 +631,62 @@ static void test_postcopy(void)
|
||||
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)
|
||||
{
|
||||
QTestState *from, *to;
|
||||
@ -698,6 +777,7 @@ int main(int argc, char **argv)
|
||||
module_call_init(MODULE_INIT_QOM);
|
||||
|
||||
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/bad_dest", test_baddest);
|
||||
qtest_add_func("/migration/precopy/unix", test_precopy_unix);
|
||||
|
Loading…
Reference in New Issue
Block a user