]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: snapshot: Introduce 'manual' mode for snapshot of a disk
authorPeter Krempa <pkrempa@redhat.com>
Fri, 4 Mar 2022 14:50:19 +0000 (15:50 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 22 Mar 2022 09:32:43 +0000 (10:32 +0100)
The idea of the manual mode is to allow a synchronized snapshot in cases
when the storage is outsourced to an unmanaged storage provider which
requires cooperation with snapshotting.

The mode will instruct the hypervisor to pause along when the other
components are snapshotted and the 'manual' disk can be snapshotted
along. This increases latency of the snapshot but allows them in
otherwise impossible situations.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
docs/formatdomain.rst
docs/formatsnapshot.rst
docs/schemas/domainsnapshot.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/snapshot_conf.c
src/qemu/qemu_snapshot.c
src/test/test_driver.c

index 9b1b69bb4d0b28fb70b88880156aefa2f67631b1..d188de4858e78fe876ec6f72b27766bf8bc7bc8e 100644 (file)
@@ -2620,13 +2620,14 @@ paravirtualized driver is specified via the ``disk`` element.
       Indicates the default behavior of the disk during disk snapshots:
       "``internal``" requires a file format such as qcow2 that can store both
       the snapshot and the data changes since the snapshot; "``external``" will
-      separate the snapshot from the live data; and "``no``" means the disk will
-      not participate in snapshots. Read-only disks default to "``no``", while
-      the default for other disks depends on the hypervisor's capabilities. Some
-      hypervisors allow a per-snapshot choice as well, during `domain snapshot
-      creation <formatsnapshot.html>`__. Not all snapshot modes are supported;
-      for example, enabling snapshots with a transient disk generally does not
-      make sense. :since:`Since 0.9.5`
+      separate the snapshot from the live data; "``no``" means the disk will
+      not participate in snapshots; and ``manual`` allows snapshotting done via
+      an unmanaged storage provider. Read-only disks default to "``no``", while
+      the default for other disks depends on the hypervisor's capabilities.
+      Some hypervisors allow a per-snapshot choice as well, during `domain
+      snapshot creation <formatsnapshot.html>`__. Not all snapshot modes are
+      supported; for example, enabling snapshots with a transient disk
+      generally does not make sense. :since:`Since 0.9.5`
 
 ``source``
    Representation of the disk ``source`` depends on the disk ``type`` attribute
index 0fee35d89c5a6ef1ad086eafd9e7a7f28780bb6e..9b874e48902a1bde1213870c0bb7a6a487e6f99c 100644 (file)
@@ -124,6 +124,15 @@ The top-level ``domainsnapshot`` element may contain the following elements:
       corresponding domain disk, while others like qemu allow this field to
       override the domain default.
 
+      :since:`Since 8.2.0` the ``snapshot`` attribute supports the ``manual``
+      value which instructs the hypervisor to create the snapshot and keep a
+      synchronized state by pausing the VM which allows to snapshot disk
+      storage from outside of the hypervisor if the storage provider supports
+      it.  The caller is responsible for resuming a VM paused by requesting a
+      ``manual`` snapshot. When reverting such snapshot, the expectation is that
+      the storage is configured in a way where the hypervisor will see the
+      correct image state.
+
       :since:`Since 1.2.2` the ``disk`` element supports an optional attribute
       ``type`` if the ``snapshot`` attribute is set to ``external``. This
       attribute specifies the snapshot target storage type and allows to
index 58c370878da6ef82c4e7cdb92da43217e7d141d0..a5d1a40493b57bbce1bdf8536d6750056f252d6c 100644 (file)
             <ref name="diskSourceNetwork"/>
           </choice>
         </group>
+        <attribute name="snapshot">
+          <value>manual</value>
+        </attribute>
       </choice>
     </element>
   </define>
index e0dfc9e45f09fe0d0ebef22cd5ccb637369ac131..153954a0b0f183a9325b18b1575164b67638e766 100644 (file)
@@ -1408,6 +1408,7 @@ VIR_ENUM_IMPL(virDomainSnapshotLocation,
               "no",
               "internal",
               "external",
+              "manual",
 );
 
 /* Internal mapping: subset of block job types that can be present in
index a4de46773c231554cf4818fe377660c080487ba0..b69abfa270b7c781716f5d29f50aebe932ce5127 100644 (file)
@@ -542,6 +542,7 @@ typedef enum {
     VIR_DOMAIN_SNAPSHOT_LOCATION_NO,
     VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL,
     VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL,
+    VIR_DOMAIN_SNAPSHOT_LOCATION_MANUAL,
 
     VIR_DOMAIN_SNAPSHOT_LOCATION_LAST
 } virDomainSnapshotLocation;
index e2442441d09bafff36a5815c406a9cda874f258d..80946beba973603e97262e83e39078db92d8b05c 100644 (file)
@@ -312,6 +312,12 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
                                   &def->memory,
                                   VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT) < 0)
             return NULL;
+
+        if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_MANUAL) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("'manual' memory snapshot mode not supported"));
+            return NULL;
+        }
     }
 
     if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT) {
index 6eebe69919da77102614e9015b79f4c9e4accfae..df808eef83b8086e09ee3edd3e04225875682663 100644 (file)
@@ -757,6 +757,11 @@ qemuSnapshotPrepare(virDomainObj *vm,
             external++;
             break;
 
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_MANUAL:
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("'manual' disk snapshot mode not yet implemented"));
+            return -1;
+
         case VIR_DOMAIN_SNAPSHOT_LOCATION_NO:
             /* Remember seeing a disk that has snapshot disabled */
             if (!virStorageSourceIsEmpty(dom_disk->src) &&
index d9b4d2edf93f88d8d7a1f96252a78f7f07603aa6..a824ef0186e518844f99a737a434e917552883dc 100644 (file)
@@ -8710,6 +8710,23 @@ testDomainSnapshotAlignDisks(virDomainObj *vm,
                              unsigned int flags)
 {
     virDomainSnapshotLocation align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL;
+    size_t i;
+
+    for (i = 0; i < def->ndisks; i++) {
+        switch (def->disks[i].snapshot) {
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT:
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_NO:
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL:
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL:
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_LAST:
+            break;
+
+        case VIR_DOMAIN_SNAPSHOT_LOCATION_MANUAL:
+            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                           _("'manual' snapshot mode is not supported by the test driver"));
+            return -1;
+        }
+    }
 
     if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) {
         align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;