[Adding the correct mailing list, removing libvirt-list-owner]

On Fri, Feb 24, 2017 at 05:35:31PM +0800, WangJie (Captain) wrote:
> Hello, I got a question here. When we create consistent active external 
> snapshots with flag “VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE” , the 
> qemuDomainSnapshotFSFreeze will be called firstly to freeze all filesystems 
> in vm, and then create snapshots. For windows vm, freezing filesystems used 
> by vss service. If IO pressure in vm is too big or internal error happened in 
> vss , freezing filesytems will failed , and qemuDomainSnapshotFSFreeze 
> returns 0 which meaning that no filesystems are frozen. In the function 
> qemuDomainSnapshotCreateActiveExternal, libvirt creates external snapshots 
> all the same in such a situation that qemuDomainSnapshotFSFreeze returns 0, 
> but the created snapshots are not consistent snapshots in such a situation . 
> So shouldn't we abandon creating snapshots and goto cleanup in the situation 
> that qemuDomainSnapshotFSFreeze returns 0?
> 
> 
> The code below:
> 
> 
> static int
> qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
>                                        virQEMUDriverPtr driver,
>                                        virDomainObjPtr vm,
>                                        virDomainSnapshotObjPtr snap,
>                                        unsigned int flags)
> {
>     virObjectEventPtr event;
>     bool resume = false;
>     int ret = -1;
>     qemuDomainObjPrivatePtr priv = vm->privateData;
>     char *xml = NULL;
>     bool memory = snap->def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
>     bool memory_unlink = false;
>     bool atomic = !!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC);
>     bool transaction = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_TRANSACTION);
>     int thaw = 0; /* 1 if freeze succeeded, -1 if freeze failed */
>     bool pmsuspended = false;
>     virQEMUDriverConfigPtr cfg = NULL;
>     int compressed;
>     char *compressedpath = NULL;
> 
>     /* If quiesce was requested, then issue a freeze command, and a
>      * counterpart thaw command when it is actually sent to agent.
>      * The command will fail if the guest is paused or the guest agent
>      * is not running, or is already quiesced.  */
>     if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE) {
>         int freeze = qemuDomainSnapshotFSFreeze(driver, vm, NULL, 0);
>         if (freeze < 0) {
>             /* the helper reported the error */
>             if (freeze == -2)
>                 thaw = -1; /* the command is sent but agent failed */
>             goto cleanup;
>         }
>         thaw = 1;
>     }
>     
>     ......
>     ......

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to