From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58942) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtaGa-0006iN-AA for qemu-devel@nongnu.org; Tue, 03 Nov 2015 07:00:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZtaGX-0002c8-2S for qemu-devel@nongnu.org; Tue, 03 Nov 2015 07:00:44 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:61989) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtaGW-0002bJ-93 for qemu-devel@nongnu.org; Tue, 03 Nov 2015 07:00:40 -0500 From: zhanghailiang Date: Tue, 3 Nov 2015 19:56:41 +0800 Message-ID: <1446551816-15768-24-git-send-email-zhang.zhanghailiang@huawei.com> In-Reply-To: <1446551816-15768-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1446551816-15768-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH COLO-Frame v10 23/38] qmp event: Add event notification for COLO error List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: lizhijian@cn.fujitsu.com, quintela@redhat.com, Markus Armbruster , yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, arei.gonglei@huawei.com, stefanha@redhat.com, amit.shah@redhat.com, Michael Roth , zhanghailiang If some errors happen during VM's COLO FT stage, it's important to notify the users of this event. Together with 'colo_lost_heartbeat', users can intervene in COLO's failover work immediately. If users don't want to get involved in COLO's failover verdict, it is still necessary to notify users that we exit COLO mode. Cc: Markus Armbruster Cc: Michael Roth Signed-off-by: zhanghailiang Signed-off-by: Li Zhijian --- docs/qmp-events.txt | 17 +++++++++++++++++ migration/colo.c | 13 +++++++++++++ qapi-schema.json | 16 ++++++++++++++++ qapi/event.json | 17 +++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/docs/qmp-events.txt b/docs/qmp-events.txt index d2f1ce4..165dd76 100644 --- a/docs/qmp-events.txt +++ b/docs/qmp-events.txt @@ -184,6 +184,23 @@ Example: Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR event. +COLO_EXIT +--------- + +Emitted when VM finishes COLO mode due to some errors happening or +the request of users. + +Data: + + - "mode": COLO mode, primary or secondary side (json-string) + - "reason": the exit reason, internal error or external request. (json-string) + - "error": error message (json-string, operation) + +Example: + +{"timestamp": {"seconds": 2032141960, "microseconds": 417172}, + "event": "COLO_EXIT", "data": {"mode": "primary", "reason": "request" } } + DEVICE_DELETED -------------- diff --git a/migration/colo.c b/migration/colo.c index de6265e..247b40f 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -18,6 +18,7 @@ #include "qemu/error-report.h" #include "qemu/sockets.h" #include "migration/failover.h" +#include "qapi-event.h" /* * checkpoint interval: unit ms @@ -343,6 +344,9 @@ out: current_time = error_time = qemu_clock_get_ms(QEMU_CLOCK_HOST); if (ret < 0) { error_report("%s: %s", __func__, strerror(-ret)); + qapi_event_send_colo_exit(COLO_MODE_PRIMARY, COLO_EXIT_REASON_ERROR, + true, strerror(-ret), NULL); + /* Give users time to get involved in this verdict */ while (current_time - error_time <= DEFAULT_FAILOVER_DELAY) { if (failover_request_is_active()) { @@ -359,6 +363,9 @@ out: failover_request_active(NULL); } qemu_mutex_unlock_iothread(); + } else { + qapi_event_send_colo_exit(COLO_MODE_PRIMARY, COLO_EXIT_REASON_REQUEST, + false, NULL, NULL); } qsb_free(buffer); @@ -530,6 +537,9 @@ out: if (ret < 0) { error_report("colo incoming thread will exit, detect error: %s", strerror(-ret)); + qapi_event_send_colo_exit(COLO_MODE_SECONDARY, COLO_EXIT_REASON_ERROR, + true, strerror(-ret), NULL); + /* Give users time to get involved in this verdict */ while (current_time - error_time <= DEFAULT_FAILOVER_DELAY) { if (failover_request_is_active()) { @@ -548,6 +558,9 @@ out: error_report("SVM is going to exit in default!"); exit(1); } + } else { + qapi_event_send_colo_exit(COLO_MODE_SECONDARY, COLO_EXIT_REASON_REQUEST, + false, NULL, NULL); } if (fb) { diff --git a/qapi-schema.json b/qapi-schema.json index ff0e941..8cc1f60 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -751,6 +751,22 @@ 'data': [ 'unknown', 'primary', 'secondary'] } ## +# @COLOExitReason +# +# The reason of COLO exit +# +# @unknow: unknown reason +# +# @request: COLO exit is due to an external request +# +# @error: COLO exit is due to an internal error +# +# Since: 2.5 +## +{ 'enum': 'COLOExitReason', + 'data': [ 'unknown', 'request', 'error'] } + +## # @x-colo-lost-heartbeat # # Tell qemu that heartbeat is lost, request it to do takeover procedures. diff --git a/qapi/event.json b/qapi/event.json index f0cef01..6158ab5 100644 --- a/qapi/event.json +++ b/qapi/event.json @@ -255,6 +255,23 @@ 'data': {'status': 'MigrationStatus'}} ## +# @COLO_EXIT +# +# Emitted when VM finishes COLO mode due to some errors happening or +# the request of users. +# +# @mode: @COLOMode describing which side of VM is exit. +# +# @reason: @COLOExitReason describing the reason of colo exit. +# +# @error: #optional, error message. Only present on error happening. +# +# Since: 2.5 +## +{ 'event': 'COLO_EXIT', + 'data': {'mode': 'COLOMode', 'reason': 'COLOExitReason', '*error': 'str' } } + +## # @ACPI_DEVICE_OST # # Emitted when guest executes ACPI _OST method. -- 1.8.3.1