Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/807521/?format=api
{ "id": 807521, "url": "http://patchwork.ozlabs.org/api/patches/807521/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1504081950-2528-18-git-send-email-peterx@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1504081950-2528-18-git-send-email-peterx@redhat.com>", "list_archive_url": null, "date": "2017-08-30T08:32:14", "name": "[RFC,v2,17/33] migration: new state \"postcopy-recover\"", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "6f7fba8b7b0b2e877c89f4653e387a2880a51aa2", "submitter": { "id": 67717, "url": "http://patchwork.ozlabs.org/api/people/67717/?format=api", "name": "Peter Xu", "email": "peterx@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1504081950-2528-18-git-send-email-peterx@redhat.com/mbox/", "series": [ { "id": 552, "url": "http://patchwork.ozlabs.org/api/series/552/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=552", "date": "2017-08-30T08:31:59", "name": "Migration: postcopy failure recovery", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/552/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/807521/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/807521/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "ext-mx01.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx01.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=peterx@redhat.com" ], "Received": [ "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xhztH0tbgz9t2Q\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 30 Aug 2017 18:57:59 +1000 (AEST)", "from localhost ([::1]:49129 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dmyou-0003mJ-RX\n\tfor incoming@patchwork.ozlabs.org; Wed, 30 Aug 2017 04:57:56 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:34475)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <peterx@redhat.com>) id 1dmyRp-0007o4-CO\n\tfor qemu-devel@nongnu.org; Wed, 30 Aug 2017 04:34:06 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <peterx@redhat.com>) id 1dmyRo-0003bU-9Y\n\tfor qemu-devel@nongnu.org; Wed, 30 Aug 2017 04:34:05 -0400", "from mx1.redhat.com ([209.132.183.28]:44312)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <peterx@redhat.com>) id 1dmyRo-0003ax-0r\n\tfor qemu-devel@nongnu.org; Wed, 30 Aug 2017 04:34:04 -0400", "from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 0660E81DEF;\n\tWed, 30 Aug 2017 08:34:03 +0000 (UTC)", "from pxdev.xzpeter.org.com (dhcp-14-103.nay.redhat.com\n\t[10.66.14.103])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 8889184792;\n\tWed, 30 Aug 2017 08:33:56 +0000 (UTC)" ], "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 0660E81DEF", "From": "Peter Xu <peterx@redhat.com>", "To": "qemu-devel@nongnu.org", "Date": "Wed, 30 Aug 2017 16:32:14 +0800", "Message-Id": "<1504081950-2528-18-git-send-email-peterx@redhat.com>", "In-Reply-To": "<1504081950-2528-1-git-send-email-peterx@redhat.com>", "References": "<1504081950-2528-1-git-send-email-peterx@redhat.com>", "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.15", "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.25]);\n\tWed, 30 Aug 2017 08:34:03 +0000 (UTC)", "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]", "X-Received-From": "209.132.183.28", "Subject": "[Qemu-devel] [RFC v2 17/33] migration: new state \"postcopy-recover\"", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Id": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Cc": "Laurent Vivier <lvivier@redhat.com>,\n\tAndrea Arcangeli <aarcange@redhat.com>, \n\tJuan Quintela <quintela@redhat.com>,\n\tAlexey Perevalov <a.perevalov@samsung.com>, peterx@redhat.com,\n\t\"Dr . David Alan Gilbert\" <dgilbert@redhat.com>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>" }, "content": "Introducing new migration state \"postcopy-recover\". If a migration\nprocedure is paused and the connection is rebuilt afterward\nsuccessfully, we'll switch the source VM state from \"postcopy-paused\" to\nthe new state \"postcopy-recover\", then we'll do the resume logic in the\nmigration thread (along with the return path thread).\n\nThis patch only do the state switch on source side. Another following up\npatch will handle the state switching on destination side using the same\nstatus bit.\n\nSigned-off-by: Peter Xu <peterx@redhat.com>\n---\n migration/migration.c | 76 ++++++++++++++++++++++++++++++++++++++-------------\n qapi-schema.json | 4 ++-\n 2 files changed, 60 insertions(+), 20 deletions(-)", "diff": "diff --git a/migration/migration.c b/migration/migration.c\nindex deb947b..30dd566 100644\n--- a/migration/migration.c\n+++ b/migration/migration.c\n@@ -495,6 +495,7 @@ static bool migration_is_setup_or_active(int state)\n case MIGRATION_STATUS_ACTIVE:\n case MIGRATION_STATUS_POSTCOPY_ACTIVE:\n case MIGRATION_STATUS_POSTCOPY_PAUSED:\n+ case MIGRATION_STATUS_POSTCOPY_RECOVER:\n case MIGRATION_STATUS_SETUP:\n return true;\n \n@@ -571,6 +572,7 @@ MigrationInfo *qmp_query_migrate(Error **errp)\n case MIGRATION_STATUS_CANCELLING:\n case MIGRATION_STATUS_POSTCOPY_ACTIVE:\n case MIGRATION_STATUS_POSTCOPY_PAUSED:\n+ case MIGRATION_STATUS_POSTCOPY_RECOVER:\n /* TODO add some postcopy stats */\n info->has_status = true;\n info->has_total_time = true;\n@@ -2035,6 +2037,13 @@ typedef enum MigThrError {\n MIG_THR_ERR_FATAL = 2,\n } MigThrError;\n \n+/* Return zero if success, or <0 for error */\n+static int postcopy_do_resume(MigrationState *s)\n+{\n+ /* TODO: do the resume logic */\n+ return 0;\n+}\n+\n /*\n * We don't return until we are in a safe state to continue current\n * postcopy migration. Returns MIG_THR_ERR_RECOVERED if recovered, or\n@@ -2043,29 +2052,55 @@ typedef enum MigThrError {\n static MigThrError postcopy_pause(MigrationState *s)\n {\n assert(s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE);\n- migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_ACTIVE,\n- MIGRATION_STATUS_POSTCOPY_PAUSED);\n \n- /* Current channel is possibly broken. Release it. */\n- assert(s->to_dst_file);\n- qemu_file_shutdown(s->to_dst_file);\n- qemu_fclose(s->to_dst_file);\n- s->to_dst_file = NULL;\n+ while (true) {\n+ migrate_set_state(&s->state, s->state,\n+ MIGRATION_STATUS_POSTCOPY_PAUSED);\n \n- error_report(\"Detected IO failure for postcopy. \"\n- \"Migration paused.\");\n+ /* Current channel is possibly broken. Release it. */\n+ assert(s->to_dst_file);\n+ qemu_file_shutdown(s->to_dst_file);\n+ qemu_fclose(s->to_dst_file);\n+ s->to_dst_file = NULL;\n \n- /*\n- * We wait until things fixed up. Then someone will setup the\n- * status back for us.\n- */\n- while (s->state == MIGRATION_STATUS_POSTCOPY_PAUSED) {\n- qemu_sem_wait(&s->postcopy_pause_sem);\n- }\n+ error_report(\"Detected IO failure for postcopy. \"\n+ \"Migration paused.\");\n+\n+ /*\n+ * We wait until things fixed up. Then someone will setup the\n+ * status back for us.\n+ */\n+ while (s->state == MIGRATION_STATUS_POSTCOPY_PAUSED) {\n+ qemu_sem_wait(&s->postcopy_pause_sem);\n+ }\n \n- trace_postcopy_pause_continued();\n+ if (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) {\n+ /* Woken up by a recover procedure. Give it a shot */\n+\n+ /*\n+ * Firstly, let's wake up the return path now, with a new\n+ * return path channel.\n+ */\n+ qemu_sem_post(&s->postcopy_pause_rp_sem);\n \n- return MIG_THR_ERR_RECOVERED;\n+ /* Do the resume logic */\n+ if (postcopy_do_resume(s) == 0) {\n+ /* Let's continue! */\n+ trace_postcopy_pause_continued();\n+ return MIG_THR_ERR_RECOVERED;\n+ } else {\n+ /*\n+ * Something wrong happened during the recovery, let's\n+ * pause again. Pause is always better than throwing\n+ * data away.\n+ */\n+ continue;\n+ }\n+ } else {\n+ /* This is not right... Time to quit. */\n+ return MIG_THR_ERR_FATAL;\n+ }\n+ }\n }\n \n static MigThrError migration_detect_error(MigrationState *s)\n@@ -2330,7 +2365,10 @@ void migrate_fd_connect(MigrationState *s)\n }\n \n if (resume) {\n- /* TODO: do the resume logic */\n+ /* Wakeup the main migration thread to do the recovery */\n+ migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED,\n+ MIGRATION_STATUS_POSTCOPY_RECOVER);\n+ qemu_sem_post(&s->postcopy_pause_sem);\n return;\n }\n \ndiff --git a/qapi-schema.json b/qapi-schema.json\nindex ba41f2c..989f95a 100644\n--- a/qapi-schema.json\n+++ b/qapi-schema.json\n@@ -669,6 +669,8 @@\n #\n # @postcopy-paused: during postcopy but paused. (since 2.11)\n #\n+# @postcopy-recover: trying to recover from a paused postcopy. (since 2.11)\n+#\n # @completed: migration is finished.\n #\n # @failed: some error occurred during migration process.\n@@ -682,7 +684,7 @@\n { 'enum': 'MigrationStatus',\n 'data': [ 'none', 'setup', 'cancelling', 'cancelled',\n 'active', 'postcopy-active', 'postcopy-paused',\n- 'completed', 'failed', 'colo' ] }\n+ 'postcopy-recover', 'completed', 'failed', 'colo' ] }\n \n ##\n # @MigrationInfo:\n", "prefixes": [ "RFC", "v2", "17/33" ] }