]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Introduce VIR_DOMAIN_PAUSED_API_ERROR
authorJiri Denemark <jdenemar@redhat.com>
Tue, 28 Feb 2023 15:53:29 +0000 (16:53 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 15 Mar 2023 09:52:14 +0000 (10:52 +0100)
Some APIs (migration, save/restore, snapshot, ...) require a domain to
be suspended temporarily. In case resuming the domain fails, the domain
will be unexpectedly left paused when the API finishes. This situation
is reported via VIR_DOMAIN_EVENT_SUSPENDED event with
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR detail. But we do not have a
corresponding reason for VIR_DOMAIN_PAUSED state and the reason would
remain set to the value used when the domain was paused. So the state
reason would suggest the operation is still running.

This patch changes the state reason to a new VIR_DOMAIN_PAUSED_API_ERROR
to make it clear the API that paused the domain already finished, but
failed to resume the domain.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
include/libvirt/libvirt-domain.h
src/conf/domain_conf.c
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c
src/qemu/qemu_snapshot.c
tools/virsh-domain-monitor.c

index 53cab6bd4cba8e293390c90aa8da35b890f7711c..3ebb2c66422940800f98b671671dcd2917e74f00 100644 (file)
@@ -148,6 +148,7 @@ typedef enum {
     VIR_DOMAIN_PAUSED_STARTING_UP = 11, /* the domain is being started (Since: 1.2.14) */
     VIR_DOMAIN_PAUSED_POSTCOPY = 12,    /* paused for post-copy migration (Since: 1.3.3) */
     VIR_DOMAIN_PAUSED_POSTCOPY_FAILED = 13, /* paused after failed post-copy (Since: 1.3.3) */
+    VIR_DOMAIN_PAUSED_API_ERROR = 14,   /* Some APIs (e.g., migration, snapshot) internally need to suspend a domain. This paused state reason is used when resume operation at the end of such API fails. (Since: 9.2.0) */
 
 # ifdef VIR_ENUM_SENTINELS
     VIR_DOMAIN_PAUSED_LAST /* (Since: 0.9.10) */
index 783d3a5fff8189e68646b7cc27d978fe91ea0c45..9ef50c818b3ecf5e498f21c080fd49f313206481 100644 (file)
@@ -1163,6 +1163,7 @@ VIR_ENUM_IMPL(virDomainPausedReason,
               "starting up",
               "post-copy",
               "post-copy failed",
+              "api error",
 );
 
 VIR_ENUM_IMPL(virDomainShutdownReason,
index 0feab09bee831e2fd1ed19fc2f2c773d1b68ab2f..72940efefb89af3bd8da9ddc4a38f368b71dfb0c 100644 (file)
@@ -11376,6 +11376,9 @@ qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason reason)
     case VIR_DOMAIN_PAUSED_POSTCOPY:
         return VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY;
 
+    case VIR_DOMAIN_PAUSED_API_ERROR:
+        return VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR;
+
     case VIR_DOMAIN_PAUSED_UNKNOWN:
     case VIR_DOMAIN_PAUSED_USER:
     case VIR_DOMAIN_PAUSED_SAVE:
index fd8136be375e12828c7b7c5675fd5b61522652c2..b900015dcf9414c421e7ce6b38e853e7bbcee332 100644 (file)
@@ -2727,6 +2727,10 @@ qemuDomainSaveInternal(virQEMUDriver *driver,
                                      virDomainEventLifecycleNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_SUSPENDED,
                                          VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR));
+                if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
+                    virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
+                                         VIR_DOMAIN_PAUSED_API_ERROR);
+                }
             }
             virErrorRestore(&save_err);
         }
@@ -3254,6 +3258,10 @@ qemuDomainCoreDumpWithFormat(virDomainPtr dom,
                 event = virDomainEventLifecycleNewFromObj(vm,
                                                           VIR_DOMAIN_EVENT_SUSPENDED,
                                                           VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
+                if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
+                    virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
+                                         VIR_DOMAIN_PAUSED_API_ERROR);
+                }
                 if (virGetLastErrorCode() == VIR_ERR_OK)
                     virReportError(VIR_ERR_OPERATION_FAILED,
                                    "%s", _("resuming after dump failed"));
index 7aa4195f04d0a152656141fe40647a90b38dec05..14353c6f0de1b8489511e4576ca5254e03f0f182 100644 (file)
@@ -326,6 +326,10 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
         event = virDomainEventLifecycleNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_SUSPENDED,
                                          VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
+        if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
+            virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
+                                 VIR_DOMAIN_PAUSED_API_ERROR);
+        }
         if (virGetLastErrorCode() == VIR_ERR_OK) {
             virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                            _("resuming after snapshot failed"));
@@ -1398,6 +1402,10 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver,
                                          VIR_DOMAIN_EVENT_SUSPENDED,
                                          VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
         virObjectEventStateQueue(driver->domainEventState, event);
+        if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
+            virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
+                                 VIR_DOMAIN_PAUSED_API_ERROR);
+        }
         if (virGetLastErrorCode() == VIR_ERR_OK) {
             virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                            _("resuming after snapshot failed"));
index c2134faba1de353d134cab3639b8375401172bc6..bdade8f25139a803974a3b243c77cdbdf63bc671 100644 (file)
@@ -192,6 +192,7 @@ VIR_ENUM_IMPL(virshDomainPausedReason,
               N_("starting up"),
               N_("post-copy"),
               N_("post-copy failed"),
+              N_("api error"),
 );
 
 VIR_ENUM_DECL(virshDomainShutdownReason);