On 08/12/2011 08:33 AM, Eric Blake wrote:
On 08/11/2011 08:36 PM, Eric Blake wrote:
In implementing this in virsh, I found that for backwards compatibility
reasons, it would be easier to two flags instead of one, since both use
cases seem plausible (do the bare minimum to remove my domain, but
wihtout losing snapshot data, vs. nuke everything including my snapshot
data that was associated with the domain). Hence I'm modifying this
slightly to be:

VIR_DOMAIN_UNDEFINE_SNAPSHOTS_FULL -> maps to
virDomainSnapshotDelete(,0), can be emulated on older servers
VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA -> maps to
virDomainSnapshotDelete(,VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY),
cannot be simulated with server older than 0.9.5

And to make it easier to detect whether a domain has libvirt snapshot
metadata, I need to add:

virDomainSnapshotNum(,VIR_DOMAIN_SNAPSHOT_NUM_METADATA)

Other parts of this RFC talk about refusing to revert to a snapshot if any of its descendants are an external disk-snapshot. I'm thinking it would be nice to make it easier to expose a list of descendants of a given snapshot; this can be emulated at the application layer but can be much faster if done in libvirt. I have two approaches:

1. Reuse the existing API - right now, virDomainSnapshotList is output-only. Implementing this would involve making a new RPC, and special casing the remote code to call one of two different RPC's based on whether either of two new flags are present.

virDomainSnapshotList(domain, names, nameslen, 0) => names is output-only, nameslen is max array len on input, return value is actual return size or -1 on error, and use the old RPC to list all snapshots

virDomainSnapshotList(domain, names, nameslen, VIR_DOMAIN_SNAPSHOT_LIST_CHILDREN) => names is in/out: names[0] is the name of the parent snapshot to start listing from, or NULL to start listing from the current snapshot (if any), and output is the immediate children (if any) of the designated snapshot; nameslen is used the same, and pessimistically has to be set to virDomainSnapshotNum on input; use the new RPC to pass in a single name

virDomainSnapshotList(domain, names, nameslen, VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) => like LIST_CHILDREN in treatment of names[0] of where to start and use of new rpc, but result is transitive closure of all descendants rather than just direct children


2. Abandon any idea about back-porting this, and just add it for 0.9.5 and later by adding two new functions and one new flag:

int virDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags); int virDomainSnapshotListChildren(virDomainSnapshotPtr snapshot, char **names, int nameslen, unsigned int flags);

virDomainSnapshotNumChildren(snap, flags) is a much finer bound on the maximum array size needed by virDomainSnapshotListChildren with the same flags; snap may be NULL to use current snapshot (if any)

virDomainSnapshotListChildren(snap, names, nameslen, 0) lists direct children of snap; snap may be NULL to use current virDomainSnapshotListChildren(snap, names, nameslen, VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) lists all descendants of snap


Thoughts on which approach is nicer (rpc hacks vs. new API)?

--
Eric Blake   ebl...@redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

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

Reply via email to