From nobody Mon Apr 29 02:29:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1492008508707920.0997391178583; Wed, 12 Apr 2017 07:48:28 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 80C043D97B; Wed, 12 Apr 2017 14:48:23 +0000 (UTC) Received: from colo-mx.corp.redhat.com (unknown [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E013177FE0; Wed, 12 Apr 2017 14:48:22 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 61C985EC66; Wed, 12 Apr 2017 14:48:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v3CEmJTN007734 for ; Wed, 12 Apr 2017 10:48:19 -0400 Received: by smtp.corp.redhat.com (Postfix) id C17E581872; Wed, 12 Apr 2017 14:48:19 +0000 (UTC) Received: from caroline.brq.redhat.com (dhcp129-198.brq.redhat.com [10.34.129.198]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4B38181894 for ; Wed, 12 Apr 2017 14:48:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 80C043D97B Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 80C043D97B From: Martin Kletzander To: libvir-list@redhat.com Date: Wed, 12 Apr 2017 16:48:04 +0200 Message-Id: <57d4f890881275431f664fe0688ecfd96e2d8210.1492008339.git.mkletzan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH] qemu: Report shutdown event details X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@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 (mx1.redhat.com [10.5.110.30]); Wed, 12 Apr 2017 14:48:28 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" QEMU will likely report the details of it shutting down, particularly the system it received in case it was killed. We should forward that information along. Since the only way we can extend information provided to the user is adding event details, we might as well emit multiple events (one with the reason for the shutdown and keep the one for the shutdown being finished for clarity and compatibility). Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D1384007 Signed-off-by: Martin Kletzander --- This is waiting for a patch in QEMU [1] that I tested this with. [1] https://lists.gnu.org/archive/html/qemu-devel/2017-04/msg01098.html examples/object-events/event-test.c | 9 +++++++++ include/libvirt/libvirt-domain.h | 3 +++ src/qemu/qemu_monitor.c | 6 +++--- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_monitor_json.c | 4 ++-- src/qemu/qemu_process.c | 20 ++++++++++++++++++++ tools/virsh-domain.c | 6 +++++- 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/e= vent-test.c index 12690cac09ce..b4e1dd7970d9 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -240,6 +240,15 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED: return "Finished"; + case VIR_DOMAIN_EVENT_SHUTDOWN_SIGINT: + return "Killed with SIGINT"; + + case VIR_DOMAIN_EVENT_SHUTDOWN_SIGHUP: + return "Killed with SIGHUP"; + + case VIR_DOMAIN_EVENT_SHUTDOWN_SIGTERM: + return "Killed with SIGTERM"; + case VIR_DOMAIN_EVENT_SHUTDOWN_LAST: break; } diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 501996bc84f1..b3619c4baae7 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -2984,6 +2984,9 @@ typedef enum { */ typedef enum { VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED =3D 0, /* Guest finished shutdown s= equence */ + VIR_DOMAIN_EVENT_SHUTDOWN_SIGINT =3D 1, /* Guest is shutting down du= e to SIGINT */ + VIR_DOMAIN_EVENT_SHUTDOWN_SIGHUP =3D 2, /* Guest is shutting down du= e to SIGHUP */ + VIR_DOMAIN_EVENT_SHUTDOWN_SIGTERM =3D 3, /* Guest is shutting down du= e to SIGKILL */ # ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_SHUTDOWN_LAST diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 1d40d521a9b3..044b58ff090d 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1323,12 +1323,12 @@ qemuMonitorEmitEvent(qemuMonitorPtr mon, const char= *event, int -qemuMonitorEmitShutdown(qemuMonitorPtr mon) +qemuMonitorEmitShutdown(qemuMonitorPtr mon, const char *signal) { int ret =3D -1; - VIR_DEBUG("mon=3D%p", mon); + VIR_DEBUG("mon=3D%p signal=3D%s", mon, NULLSTR(signal)); - QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm); + QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm, signal); return ret; } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 12f98beba763..c6ecee66a140 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -130,6 +130,7 @@ typedef int (*qemuMonitorDomainEventCallback)(qemuMonit= orPtr mon, void *opaque); typedef int (*qemuMonitorDomainShutdownCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, + const char *signal, void *opaque); typedef int (*qemuMonitorDomainResetCallback)(qemuMonitorPtr mon, virDomainObjPtr vm, @@ -344,7 +345,7 @@ int qemuMonitorGetDiskSecret(qemuMonitorPtr mon, int qemuMonitorEmitEvent(qemuMonitorPtr mon, const char *event, long long seconds, unsigned int micros, const char *details); -int qemuMonitorEmitShutdown(qemuMonitorPtr mon); +int qemuMonitorEmitShutdown(qemuMonitorPtr mon, const char *signal); int qemuMonitorEmitReset(qemuMonitorPtr mon); int qemuMonitorEmitPowerdown(qemuMonitorPtr mon); int qemuMonitorEmitStop(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index aeb777d37c12..4f67b4496b43 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -523,9 +523,9 @@ qemuMonitorJSONKeywordStringToJSON(const char *str, con= st char *firstkeyword) } -static void qemuMonitorJSONHandleShutdown(qemuMonitorPtr mon, virJSONValue= Ptr data ATTRIBUTE_UNUSED) +static void qemuMonitorJSONHandleShutdown(qemuMonitorPtr mon, virJSONValue= Ptr data) { - qemuMonitorEmitShutdown(mon); + qemuMonitorEmitShutdown(mon, virJSONValueObjectGetString(data, "signal= ")); } static void qemuMonitorJSONHandleReset(qemuMonitorPtr mon, virJSONValuePtr= data ATTRIBUTE_UNUSED) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 5e119a237fba..3265db8f1590 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -634,10 +634,12 @@ qemuProcessHandleEvent(qemuMonitorPtr mon ATTRIBUTE_U= NUSED, static int qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virDomainObjPtr vm, + const char *signal, void *opaque) { virQEMUDriverPtr driver =3D opaque; qemuDomainObjPrivatePtr priv; + virObjectEventPtr pre_event =3D NULL; virObjectEventPtr event =3D NULL; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); @@ -662,6 +664,23 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE= _UNUSED, virDomainObjSetState(vm, VIR_DOMAIN_SHUTDOWN, VIR_DOMAIN_SHUTDOWN_UNKNOWN); + + if (signal) { + virDomainEventShutdownDetailType detail =3D 0; + + if (STREQ(signal, "int")) + detail =3D VIR_DOMAIN_EVENT_SHUTDOWN_SIGINT; + else if (STREQ(signal, "hup")) + detail =3D VIR_DOMAIN_EVENT_SHUTDOWN_SIGHUP; + else if (STREQ(signal, "term")) + detail =3D VIR_DOMAIN_EVENT_SHUTDOWN_SIGTERM; + + if (detail) + pre_event =3D virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT= _SHUTDOWN, + detail); + } + event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_SHUTDOWN, VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED); @@ -678,6 +697,7 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_= UNUSED, unlock: virObjectUnlock(vm); + qemuDomainEventQueue(driver, pre_event); qemuDomainEventQueue(driver, event); virObjectUnref(cfg); diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index db8accfe436b..12c1908c44f9 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -12220,7 +12220,11 @@ VIR_ENUM_IMPL(virshDomainEventStopped, VIR_ENUM_DECL(virshDomainEventShutdown) VIR_ENUM_IMPL(virshDomainEventShutdown, VIR_DOMAIN_EVENT_SHUTDOWN_LAST, - N_("Finished")) + N_("Finished"), + N_("Killed with SIGINT"), + N_("Killed with SIGHUP"), + N_("Killed with SIGTERM"), + ) VIR_ENUM_DECL(virshDomainEventPMSuspended) VIR_ENUM_IMPL(virshDomainEventPMSuspended, -- 2.12.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list