From nobody Wed Sep 23 07:40:41 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1783841799; cv=none; d=zohomail.com; s=zohoarc; b=RW/qq6DcMXcDOUEUUQ446Bk13obgri329Bx2IA4nGl/3jWMeaBbeLLFnwVhIQsCQcqGaxzpS4P+U9fltazfpMzVWB0AgaAXCJB8u1UQwjfx1+NPyhrLLNn97ih+UWsMw9S2rjDnx5Xe76mcUXk18awZpy3x0QAam5skMcIo++FQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783841799; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=3d7+AQBOckCogNqitVCME0hJXM1uPGC9NuUOwuG1R80=; b=kUlnUxFtnJhAtSu8bRSYVg7z8mlA4kyIakiSs8GDcjYequPV13x2g7uZd4AKsfKEdjjlYe8y7YfnGH0Vffak4V6espdWYxopujSmVDteYtbbBsL9VMw94fkaitFTI0/UTdQrSnd6p9vogmCu7KFwsxxqRS7p6KxZArf1uegAqrM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1783841799784285.11285985632196; Sun, 12 Jul 2026 00:36:39 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 17D0C41CA5; Sun, 12 Jul 2026 03:36:38 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id AF88F41C97; Sun, 12 Jul 2026 03:33:22 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id C5B673F943; Sun, 12 Jul 2026 03:32:51 -0400 (EDT) Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 69FA73F969 for ; Sun, 12 Jul 2026 03:32:46 -0400 (EDT) Received: by mail-ed1-x535.google.com with SMTP id 4fb4d7f45d1cf-699fbcd23ccso3100178a12.1 for ; Sun, 12 Jul 2026 00:32:46 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-ee82-4536-a8f2-9e22.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:ee82:4536:a8f2:9e22]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-69a19cd8904sm13245978a12.2.2026.07.12.00.32.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Jul 2026 00:32:44 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783841565; x=1784446365; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=3d7+AQBOckCogNqitVCME0hJXM1uPGC9NuUOwuG1R80=; b=dOeEPdGwHHj5kWgypwBm0rY8SxCkUBOj1kL3TYuox6W/atUJASkCKqf0mGbCXEaLOW VYGEfbsfUQwUgOWFQv8m1ctNlwyaVPU0BW828tspE/dlGcYqzrZNX8r0xlwe1FRZl8Ao m1Cl73XPOhdjJuEOVIW3UvEvxVamYh/6i2m3nr4ba8u1UI7/tknmojF3k/M2Vi5Fachc qmg5FfQCkSvoA9vv2ikF2XD1dSHiAqco9alFuFJPeunmUOZHSdmBtT8gnLAv0ekmGIsh sLhUb3AxxudR/qCy6c08bHp6YjHP0bDn8tUJqjEgyBhfQmJrdhk9M61I79ZP8y263NjL Q7fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783841565; x=1784446365; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=3d7+AQBOckCogNqitVCME0hJXM1uPGC9NuUOwuG1R80=; b=W3xT/hR5Xl0S4s7/iQC4+TbL0ulfabw8Pmh5M5I2mBz0BsBpNHXthiXPovFV8o7OAw GxvVLfyH4o9E02FuE+V5KPuSkh+x66oq6Rd4p0C4c9A+HEhc/Z99nBHqcJBg7zAgjTt9 iRQoQMd+JJpsb54F/R0YzAg97aZNqaKuyUhuihXtiP7Hb5TUGbDiQsSGVRUCwrlaPfhS jntcYl6THEjU2FATSK1aKcfdV8+UP9aq0VZFswGYUWM/6zk6OlDgw2EMFs1yvGdA0e6V jtN6K7CUedGjQSkntCsTCDGaU81xFd+IV/ep36wGhtwOWUw1TsKhvsEGv+rw1yjo3fae 63LA== X-Gm-Message-State: AOJu0Ywb4eJ3Y9Gqtf1Rz61G1YzBw6/v/RyscF8kgLifkW20YZnp4S6t UKfcXfOOn8sF/jX2kbUn017VfI8Gb14y66XTN3wc0CGyrit3jP00G8872F4T4NU4 X-Gm-Gg: AfdE7clBhy0VZe67TZAvIxH0hGNOAPnEbzzESaEUnCE4NbJ/aLxZ6e0ar0p1bUb210Y HX0EH4ywqMu4Bck0jZobCJcFkNjrGUXdi+AvLVZuy2ny+ihD4Bj0G6E9tzJ8xGb1BikBxqxEG0P iy0t9GvguFxDA16OnE4ZdzwVXN/ZbAUxrvaXtdETUp/899JfKoPvurAlaT2lukcuF2Ifpk86hOP qUebeWAIU1Bn/5IK2aEQFg0WEhWH3cqqSY+dkuzS+fLEu5tYOU1oE/AzXBfTSabbEWyJKczlBrI jtua8nM6R1PXIuMTN27cVciK9Bt/IRqa4eOZ5lP+Eznm5y4R+DxpgdbuDbmAIslz09IZKRNPOUg gPrNCU4zzGgKv15VaNKedEaKQltqAJuMD2DKQvBz/8eylKU2zUEqQDbiybEv6CjzFVFtlQzIKvb m0H7M5k3ois80urBHXW3PKfn7+182ghM3cRmSU2zgcMCiGKQouLIWgq5WS+ZteaNtvDLFPetZ2Y pnKlJ4eN7WeJ2jNa82uNyREILk= X-Received: by 2002:a05:6402:40cb:b0:698:e614:e4bf with SMTP id 4fb4d7f45d1cf-69c5edb6a92mr2017142a12.0.1783841564848; Sun, 12 Jul 2026 00:32:44 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH 2/3] bhyve: improve domain startup error handling Date: Sun, 12 Jul 2026 09:32:30 +0200 Message-ID: <20260712073231.6404-3-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260712073231.6404-1-bogorodskiy@gmail.com> References: <20260712073231.6404-1-bogorodskiy@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: V7ZX23XTIW2CSY3LGPA4QAR6IBWSLSSE X-Message-ID-Hash: V7ZX23XTIW2CSY3LGPA4QAR6IBWSLSSE X-MailFrom: bogorodskiy@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Roman Bogorodskiy X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1783841800443158500 Content-Type: text/plain; charset="utf-8" Current cleanup routine for the domain start errors misses quite a few important steps. It does not set the proper domain state, it does not clean up sockets and so forth. The only thing it does is destroying of the actual domain and performing network cleanup. To properly clean all resources, replace running virBhyveProcessBuildDestroyCmd() command with executing virBhyveProcessStop() which already does the necessary steps. Extend virBhyveProcessStop() with the forceCleanup boolean argument which instructs it not to error out on some checks to account for inconsistent state after the partial startup. Signed-off-by: Roman Bogorodskiy Reviewed-by: Peter Krempa --- src/bhyve/bhyve_driver.c | 2 +- src/bhyve/bhyve_monitor.c | 6 ++-- src/bhyve/bhyve_process.c | 68 ++++++++++++++++++++++++--------------- src/bhyve/bhyve_process.h | 3 +- 4 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 668e46ad37..a0d97d3f86 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1019,7 +1019,7 @@ bhyveDomainDestroyFlags(virDomainPtr dom, unsigned in= t flags) if (virDomainObjCheckActive(vm) < 0) goto cleanup; =20 - ret =3D virBhyveProcessStop(privconn, vm, VIR_DOMAIN_SHUTOFF_DESTROYED= ); + ret =3D virBhyveProcessStop(privconn, vm, VIR_DOMAIN_SHUTOFF_DESTROYED= , false); event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DES= TROYED); diff --git a/src/bhyve/bhyve_monitor.c b/src/bhyve/bhyve_monitor.c index 8cf4b41ca3..a24696cad5 100644 --- a/src/bhyve/bhyve_monitor.c +++ b/src/bhyve/bhyve_monitor.c @@ -153,7 +153,7 @@ bhyveMonitorIO(int watch, int kq, int events G_GNUC_UNU= SED, void *opaque) virReportError(VIR_ERR_INTERNAL_ERROR, _("Guest %1$s got signal %2$d and crashed"), name, WTERMSIG(status)); - virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED); + virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED, fa= lse); } else if (WIFEXITED(status)) { if (WEXITSTATUS(status) =3D=3D 0 || mon->reboot) { /* 0 - reboot */ @@ -162,11 +162,11 @@ bhyveMonitorIO(int watch, int kq, int events G_GNUC_U= NUSED, void *opaque) } else if (WEXITSTATUS(status) < 3) { /* 1 - shutdown, 2 - halt, 3 - triple fault. others - erro= r */ VIR_INFO("Guest %s shut itself down; destroying domain.", = name); - virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOW= N); + virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOW= N, false); } else { VIR_INFO("Guest %s had an error and exited with status %d;= destroying domain.", name, WEXITSTATUS(status)); - virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN= ); + virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN= , false); } } } diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 4d93ba8fac..d501aa8bcc 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -66,7 +66,7 @@ bhyveProcessAutoDestroy(virDomainObj *vm, bhyveDomainObjPrivate *priv =3D vm->privateData; struct _bhyveConn *driver =3D priv->driver; =20 - virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED); + virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED, false); =20 if (!vm->persistent) virDomainObjListRemove(driver->domains, vm); @@ -437,18 +437,9 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver, devmap_file); } =20 - if (ret < 0) { - int exitstatus; /* Needed to avoid logging non-zero status */ - g_autoptr(virCommand) destroy_cmd =3D NULL; - if ((destroy_cmd =3D virBhyveProcessBuildDestroyCmd(driver, - vm->def)) !=3D N= ULL) { - virCommandSetOutputFD(load_cmd, &logfd); - virCommandSetErrorFD(load_cmd, &logfd); - ignore_value(virCommandRun(destroy_cmd, &exitstatus)); - } - - bhyveNetCleanup(vm); - } + if (ret < 0) + ignore_value(virBhyveProcessStop(driver, vm, + VIR_DOMAIN_SHUTOFF_FAILED, true)); =20 return ret; } @@ -634,26 +625,49 @@ bhyveProcessRemoveDomainStatus(const char *statusDir, } } =20 +/** + * @driver: bhyve driver + * @vm: domain object + * @reason: shutoff reason + * @forceCleanup: boolean controlling cleanup + * + * Stops the domain and cleans up its resources. + * It could be used whether as a direct call or as a cleanup routine. + * In the latter case, @forceCleanup should be set to `true`, so it + * tries to clean up all resources instead of exiting early if the domain + * is not active for example. + * + * Does not run the shutdown hooks if the domain PID was not obtained. + * + * Returns 0 on success, -1 on error. + */ int virBhyveProcessStop(struct _bhyveConn *driver, virDomainObj *vm, - virDomainShutoffReason reason) + virDomainShutoffReason reason, + bool forceCleanup) { int ret =3D 0; size_t i =3D 0; g_autoptr(virCommand) cmd =3D NULL; bhyveDomainObjPrivate *priv =3D vm->privateData; + bool vm_started =3D false; =20 - if (!virDomainObjIsActive(vm)) { - VIR_DEBUG("VM '%s' not active", vm->def->name); - return 0; - } + if (vm->pid !=3D 0) + vm_started =3D true; =20 - if (vm->pid =3D=3D 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Invalid PID %1$d for VM"), - (int)vm->pid); - return -1; + if (!forceCleanup) { + if (!virDomainObjIsActive(vm)) { + VIR_DEBUG("VM '%s' not active", vm->def->name); + return 0; + } + + if (!vm_started) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid PID %1$d for VM"), + (int)vm->pid); + return -1; + } } =20 /* Destroy monitor before running the actual destroy command to prevent @@ -669,7 +683,8 @@ virBhyveProcessStop(struct _bhyveConn *driver, VIR_WARN("Failed to run the domain destroy command"); } =20 - bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_STOPPED); + if (vm_started) + bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_STOPPED); =20 /* Cleanup network interfaces */ bhyveNetCleanup(vm); @@ -702,7 +717,8 @@ virBhyveProcessStop(struct _bhyveConn *driver, vm->pid =3D 0; vm->def->id =3D -1; =20 - bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_RELEASE); + if (vm_started) + bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_RELEASE); virPidFileDelete(BHYVE_STATE_DIR, vm->def->name); bhyveProcessRemoveDomainStatus(BHYVE_STATE_DIR, vm->def->name); =20 @@ -736,7 +752,7 @@ int virBhyveProcessRestart(struct _bhyveConn *driver, virDomainObj *vm) { - if (virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN) < 0) + if (virBhyveProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN, false= ) < 0) return -1; =20 if (virBhyveProcessStartImpl(driver, vm, VIR_DOMAIN_RUNNING_BOOTED) < = 0) diff --git a/src/bhyve/bhyve_process.h b/src/bhyve/bhyve_process.h index bf82f748a6..339e5d429a 100644 --- a/src/bhyve/bhyve_process.h +++ b/src/bhyve/bhyve_process.h @@ -44,7 +44,8 @@ int virBhyveProcessStart(bhyveConn *driver, =20 int virBhyveProcessStop(struct _bhyveConn *driver, virDomainObj *vm, - virDomainShutoffReason reason); + virDomainShutoffReason reason, + bool forceCleanup); =20 int virBhyveProcessRestart(struct _bhyveConn *driver, virDomainObj *vm); --=20 2.52.0