On 02/28/2012 07:58 AM, Stefan Hajnoczi wrote: > On Tue, Feb 28, 2012 at 2:47 PM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: >> Il 28/02/2012 15:39, Stefan Hajnoczi ha scritto: >>> I'm not a fan of transactions or freeze/thaw (if used to atomically >>> perform other commands). >>> >>> We should not export low-level block device operations so that >>> external software can micromanage via QMP. I don't think this is a >>> good idea because it takes the block device offline and possibly >>> blocks the VM. We're reaching a level comparable to an HTTP interface >>> for acquiring pthread mutex, doing some operations, and then another >>> HTTP request to unlock it. This is micromanagement it will create >>> more problems because we will have to support lots of little API >>> functions. >> >> So you're for extending Jeff's patches to group mirroring etc.? >> >> That's also my favorite one, assuming we can do it in time for 1.1. > > Yes, that's the approach I like the most. It's relatively clean and > leaves us space to develop -blockdev. Here's the idea I was forming based on today's call: Jeff's idea of a group operation can be extended to allow multiple operations while reusing the framework. For oVirt, we need the ability to open a mirror (by passing the mirror file alongside the name of the new external snapshot), as well as reopening a blockdev (to pivot to the other side of an already-open mirror). Is there a way to express a designated union in QMP? I'm thinking something along the lines of having the overall group command take a list of operations, where each operation can either be 'create a snapshot', 'create a snapshot and mirror', or 'reopen a mirror'. I'm thinking it might look something like: { 'enum': 'BlockdevOp', 'data': [ 'snapshot', 'snapshot-mirror', 'reopen' ] } { 'type': 'BlockdevAction', 'data': {'device': 'str', 'op': 'BlockdevOp', 'file': 'str', '*format': 'str', '*reuse': 'bool', '*mirror': 'str', '*mirror-format': 'str' } } { 'command': 'blkdev-group-action-sync', 'data': { 'actionlist': [ 'BlockdevAction' ] } } The overall command is atomic - either all operations will succeed, or the command returns an error pointing to the name of the device that failed leaving all devices in their pre-command state. Then, for each requested operation: If op is 'snapshot', then 'file' names the new snapshot file; 'reuse' is optional (defaults to false) to say whether qemu creates the file from scratch, or opens an existing file with the backing file already populated correctly. 'format' gives the format of 'file', defaulting to qcow2. 'mirror' and 'mirror-format' must not be given. If op is 'snapshot-mirror', then 'mirror' is mandatory; and both 'file' and 'mirror' are opened as a new mirrored snapshot. Again, 'reuse' affects whether qemu creates the new files from scratch or trusts oVirt to pre-create both files with backing file information; and 'format' and 'mirror-format' allow control over the image format being opened. If op is 'reopen', then 'file' is the name of the file to be opened to replace the current file tied to the blockdev, with type given by 'format'. 'reuse', 'mirror', and 'mirror-format' must not be given. -- Eric Blake eblake@xxxxxxxxxx +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature