On 2017/2/25 9:41, 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; > } > > ...... > ......
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list