mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 09:14:57 +00:00
snapshot: fine-tune ability to start paused
While it is nice that snapshots and saved images remember whether the domain was running or paused, sometimes the restoration phase wants to guarantee a particular state (paused to allow hot-plugging, or running without needing to call resume). This introduces new flags to allow the control, and a later patch will implement the flags for qemu. * include/libvirt/libvirt.h.in (VIR_DOMAIN_SAVE_RUNNING) (VIR_DOMAIN_SAVE_PAUSED, VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) (VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED): New flags. * src/libvirt.c (virDomainSaveFlags, virDomainRestoreFlags) (virDomainManagedSave, virDomainSaveImageDefineXML) (virDomainRevertToSnapshot): Document their use, and enforce mutual exclusion.
This commit is contained in:
parent
c1ff5dc63d
commit
3cff66f487
@ -960,11 +960,14 @@ int virDomainResume (virDomainPtr domain);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* virDomainSaveRestoreFlags:
|
* virDomainSaveRestoreFlags:
|
||||||
* Flags for use in virDomainSaveFlags(), virDomainManagedSave(), and
|
* Flags for use in virDomainSaveFlags(), virDomainManagedSave(),
|
||||||
* virDomainRestoreFlags().
|
* virDomainRestoreFlags(), and virDomainSaveImageDefineXML(). Not all
|
||||||
|
* flags apply to all these functions.
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
VIR_DOMAIN_SAVE_BYPASS_CACHE = 1 << 0, /* Avoid file system cache pollution */
|
VIR_DOMAIN_SAVE_BYPASS_CACHE = 1 << 0, /* Avoid file system cache pollution */
|
||||||
|
VIR_DOMAIN_SAVE_RUNNING = 1 << 1, /* Favor running over paused */
|
||||||
|
VIR_DOMAIN_SAVE_PAUSED = 1 << 2, /* Favor paused over running */
|
||||||
} virDomainSaveRestoreFlags;
|
} virDomainSaveRestoreFlags;
|
||||||
|
|
||||||
int virDomainSave (virDomainPtr domain,
|
int virDomainSave (virDomainPtr domain,
|
||||||
@ -2579,6 +2582,11 @@ int virDomainHasCurrentSnapshot(virDomainPtr domain, unsigned int flags);
|
|||||||
virDomainSnapshotPtr virDomainSnapshotCurrent(virDomainPtr domain,
|
virDomainSnapshotPtr virDomainSnapshotCurrent(virDomainPtr domain,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING = 1 << 0, /* Run after revert */
|
||||||
|
VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED = 1 << 1, /* Pause after revert */
|
||||||
|
} virDomainSnapshotRevertFlags;
|
||||||
|
|
||||||
/* Revert the domain to a point-in-time snapshot. The
|
/* Revert the domain to a point-in-time snapshot. The
|
||||||
* state of the guest after this call will be the state
|
* state of the guest after this call will be the state
|
||||||
* of the guest when the snapshot in question was taken
|
* of the guest when the snapshot in question was taken
|
||||||
|
@ -2310,7 +2310,7 @@ error:
|
|||||||
*
|
*
|
||||||
* This method will suspend a domain and save its memory contents to
|
* This method will suspend a domain and save its memory contents to
|
||||||
* a file on disk. After the call, if successful, the domain is not
|
* a file on disk. After the call, if successful, the domain is not
|
||||||
* listed as running anymore (this may be a problem).
|
* listed as running anymore (this ends the life of a transient domain).
|
||||||
* Use virDomainRestore() to restore a domain after saving.
|
* Use virDomainRestore() to restore a domain after saving.
|
||||||
*
|
*
|
||||||
* See virDomainSaveFlags() for more control. Also, a save file can
|
* See virDomainSaveFlags() for more control. Also, a save file can
|
||||||
@ -2379,7 +2379,7 @@ error:
|
|||||||
*
|
*
|
||||||
* This method will suspend a domain and save its memory contents to
|
* This method will suspend a domain and save its memory contents to
|
||||||
* a file on disk. After the call, if successful, the domain is not
|
* a file on disk. After the call, if successful, the domain is not
|
||||||
* listed as running anymore (this may be a problem).
|
* listed as running anymore (this ends the life of a transient domain).
|
||||||
* Use virDomainRestore() to restore a domain after saving.
|
* Use virDomainRestore() to restore a domain after saving.
|
||||||
*
|
*
|
||||||
* If the hypervisor supports it, @dxml can be used to alter
|
* If the hypervisor supports it, @dxml can be used to alter
|
||||||
@ -2394,6 +2394,12 @@ error:
|
|||||||
* fail if it cannot do so for the given system; this can allow less
|
* fail if it cannot do so for the given system; this can allow less
|
||||||
* pressure on file system cache, but also risks slowing saves to NFS.
|
* pressure on file system cache, but also risks slowing saves to NFS.
|
||||||
*
|
*
|
||||||
|
* Normally, the saved state file will remember whether the domain was
|
||||||
|
* running or paused, and restore defaults to the same state.
|
||||||
|
* Specifying VIR_DOMAIN_SAVE_RUNNING or VIR_DOMAIN_SAVE_PAUSED in
|
||||||
|
* @flags will override what state gets saved into the file. These
|
||||||
|
* two flags are mutually exclusive.
|
||||||
|
*
|
||||||
* A save file can be inspected or modified slightly with
|
* A save file can be inspected or modified slightly with
|
||||||
* virDomainSaveImageGetXMLDesc() and virDomainSaveImageDefineXML().
|
* virDomainSaveImageGetXMLDesc() and virDomainSaveImageDefineXML().
|
||||||
*
|
*
|
||||||
@ -2425,6 +2431,12 @@ virDomainSaveFlags(virDomainPtr domain, const char *to,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
|
||||||
|
virLibDomainError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("running and paused flags are mutually exclusive"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainSaveFlags) {
|
if (conn->driver->domainSaveFlags) {
|
||||||
int ret;
|
int ret;
|
||||||
char *absolute_to;
|
char *absolute_to;
|
||||||
@ -2532,6 +2544,12 @@ error:
|
|||||||
* fail if it cannot do so for the given system; this can allow less
|
* fail if it cannot do so for the given system; this can allow less
|
||||||
* pressure on file system cache, but also risks slowing saves to NFS.
|
* pressure on file system cache, but also risks slowing saves to NFS.
|
||||||
*
|
*
|
||||||
|
* Normally, the saved state file will remember whether the domain was
|
||||||
|
* running or paused, and restore defaults to the same state.
|
||||||
|
* Specifying VIR_DOMAIN_SAVE_RUNNING or VIR_DOMAIN_SAVE_PAUSED in
|
||||||
|
* @flags will override the default read from the file. These two
|
||||||
|
* flags are mutually exclusive.
|
||||||
|
*
|
||||||
* Returns 0 in case of success and -1 in case of failure.
|
* Returns 0 in case of success and -1 in case of failure.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@ -2557,6 +2575,12 @@ virDomainRestoreFlags(virConnectPtr conn, const char *from, const char *dxml,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
|
||||||
|
virLibDomainError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("running and paused flags are mutually exclusive"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainRestoreFlags) {
|
if (conn->driver->domainRestoreFlags) {
|
||||||
int ret;
|
int ret;
|
||||||
char *absolute_from;
|
char *absolute_from;
|
||||||
@ -2661,7 +2685,7 @@ error:
|
|||||||
* @conn: pointer to the hypervisor connection
|
* @conn: pointer to the hypervisor connection
|
||||||
* @file: path to saved state file
|
* @file: path to saved state file
|
||||||
* @dxml: XML config for adjusting guest xml used on restore
|
* @dxml: XML config for adjusting guest xml used on restore
|
||||||
* @flags: 0 for now
|
* @flags: bitwise-OR of virDomainSaveRestoreFlags
|
||||||
*
|
*
|
||||||
* This updates the definition of a domain stored in a saved state
|
* This updates the definition of a domain stored in a saved state
|
||||||
* file. @file must be a file created previously by virDomainSave()
|
* file. @file must be a file created previously by virDomainSave()
|
||||||
@ -2673,6 +2697,13 @@ error:
|
|||||||
* disk device, to match renaming done as part of backing up the disk
|
* disk device, to match renaming done as part of backing up the disk
|
||||||
* device while the domain is stopped.
|
* device while the domain is stopped.
|
||||||
*
|
*
|
||||||
|
* Normally, the saved state file will remember whether the domain was
|
||||||
|
* running or paused, and restore defaults to the same state.
|
||||||
|
* Specifying VIR_DOMAIN_SAVE_RUNNING or VIR_DOMAIN_SAVE_PAUSED in
|
||||||
|
* @flags will override the default saved into the file; omitting both
|
||||||
|
* leaves the file's default unchanged. These two flags are mutually
|
||||||
|
* exclusive.
|
||||||
|
*
|
||||||
* Returns 0 in case of success and -1 in case of failure.
|
* Returns 0 in case of success and -1 in case of failure.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@ -2698,6 +2729,12 @@ virDomainSaveImageDefineXML(virConnectPtr conn, const char *file,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
|
||||||
|
virLibDomainError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("running and paused flags are mutually exclusive"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainSaveImageDefineXML) {
|
if (conn->driver->domainSaveImageDefineXML) {
|
||||||
int ret;
|
int ret;
|
||||||
char *absolute_file;
|
char *absolute_file;
|
||||||
@ -7018,7 +7055,9 @@ error:
|
|||||||
* @domain: pointer to a defined domain
|
* @domain: pointer to a defined domain
|
||||||
*
|
*
|
||||||
* Launch a defined domain. If the call succeeds the domain moves from the
|
* Launch a defined domain. If the call succeeds the domain moves from the
|
||||||
* defined to the running domains pools.
|
* defined to the running domains pools. The domain will be paused only
|
||||||
|
* if restoring from managed state created from a paused domain. For more
|
||||||
|
* control, see virDomainCreateWithFlags().
|
||||||
*
|
*
|
||||||
* Returns 0 in case of success, -1 in case of error
|
* Returns 0 in case of success, -1 in case of error
|
||||||
*/
|
*/
|
||||||
@ -7064,9 +7103,12 @@ error:
|
|||||||
* Launch a defined domain. If the call succeeds the domain moves from the
|
* Launch a defined domain. If the call succeeds the domain moves from the
|
||||||
* defined to the running domains pools.
|
* defined to the running domains pools.
|
||||||
*
|
*
|
||||||
* If the VIR_DOMAIN_START_PAUSED flag is set, the guest domain
|
* If the VIR_DOMAIN_START_PAUSED flag is set, or if the guest domain
|
||||||
* will be started, but its CPUs will remain paused. The CPUs
|
* has a managed save image that requested paused state (see
|
||||||
* can later be manually started using virDomainResume.
|
* virDomainManagedSave()) the guest domain will be started, but its
|
||||||
|
* CPUs will remain paused. The CPUs can later be manually started
|
||||||
|
* using virDomainResume(). In all other cases, the guest domain will
|
||||||
|
* be running.
|
||||||
*
|
*
|
||||||
* If the VIR_DOMAIN_START_AUTODESTROY flag is set, the guest
|
* If the VIR_DOMAIN_START_AUTODESTROY flag is set, the guest
|
||||||
* domain will be automatically destroyed when the virConnectPtr
|
* domain will be automatically destroyed when the virConnectPtr
|
||||||
@ -15391,6 +15433,12 @@ error:
|
|||||||
* fail if it cannot do so for the given system; this can allow less
|
* fail if it cannot do so for the given system; this can allow less
|
||||||
* pressure on file system cache, but also risks slowing saves to NFS.
|
* pressure on file system cache, but also risks slowing saves to NFS.
|
||||||
*
|
*
|
||||||
|
* Normally, the managed saved state will remember whether the domain
|
||||||
|
* was running or paused, and start will resume to the same state.
|
||||||
|
* Specifying VIR_DOMAIN_SAVE_RUNNING or VIR_DOMAIN_SAVE_PAUSED in
|
||||||
|
* @flags will override the default saved into the file. These two
|
||||||
|
* flags are mutually exclusive.
|
||||||
|
*
|
||||||
* Returns 0 in case of success or -1 in case of failure
|
* Returns 0 in case of success or -1 in case of failure
|
||||||
*/
|
*/
|
||||||
int virDomainManagedSave(virDomainPtr dom, unsigned int flags)
|
int virDomainManagedSave(virDomainPtr dom, unsigned int flags)
|
||||||
@ -15413,6 +15461,12 @@ int virDomainManagedSave(virDomainPtr dom, unsigned int flags)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flags & VIR_DOMAIN_SAVE_RUNNING) && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
|
||||||
|
virLibDomainError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("running and paused flags are mutually exclusive"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainManagedSave) {
|
if (conn->driver->domainManagedSave) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -15844,10 +15898,22 @@ error:
|
|||||||
/**
|
/**
|
||||||
* virDomainRevertToSnapshot:
|
* virDomainRevertToSnapshot:
|
||||||
* @snapshot: a domain snapshot object
|
* @snapshot: a domain snapshot object
|
||||||
* @flags: unused flag parameters; callers should pass 0
|
* @flags: bitwise-OR of virDomainSnapshotRevertFlags
|
||||||
*
|
*
|
||||||
* Revert the domain to a given snapshot.
|
* Revert the domain to a given snapshot.
|
||||||
*
|
*
|
||||||
|
* Normally, the domain will revert to the same state the domain was
|
||||||
|
* in while the snapshot was taken (whether inactive, running, or
|
||||||
|
* paused), except that disk snapshots default to reverting to
|
||||||
|
* inactive state. Including VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING in
|
||||||
|
* @flags overrides the snapshot state to guarantee a running domain
|
||||||
|
* after the revert; or including VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED in
|
||||||
|
* @flags guarantees a paused domain after the revert. These two
|
||||||
|
* flags are mutually exclusive. While a persistent domain does not
|
||||||
|
* need either flag, it is not possible to revert a transient domain
|
||||||
|
* into an inactive state, so transient domains require the use of one
|
||||||
|
* of these two flags.
|
||||||
|
*
|
||||||
* Returns 0 if the creation is successful, -1 on error.
|
* Returns 0 if the creation is successful, -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@ -15873,6 +15939,13 @@ virDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) &&
|
||||||
|
(flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
|
||||||
|
virLibDomainError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("running and paused flags are mutually exclusive"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (conn->driver->domainRevertToSnapshot) {
|
if (conn->driver->domainRevertToSnapshot) {
|
||||||
int ret = conn->driver->domainRevertToSnapshot(snapshot, flags);
|
int ret = conn->driver->domainRevertToSnapshot(snapshot, flags);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user