From nobody Fri Dec 19 04:00:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1743433512; cv=none; d=zohomail.com; s=zohoarc; b=X1NIQBm5Vy7Ls2Bps7lIoY1hUe9EZOLqQIR/l9a/NhtlE8MrqnNsneZRk9HcmR5slprQIiF4Elk1bMAKxVcy3lRKw2+spBzk0mJFwuZRbqLu5ZIOz5hFa2pDQSvFm1vCX1hZezxkxwWndc1mRNPKKd+NCY/2yIprogAqJfAFxIs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743433512; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=inS3LGNOkjyTTvHe/V26f4zrSwswhlSD/KKLWHTQ2/0=; b=jm28J1+rmQMy+RPAn4nrftUTfrQGiYC4szV6Xc48ABkczsQwVVh61U8/t3BK+MF9xYdiYQBEucEuEmX+pJe4hjJnL8Q5/J1eZglLUJHv1w2MkHV91USHAO9Uwzrp7e5o/zK5T0oAs5DD9LuDP3WUUIxsE58bCBLSJoBuGwtMyJo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1743433512418695.2052084483032; Mon, 31 Mar 2025 08:05:12 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id BCBAA1256; Mon, 31 Mar 2025 11:05:11 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 8C9A81326; Mon, 31 Mar 2025 11:04:16 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 7FFD21183; Mon, 31 Mar 2025 11:04:12 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 942C41183 for ; Mon, 31 Mar 2025 11:04:11 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-47-P4FIsVvrMreMy4RnNaJKKg-1; Mon, 31 Mar 2025 11:04:08 -0400 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 1206A180034D for ; Mon, 31 Mar 2025 15:04:08 +0000 (UTC) Received: from kshcheti-thinkpadp1gen4i.tpbc.com (unknown [10.43.2.246]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2139F1955BEF; Mon, 31 Mar 2025 15:04:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743433451; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AJ6L63sUX3XzBBwO+Yn8fpf4W7K6Xd4hLFqnaYJaaFQ=; b=eBCXcTQuKp+mzhlIH2SaYf3wU0PRtMhWLaQ/5S3khz1ukfGMwo98MrdJQ0f3coYuYXOdWT E5QT/+DoQAhMV0EWq6No3NfCEfiuyT25irXmYGLFkHRhMyWcPqTD1oKSJD4eJCGcvJU6Vu KJX5LBvLrYW/u69q/hwY3tzSI2ylvuc= X-MC-Unique: P4FIsVvrMreMy4RnNaJKKg-1 X-Mimecast-MFC-AGG-ID: P4FIsVvrMreMy4RnNaJKKg_1743433448 To: devel@lists.libvirt.org Subject: [PATCH 1/4] ch: add persistent definition save and load Date: Mon, 31 Mar 2025 17:01:38 +0200 Message-ID: <20250331150359.276206-2-kshcheti@redhat.com> In-Reply-To: <20250331150359.276206-1-kshcheti@redhat.com> References: <20250331150359.276206-1-kshcheti@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 2WLHroEzGzXCTskFgk7htxOuvosRYsmPWP26c6RHse0_1743433448 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: WGW5SHXWWRNZ5ZWM5CPVGDGPFTXTMHYQ X-Message-ID-Hash: WGW5SHXWWRNZ5ZWM5CPVGDGPFTXTMHYQ X-MailFrom: kshcheti@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Kirill Shchetiniuk X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Kirill Shchetiniuk via Devel Reply-To: Kirill Shchetiniuk X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1743433513576019000 Content-Type: text/plain; charset="utf-8"; x-default="true" When the domain was defined, its persistent domain definition wasn't saved on disk, leading to the loss of all defined domains after a CH driver restart. Now all defined persistent domains are saved on disk and loaded from disk during CH driver initialization. Saved domains now also can be removed with undefine. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/743 Signed-off-by: Kirill Shchetiniuk --- src/ch/ch_conf.c | 10 +++++++--- src/ch/ch_conf.h | 2 ++ src/ch/ch_driver.c | 24 +++++++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c index cab97639c4..f0cb963656 100644 --- a/src/ch/ch_conf.c +++ b/src/ch/ch_conf.c @@ -149,11 +149,11 @@ virCHDriverConfigNew(bool privileged) cfg->logDir =3D g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR= ); cfg->stateDir =3D g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR); cfg->saveDir =3D g_strdup_printf("%s/lib/libvirt/ch/save", LOCALST= ATEDIR); + cfg->configBaseDir =3D g_strdup_printf("%s/libvirt", SYSCONFDIR); =20 } else { g_autofree char *rundir =3D NULL; g_autofree char *cachedir =3D NULL; - g_autofree char *configbasedir =3D NULL; =20 cachedir =3D virGetUserCacheDirectory(); =20 @@ -162,10 +162,12 @@ virCHDriverConfigNew(bool privileged) rundir =3D virGetUserRuntimeDirectory(); cfg->stateDir =3D g_strdup_printf("%s/ch/run", rundir); =20 - configbasedir =3D virGetUserConfigDirectory(); - cfg->saveDir =3D g_strdup_printf("%s/ch/save", configbasedir); + cfg->configBaseDir =3D virGetUserConfigDirectory(); + cfg->saveDir =3D g_strdup_printf("%s/ch/save", cfg->configBaseDir); } =20 + cfg->configDir =3D g_strdup_printf("%s/ch", cfg->configBaseDir); + return cfg; } =20 @@ -183,6 +185,8 @@ virCHDriverConfigDispose(void *obj) g_free(cfg->saveDir); g_free(cfg->stateDir); g_free(cfg->logDir); + g_free(cfg->configBaseDir); + g_free(cfg->configDir); } =20 #define MIN_VERSION ((15 * 1000000) + (0 * 1000) + (0)) diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h index b08573476e..8beeb69b95 100644 --- a/src/ch/ch_conf.h +++ b/src/ch/ch_conf.h @@ -40,6 +40,8 @@ struct _virCHDriverConfig { char *stateDir; char *logDir; char *saveDir; + char *configBaseDir; + char *configDir; =20 int cgroupControllers; =20 diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 3bdcf66ebd..c7f357dac9 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -338,6 +338,7 @@ chDomainDefineXMLFlags(virConnectPtr conn, const char *= xml, unsigned int flags) virDomainObj *vm =3D NULL; virDomainPtr dom =3D NULL; virObjectEvent *event =3D NULL; + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); g_autofree char *managed_save_path =3D NULL; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 @@ -370,6 +371,11 @@ chDomainDefineXMLFlags(virConnectPtr conn, const char = *xml, unsigned int flags) goto cleanup; } =20 + /* Save new persistent domain definition */ + if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, + driver->xmlopt, cfg->configDir) < 0) + goto cleanup; + vm->persistent =3D 1; event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED, @@ -398,6 +404,7 @@ chDomainUndefineFlags(virDomainPtr dom, virCHDriver *driver =3D dom->conn->privateData; virDomainObj *vm; virObjectEvent *event =3D NULL; + g_autoptr(virCHDriverConfig) cfg =3D NULL; int ret =3D -1; =20 virCheckFlags(0, -1); @@ -405,6 +412,8 @@ chDomainUndefineFlags(virDomainPtr dom, if (!(vm =3D virCHDomainObjFromDomain(dom))) goto cleanup; =20 + cfg =3D virCHDriverGetConfig(driver); + if (virDomainUndefineFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; =20 @@ -413,6 +422,10 @@ chDomainUndefineFlags(virDomainPtr dom, "%s", _("Cannot undefine transient domain")); goto cleanup; } + + if (virDomainDeleteConfig(cfg->configDir, NULL, vm) < 0) + goto cleanup; + event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_R= EMOVED); @@ -1413,6 +1426,7 @@ chStateInitialize(bool privileged, { int ret =3D VIR_DRV_STATE_INIT_ERROR; int rv; + virCHDriverConfig *cfg; =20 if (root !=3D NULL) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1444,7 +1458,7 @@ chStateInitialize(bool privileged, if (!(ch_driver->xmlopt =3D chDomainXMLConfInit(ch_driver))) goto cleanup; =20 - if (!(ch_driver->config =3D virCHDriverConfigNew(privileged))) + if (!(ch_driver->config =3D cfg =3D virCHDriverConfigNew(privileged))) goto cleanup; =20 if (!(ch_driver->hostdevMgr =3D virHostdevManagerGetDefault())) @@ -1459,6 +1473,14 @@ chStateInitialize(bool privileged, goto cleanup; } =20 + /* Persistent domains load */ + if (virDomainObjListLoadAllConfigs(ch_driver->domains, + cfg->configDir, + NULL, false, + ch_driver->xmlopt, + NULL, NULL) < 0) + goto cleanup; + ch_driver->chCaps =3D virCHCapsInitCHVersionCaps(ch_driver->version); =20 ch_driver->privileged =3D privileged; --=20 2.48.1 From nobody Fri Dec 19 04:00:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1743433535; cv=none; d=zohomail.com; s=zohoarc; b=HgW2B5Ea0gSwwwkzx4zt5QBzTgEfMqKi0U3B6D+q+jlDMLNDzlitEDz5+gWjojOBXj/zVOqJnMDj8uuNG7C8DCc1qPkiQIGJJ0jsD3Cl94irJBv0uCwJzn8E4pAlEakwkW0GK1sostlI5r7v35aUyjoihhWSZ7SU/J5Ej3nzBeg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743433535; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=Qbeq0aqfMnYWbBsVnyDeU1mcK2RWDBZBDTILVB2KTK0=; b=IB6oGABegCBKYKrehCjiJtM4vkmAl9e5oZewKX8umGK3zIUc1htVFeRzS28hVH3nxdS39+NztzcQgiOJeXaP2PNPrATpz5fMjWrp99HZfiEIzSOEVUVaoXhqj6XPjfQdO6HrfH0MTmMXUBR7w/mwbfdgIGJR37816ulh4v29sBA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1743433535505393.8481200361979; Mon, 31 Mar 2025 08:05:35 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 7248A1357; Mon, 31 Mar 2025 11:05:34 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 9B13F1371; Mon, 31 Mar 2025 11:04:19 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id BB87B11A6; Mon, 31 Mar 2025 11:04:12 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 350C111AC for ; Mon, 31 Mar 2025 11:04:12 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-449-Yq7XHmoEP-qc6RvjS41udw-1; Mon, 31 Mar 2025 11:04:10 -0400 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 6DDDB19560BC for ; Mon, 31 Mar 2025 15:04:09 +0000 (UTC) Received: from kshcheti-thinkpadp1gen4i.tpbc.com (unknown [10.43.2.246]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7C3981955BEF; Mon, 31 Mar 2025 15:04:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743433451; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ISJX8verpHfaZ4XKma9XCmwDLOmscJqQF86bet8EUDI=; b=ekJC4BHSMnNm9kglX2fdYUeGAGwPg0Ff7DDFR/mOfEHgrxz7q9QJIb/oSuV1d4hqs9OVCE Wkq0wBcgci4P7Fag9FVtqjVaS+n6VC5zuU3Utjm64tYcb7jdyolEm/S54n8TTNEznCDxqN irr/MHyYVb90/DP8YkYS7p1lVdtSo9s= X-MC-Unique: Yq7XHmoEP-qc6RvjS41udw-1 X-Mimecast-MFC-AGG-ID: Yq7XHmoEP-qc6RvjS41udw_1743433449 To: devel@lists.libvirt.org Subject: [PATCH 2/4] ch: add transient definition save and load Date: Mon, 31 Mar 2025 17:01:39 +0200 Message-ID: <20250331150359.276206-3-kshcheti@redhat.com> In-Reply-To: <20250331150359.276206-1-kshcheti@redhat.com> References: <20250331150359.276206-1-kshcheti@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Wz5D7Nc5NgdiuNVQeoJfdgiXj1qXnHfU2-3UnKQjMgs_1743433449 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QUDTEJWCPM2XUFH5FUPLWO3RDPLFBOCD X-Message-ID-Hash: QUDTEJWCPM2XUFH5FUPLWO3RDPLFBOCD X-MailFrom: kshcheti@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Kirill Shchetiniuk X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Kirill Shchetiniuk via Devel Reply-To: Kirill Shchetiniuk X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1743433538411019100 Content-Type: text/plain; charset="utf-8"; x-default="true" When domain was started its transient definition was not saved on disk, this led to the situation when CH driver dies and starts again, all transient definitions of currently running domains had been lost. Newly all transient definitions of running domains are saved on disk and can be loaded during the CH driver initialization. Transient definitions are also removed when domain stops. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/743 Signed-off-by: Kirill Shchetiniuk --- src/ch/ch_domain.c | 15 +++++++++++++++ src/ch/ch_domain.h | 3 +++ src/ch/ch_driver.c | 8 ++++++++ src/ch/ch_process.c | 25 +++++++++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index c0c9acd85b..4c9ed93b15 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -414,3 +414,18 @@ virCHDomainValidateActualNetDef(virDomainNetDef *net) =20 return 0; } + +void +virCHDomainSaveStatus(virDomainObj *vm) +{ + virCHDomainObjPrivate *priv =3D vm->privateData; + virCHDriver *driver =3D priv->driver; + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); + + VIR_DEBUG("Saving status on vm %s", vm->def->name); + + if (virDomainObjIsActive(vm)) { + if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) + VIR_WARN("Failed to save status on vm %s", vm->def->name); + } +} diff --git a/src/ch/ch_domain.h b/src/ch/ch_domain.h index 69a657f6af..1a43049f91 100644 --- a/src/ch/ch_domain.h +++ b/src/ch/ch_domain.h @@ -79,3 +79,6 @@ virCHDomainObjFromDomain(virDomainPtr domain); =20 int virCHDomainValidateActualNetDef(virDomainNetDef *net); + +void +virCHDomainSaveStatus(virDomainObj *vm); diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index c7f357dac9..4ce68c9299 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -1473,6 +1473,14 @@ chStateInitialize(bool privileged, goto cleanup; } =20 + /* Transient domains load */ + if (virDomainObjListLoadAllConfigs(ch_driver->domains, + cfg->stateDir, + NULL, true, + ch_driver->xmlopt, + NULL, NULL) < 0) + goto cleanup; + /* Persistent domains load */ if (virDomainObjListLoadAllConfigs(ch_driver->domains, cfg->configDir, diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 31aa49b3a5..08331352a4 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -995,6 +995,8 @@ virCHProcessStart(virCHDriver *driver, =20 virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, reason); =20 + virCHDomainSaveStatus(vm); + return 0; =20 cleanup: @@ -1004,6 +1006,25 @@ virCHProcessStart(virCHDriver *driver, return ret; } =20 +static void +virCHProcessRemoveDomainStatus(virCHDriver *driver, + virDomainObj *vm) +{ + g_autofree char *file =3D NULL; + virCHDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); + + file =3D g_strdup_printf("%s/%s.xml", cfg->stateDir, vm->def->name); + + if (unlink(file) < 0 && errno !=3D ENOENT && errno !=3D ENOTDIR) + VIR_WARN("Failed to remove domain status XML for %s: %s", + vm->def->name, g_strerror(errno)); + + if (priv->pidfile && unlink(priv->pidfile) && errno !=3D ENOENT) + VIR_WARN("Failed to remove PID file for %s: %s", + vm->def->name, g_strerror(errno)); +} + int virCHProcessStop(virCHDriver *driver, virDomainObj *vm, @@ -1056,6 +1077,10 @@ virCHProcessStop(virCHDriver *driver, virHostdevReAttachDomainDevices(driver->hostdevMgr, CH_DRIVER_NAME, de= f, hostdev_flags); =20 + virDomainObjRemoveTransientDef(vm); + + virCHProcessRemoveDomainStatus(driver, vm); + virErrorRestore(&orig_err); return 0; } --=20 2.48.1 From nobody Fri Dec 19 04:00:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1743433587; cv=none; d=zohomail.com; s=zohoarc; b=B84zdUIySGCCfQe6jDq9nfmDFHUHNVMIJrZvlG0gDADXZVrepCRNjmLdddhuk6s+lGXC6zuJ6hb58zOXbOeskrMgEcXw0ZYYhROA9iFfYvTjVvy3mXGQ33oD3ntr10o93DrhT9CXqM/KvlLHkwgFYeI71EqyvnOjTPSRCY68HUs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743433587; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=fs42qJdKMftofxJVUhpuFGNUZG3OYotI6pWpMFp+tTI=; b=g0/GN+myI0qKtGQzj6SzDYCZCGvKJOVnc+/xI6X+7134MMGwubTWJLwj9P7ecSBaw7sLFK4d0q5G5ItL7Oj+0CgumZi/NxUG73rqOVUiBtQw5fV+/aVlkeQgFP/lQtqMG1hNkIgXZD6HNb/qLnP9ArcC9ExP+lg6z8T7PooTYu0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1743433587748827.2804749497799; Mon, 31 Mar 2025 08:06:27 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C164F1240; Mon, 31 Mar 2025 11:06:26 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id E8CFF1384; Mon, 31 Mar 2025 11:04:21 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 87E6111AC; Mon, 31 Mar 2025 11:04:13 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E14A41183 for ; Mon, 31 Mar 2025 11:04:12 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-690-7o5MSs37Oymw88zSvyvbuw-1; Mon, 31 Mar 2025 11:04:11 -0400 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id C8064180025C for ; Mon, 31 Mar 2025 15:04:10 +0000 (UTC) Received: from kshcheti-thinkpadp1gen4i.tpbc.com (unknown [10.43.2.246]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D7CE61955BF1; Mon, 31 Mar 2025 15:04:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743433452; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LP3rjfLyacj/bvtxz996woAnhw+zaR4G0fzH+qz6u5o=; b=Q4t3wbujllduz+JT+m1dXr0ncnaLhCwRzDXo5B39/E1Pu7eHW8EUGzA7EqV9qTWtDDInol 0geslfD7qlHarVVBb0AjIzoQC+IjRGxsqd/FxoleznMlNh/pdH1DiUgTgznfxccX9Iv/nK KJzNTwG3rQxhjKY+DW/Xi/oauPfEzoU= X-MC-Unique: 7o5MSs37Oymw88zSvyvbuw-1 X-Mimecast-MFC-AGG-ID: 7o5MSs37Oymw88zSvyvbuw_1743433450 To: devel@lists.libvirt.org Subject: [PATCH 3/4] ch: add reconnection to running domains Date: Mon, 31 Mar 2025 17:01:40 +0200 Message-ID: <20250331150359.276206-4-kshcheti@redhat.com> In-Reply-To: <20250331150359.276206-1-kshcheti@redhat.com> References: <20250331150359.276206-1-kshcheti@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 6gFYDNioN4t1kCeQ-m4F7M0Bc9V65RugvC3nDjI7X50_1743433450 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 23JD5OIO5WJ52R46OOIKM3FMNG6W443O X-Message-ID-Hash: 23JD5OIO5WJ52R46OOIKM3FMNG6W443O X-MailFrom: kshcheti@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Kirill Shchetiniuk X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Kirill Shchetiniuk via Devel Reply-To: Kirill Shchetiniuk X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1743433591902019100 Content-Type: text/plain; charset="utf-8"; x-default="true" Previously, if any domain was still running, the driver was unable to reconnect to it, preventing further interactions with running domain. To resolve this, the driver now attempts to reconnect to the domains' monitors, which transient definitions are stored in state dir, during the initialization step. This allows us to perform further actions on domains even if the CH driver was restarted. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/743 Signed-off-by: Kirill Shchetiniuk --- src/ch/ch_driver.c | 2 + src/ch/ch_monitor.c | 65 +++++++++++++++++++++++++ src/ch/ch_monitor.h | 2 + src/ch/ch_process.c | 116 ++++++++++++++++++++++++++++++++++++++++++++ src/ch/ch_process.h | 2 + 5 files changed, 187 insertions(+) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 4ce68c9299..465528baf1 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -1489,6 +1489,8 @@ chStateInitialize(bool privileged, NULL, NULL) < 0) goto cleanup; =20 + virCHProcessReconnectAll(ch_driver); + ch_driver->chCaps =3D virCHCapsInitCHVersionCaps(ch_driver->version); =20 ch_driver->privileged =3D privileged; diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 1dc085a755..4ea79506ce 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -581,6 +581,71 @@ chMonitorCreateSocket(const char *socket_path) return -1; } =20 +virCHMonitor * +virCHMonitorReconnectNew(virDomainObj *vm, virCHDriverConfig *cfg) +{ + g_autoptr(virCHMonitor) mon =3D NULL; + virCHDomainObjPrivate *priv =3D vm->privateData; + int event_monitor_fd; + int rv; + + if (virCHMonitorInitialize() < 0) + return NULL; + + if (!(mon =3D virObjectLockableNew(virCHMonitorClass))) + return NULL; + + mon->eventmonitorfd =3D -1; + + if (!vm->def) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VM is not defined")); + return NULL; + } + + mon->socketpath =3D g_strdup_printf("%s/%s-socket", + cfg->stateDir, vm->def->name); + + mon->eventmonitorpath =3D g_strdup_printf("%s/%s-event-monitor-fifo", + cfg->stateDir, vm->def->name); + + if ((rv =3D virPidFileReadPathIfLocked(priv->pidfile, &mon->pid)) < 0)= { + VIR_WARN("Pidfile of %1$s can't be read error", vm->def->name); + return NULL; + } + + if (mon->pid =3D=3D -1) { + VIR_WARN("Vm %1$s isn't running", vm->def->name); + return NULL; + } + + VIR_DEBUG("CH vm=3D%p name=3D%s is running as pid=3D%lld", vm, vm->def= ->name, (long long)vm->pid); + + /* open the reader end of fifo before start Event Handler */ + while ((event_monitor_fd =3D open(mon->eventmonitorpath, O_RDONLY)) < = 0) { + if (errno =3D=3D EINTR) { + g_usleep(100000); + continue; + } + VIR_ERROR(_("%1$s: Failed to open the event monitor FIFO(%2$s) rea= d end!"), + vm->def->name, mon->eventmonitorpath); + return NULL; + } + + mon->eventmonitorfd =3D event_monitor_fd; + VIR_DEBUG("%s: Opened the event monitor FIFO(%s)", vm->def->name, mon-= >eventmonitorpath); + + mon->vm =3D virObjectRef(vm); + + if (virCHStartEventHandler(mon) < 0) + return NULL; + + mon->handle =3D curl_easy_init(); + + return g_steal_pointer(&mon); +} + + virCHMonitor * virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile) { diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h index 185de0dbfd..f6d7119c96 100644 --- a/src/ch/ch_monitor.h +++ b/src/ch/ch_monitor.h @@ -143,3 +143,5 @@ virCHMonitorBuildNetJson(virDomainNetDef *netdef, int virCHMonitorBuildRestoreJson(virDomainDef *vmdef, const char *from, char **jsonstr); + +virCHMonitor *virCHMonitorReconnectNew(virDomainObj *vm, virCHDriverConfig= *cfg); diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index 08331352a4..d7a5ecc09c 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -1194,3 +1194,119 @@ virCHProcessStartRestore(virCHDriver *driver, virDo= mainObj *vm, const char *from virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED); return ret; } + + +struct virCHProcessReconnectData +{ + virDomainObj *vm; + virCHDriver *driver; +}; + + +static void +virCHProcessReconnect(void *opaque) +{ + struct virCHProcessReconnectData *data =3D opaque; + virDomainObj *vm =3D data->vm; + virCHDriver *driver =3D data->driver; + g_autoptr(virCHDriverConfig) cfg =3D virCHDriverGetConfig(driver); + virCHDomainObjPrivate *priv =3D vm->privateData; + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY)) + goto error; + + VIR_DEBUG("Reconnecting to vm=3D%p name=3D%s", vm, vm->def->name); + + /* Build pidfile path where is running domain pid stored */ + if (!(priv->pidfile =3D virPidFileBuildPath(cfg->stateDir, vm->def->na= me))) { + virReportSystemError(errno, "%s", _("Failed to build pidfile path.= ")); + goto error; + } + + /* Create new monitor object without new CH startup */ + if (!priv->monitor) { + if (!(priv->monitor =3D virCHMonitorReconnectNew(vm, cfg))) + goto error; + } + + vm->pid =3D priv->monitor->pid; + vm->def->id =3D vm->pid; + priv->machineName =3D virCHDomainGetMachineName(vm); + + if (!priv->machineName) + goto error; + + if (virDomainCgroupConnectCgroup("ch", + vm, + &priv->cgroup, + cfg->cgroupControllers, + priv->driver->privileged, + priv->machineName) < 0) + goto error; + + + if (virDomainInterfaceStartDevices(vm->def) < 0) + goto error; + + virCHProcessUpdateInfo(vm); + + if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) + goto error; + + cleanup: + virDomainObjEndJob(vm); + virDomainObjEndAPI(&vm); + return; + + error: + virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED); + + goto cleanup; +} + +static int +virCHProcessReconnectHelper(virDomainObj *vm, void *opaque) +{ + struct virCHProcessReconnectData *src =3D opaque; + struct virCHProcessReconnectData *data; + virThread thread; + g_autofree char *name =3D NULL; + + /* Skip reconnect is domain if is not running */ + if (vm->pid =3D=3D 0) + return 0; + + data =3D g_new0(struct virCHProcessReconnectData, 1); + + memcpy(data, src, sizeof(*data)); + data->vm =3D vm; + + virObjectLock(vm); + virObjectRef(vm); + + name =3D g_strdup_printf("reconnect-%s", vm->def->name); + + VIR_DEBUG("Reconnecting vm=3D%p name=3D%s", vm, vm->def->name); + + if (virThreadCreateFull(&thread, false, virCHProcessReconnect, + name, false, data) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could not create thread.")); + + virCHProcessStop(src->driver, vm, VIR_DOMAIN_SHUTOFF_FAILED); + + virDomainObjEndAPI(&vm); + VIR_FREE(data); + return -1; + } + + return 0; +} + +void +virCHProcessReconnectAll(virCHDriver *driver) +{ + struct virCHProcessReconnectData data =3D {.driver =3D driver}; + virDomainObjListForEach(driver->domains, true, + virCHProcessReconnectHelper, &data); +} diff --git a/src/ch/ch_process.h b/src/ch/ch_process.h index 7a6995b7cf..ff8267b497 100644 --- a/src/ch/ch_process.h +++ b/src/ch/ch_process.h @@ -38,3 +38,5 @@ int virCHProcessStartRestore(virCHDriver *driver, const char *from); =20 int virCHProcessUpdateInfo(virDomainObj *vm); + +void virCHProcessReconnectAll(virCHDriver *driver); --=20 2.48.1 From nobody Fri Dec 19 04:00:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1743433610; cv=none; d=zohomail.com; s=zohoarc; b=iVaKZ2UlSVz8nJot+EKPrybYPW05FvtZMp3WKdZAVcvLxm2FSDDksaLgQFQnivj8eFb/1GXLvW58/1U/7fFJ48FNXO5UAO/o1yebulR5Yu0AjDsouk0DVq1F3TSIMAyGaKCjfSGORNn0UBaemXg+Et1160A7Y72yYsfoj/dXl3A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743433610; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=uzrYjXFtcqoq3XYCYTiZRBMff2BN1UcLEI1YYqFEO1E=; b=hTt2IqgfP+tiEKfwTprbBvkDZYYw/oPpYyaisq4qgQBy1tvHUOvb39S46TBFa6gYW43KMCYu9m9aiPpTalQeQ98X7ejVgPmk2KNp1zxUML/u3W/NcEMQMPXYmRJ+2L0YNNI24On/hVxz7/T01rDbg6Tt/C4wX51fgCdKulncI4I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1743433610080670.8110788693268; Mon, 31 Mar 2025 08:06:50 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 1490BC5A; Mon, 31 Mar 2025 11:06:49 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 047F4135C; Mon, 31 Mar 2025 11:04:28 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id D104712BC; Mon, 31 Mar 2025 11:04:23 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 6F01B11B0 for ; Mon, 31 Mar 2025 11:04:15 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-507-yZRdlhywMwSNIsu0_FPnMQ-1; Mon, 31 Mar 2025 11:04:13 -0400 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id A156918001F7 for ; Mon, 31 Mar 2025 15:04:12 +0000 (UTC) Received: from kshcheti-thinkpadp1gen4i.tpbc.com (unknown [10.43.2.246]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AF4CB1955BEF; Mon, 31 Mar 2025 15:04:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743433455; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ycAK1INawR8f5vqvkcSznquuosX7Sn4kw/j53kfcdmg=; b=SBDrmbVSiVq3WtzfntUO4HnKS/elIWKdUpy0e4cuM1LDkgMsZn7dJ1lzqncfUO97LPzlye H6Ph8Xlk8pDUDh5/irf/5+bWA/fhR5bWHGLqwvoEsXef4sPhtTFpSseCWWyLHhYcFsP20z Auw8+UONf8dUu5Zd2uDFplJuGKWWQrc= X-MC-Unique: yZRdlhywMwSNIsu0_FPnMQ-1 X-Mimecast-MFC-AGG-ID: yZRdlhywMwSNIsu0_FPnMQ_1743433452 To: devel@lists.libvirt.org Subject: [PATCH 4/4] ch: fix timeout while domain is still running Date: Mon, 31 Mar 2025 17:01:41 +0200 Message-ID: <20250331150359.276206-5-kshcheti@redhat.com> In-Reply-To: <20250331150359.276206-1-kshcheti@redhat.com> References: <20250331150359.276206-1-kshcheti@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 6tdjysUyjl2mhEPBBSCaPstiqB_ee0MY7Lpn7AB-iKs_1743433452 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: VQNBIELEJZNGJSXVV6ASFUPTX3WNTG4L X-Message-ID-Hash: VQNBIELEJZNGJSXVV6ASFUPTX3WNTG4L X-MailFrom: kshcheti@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Kirill Shchetiniuk X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Kirill Shchetiniuk via Devel Reply-To: Kirill Shchetiniuk X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1743433612489019100 Content-Type: text/plain; charset="utf-8"; x-default="true" Previously, the CH driver would timeout even if one or more domains were still running, only an active virsh session prevented the driver's timeout. To address this, an inhibitor has been added to ensure driver remains active as long as any domain is still running. Inhibitor is now held when a domain starts up or when the driver successfully reconnects to a running domain. This now prevents the driver from timeout while any domain is still running. Inhibitor is later released with domain shutdown, ensuring correct running domains count. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/743 Signed-off-by: Kirill Shchetiniuk --- src/ch/ch_conf.h | 4 ++++ src/ch/ch_driver.c | 15 +++++++++++++-- src/ch/ch_process.c | 6 ++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/ch/ch_conf.h b/src/ch/ch_conf.h index 8beeb69b95..ca9151e5d8 100644 --- a/src/ch/ch_conf.h +++ b/src/ch/ch_conf.h @@ -26,6 +26,7 @@ #include "ch_capabilities.h" #include "virebtables.h" #include "object_event.h" +#include "virinhibitor.h" =20 #define CH_DRIVER_NAME "CH" #define CH_CMD "cloud-hypervisor" @@ -92,6 +93,9 @@ struct _virCHDriver =20 /* Immutable pointer, self-locking APIs */ virObjectEventState *domainEventState; + + /* Immutable pointer, self-locking APIs */ + virInhibitor *inhibitor; }; =20 #define CH_SAVE_MAGIC "libvirt-xml\n \0 \r" diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 465528baf1..2d72de3ed2 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -42,6 +42,7 @@ #include "viruuid.h" #include "virnuma.h" #include "virhostmem.h" +#include "virinhibitor.h" =20 #define VIR_FROM_THIS VIR_FROM_CH =20 @@ -1411,6 +1412,7 @@ static int chStateCleanup(void) virObjectUnref(ch_driver->domains); virObjectUnref(ch_driver->hostdevMgr); virObjectUnref(ch_driver->domainEventState); + virInhibitorFree(ch_driver->inhibitor); virMutexDestroy(&ch_driver->lock); g_clear_pointer(&ch_driver, g_free); =20 @@ -1421,8 +1423,8 @@ static virDrvStateInitResult chStateInitialize(bool privileged, const char *root, bool monolithic G_GNUC_UNUSED, - virStateInhibitCallback callback G_GNUC_UNUSED, - void *opaque G_GNUC_UNUSED) + virStateInhibitCallback callback, + void *opaque) { int ret =3D VIR_DRV_STATE_INIT_ERROR; int rv; @@ -1473,6 +1475,15 @@ chStateInitialize(bool privileged, goto cleanup; } =20 + /* Setup inhibitor to be able to avoid timeout */ + ch_driver->inhibitor =3D virInhibitorNew(VIR_INHIBITOR_WHAT_SHUTDOWN, + _("Libvirt Cloud-Hypervisor"), + _("Cloud-Hypervisor virtual mac= hines are running"), + VIR_INHIBITOR_MODE_DELAY, + callback, + opaque); + + /* Transient domains load */ if (virDomainObjListLoadAllConfigs(ch_driver->domains, cfg->stateDir, diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c index d7a5ecc09c..8f61a5f220 100644 --- a/src/ch/ch_process.c +++ b/src/ch/ch_process.c @@ -997,6 +997,8 @@ virCHProcessStart(virCHDriver *driver, =20 virCHDomainSaveStatus(vm); =20 + virInhibitorHold(driver->inhibitor); + return 0; =20 cleanup: @@ -1072,6 +1074,8 @@ virCHProcessStop(virCHDriver *driver, vm->def->id =3D -1; g_clear_pointer(&priv->machineName, g_free); =20 + virInhibitorRelease(driver->inhibitor); + virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason); =20 virHostdevReAttachDomainDevices(driver->hostdevMgr, CH_DRIVER_NAME, de= f, @@ -1253,6 +1257,8 @@ virCHProcessReconnect(void *opaque) if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) goto error; =20 + virInhibitorHold(driver->inhibitor); + cleanup: virDomainObjEndJob(vm); virDomainObjEndAPI(&vm); --=20 2.48.1