[libvirt] [PATCHv3 08/43] snapshot: avoid crash when deleting qemu snapshots

Daniel P. Berrange berrange at redhat.com
Wed Aug 24 16:38:41 UTC 2011


On Wed, Aug 24, 2011 at 09:22:25AM -0600, Eric Blake wrote:
> This one's nasty.  Ever since we fixed virHashForEach to prevent
> nested hash iterations for safety reasons, virDomainSnapshotDelete
> with VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN has been broken for qemu:
> it deletes children, while leaving grandchildren intact but pointing
> to a no-longer-present parent.  But even before then, the code would
> often appear to succeed to clean up grandchildren, but risked memory
> corruption if you have a large and deep hierarchy of snapshots.
> 
> For acting on just children, a single virHashForEach is sufficient.
> But for acting on an entire subtree, it requires iteration; and
> since we declared recursion as invalid, we have to switch to a
> while loop.  Doing this correctly requires quite a bit of overhaul,
> so I added a new helper function to isolate the algorithm from the
> actions, so that callers do not have to reinvent the iteration.
> 
> * src/conf/domain_conf.h (_virDomainSnapshotDef): Add mark.
> (virDomainSnapshotForEachDescendant): New prototype.
> * src/libvirt_private.syms (domain_conf.h): Export it.
> * src/conf/domain_conf.c (virDomainSnapshotMarkDescendant)
> (virDomainSnapshotActOnDescendant)
> (virDomainSnapshotForEachDescendant): New functions.
> * src/qemu/qemu_driver.c (qemuDomainSnapshotDiscardChildren):
> Replace...
> (qemuDomainSnapshotDiscardDescenent): ...with callback that
> doesn't nest hash traversal.
> (qemuDomainSnapshotDelete): Use new function.
> ---
>  src/conf/domain_conf.c   |  103 ++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_conf.h   |    8 +++-
>  src/libvirt_private.syms |    1 +
>  src/qemu/qemu_driver.c   |   35 ++++++----------
>  4 files changed, 124 insertions(+), 23 deletions(-)

Perhaps I'm mis-understanding what this patch is attempting to fix, but
after applying everything upto this point, I see the following behaviour
which does not appear correct

$ virsh list
 Id Name                 State
----------------------------------
  5 vm1                  running

$ virsh snapshot-list vm1
 Name                 Creation Time             State
---------------------------------------------------

$ virsh snapshot-create vm1
Domain snapshot 1314203761 created

$ virsh snapshot-create vm1
Domain snapshot 1314203763 created

$ virsh snapshot-create vm1
Domain snapshot 1314203767 created

$ virsh snapshot-create vm1
Domain snapshot 1314203777 created

$ virsh snapshot-create vm1
Domain snapshot 1314203781 created

$ virsh snapshot-list vm1
 Name                 Creation Time             State
---------------------------------------------------
 1314203761           2011-08-24 17:36:01 +0100 running
 1314203763           2011-08-24 17:36:03 +0100 running
 1314203767           2011-08-24 17:36:07 +0100 running
 1314203777           2011-08-24 17:36:17 +0100 running
 1314203781           2011-08-24 17:36:21 +0100 running

$ virsh snapshot-delete vm1 --children 1314203767
Domain snapshot 1314203767 deleted

$ virsh snapshot-list vm1
 Name                 Creation Time             State
---------------------------------------------------
 1314203761           2011-08-24 17:36:01 +0100 running
 1314203763           2011-08-24 17:36:03 +0100 running
 1314203781           2011-08-24 17:36:21 +0100 running


IIUC,  1314203781 should have been deleted.

I also still saw errors in libvirtd logs

17:36:36.175: 4423: info : libvirt version: 0.9.4
17:36:36.175: 4423: error : virHashSearch:604 : Hash operation not allowed during iteration
17:36:36.176: 4423: warning : virDomainSnapshotMarkDescendant:11309 : snapshot hash table is inconsistent!
17:36:36.176: 4423: error : virHashSearch:604 : Hash operation not allowed during iteration
17:36:36.176: 4423: warning : virDomainSnapshotMarkDescendant:11309 : snapshot hash table is inconsistent!
17:36:36.176: 4423: error : virHashSearch:604 : Hash operation not allowed during iteration
17:36:36.176: 4423: warning : virDomainSnapshotMarkDescendant:11309 : snapshot hash table is inconsistent!

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list