On 03/01/2012 05:21 AM, Paolo Bonzini wrote:
This implements all ingredients to establish mirrored writes.
The drive-reopen command that is used to terminate mirrored writes
is not included in this series.
Tested with the following scenarios:
a) mirror only
1) create base.qcow2 and start QEMU with it
2) Execute the following QMP command
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-transaction", "arguments":
{'actions': [
{ 'type': 'mirror', 'data' :
{ 'device': 'ide0-hd0', 'target': '/home/pbonzini/mirror.qcow2' } } ] } }
{ "execute": "cont" }
3) hibernate the guest (this requires an IDE disk and -cpu kvm64,-kvmclock)
4) restart the guest with mirror.qcow2
b) atomic snapshot+mirror
1) start QEMU with an existing image test.img
2) Execute the following QMP command
{ "execute": "qmp_capabilities" }
{ "execute": "blockdev-transaction", "arguments":
{'actions': [
{ 'type': 'snapshot', 'data' :
{ 'device': 'ide0-hd0', 'snapshot-file': '/home/pbonzini/base.qcow2' } },
{ 'type': 'mirror', 'data' :
{ 'device': 'ide0-hd0', 'target': '/home/pbonzini/mirror.qcow2' } } ] } }
{ "execute": "cont" }
We don't have schema introspection today. How would one determine when new
transaction types are available?
I think we need some sort of introspection method too in order for clients to
figure out when the command is extended.
Regards,
Anthony Liguori
3) hibernate the guest (this requires an IDE disk and -cpu kvm64,-kvmclock)
4) check that mirror.qcow2 has test.img as the base
5) restart the guest with base.qcow2
6) restart the guest with mirror.qcow2
v1->v2:
Removed wrong assertions in patches 3 and 6
Move new_image_file and other variables inside the while loop (Federico)
Rename new_source_file to new_source (Federico)
Fix image name in error message (Federico)
Fixed documentation in qapi-schema.json (Federico)
Fixed documentation and example in qmp-commands.hx (Eric)
Added back AIO (Stefan), with fixes to cancellation
Marcelo Tosatti (1):
Add blkmirror block driver
Paolo Bonzini (5):
fix format name for backing file
qapi: complete implementation of unions
rename blockdev-group-snapshot-sync
add reuse field
add mirroring to blockdev-transaction
Makefile.objs | 2 +-
block/blkmirror.c | 239 +++++++++++++++++++++++++++++++++++++++++++++
blockdev.c | 114 ++++++++++++++--------
qapi-schema-test.json | 10 ++
qapi-schema.json | 51 ++++++++--
qmp-commands.hx | 68 +++++++++----
scripts/qapi-types.py | 5 +
scripts/qapi-visit.py | 31 ++++++-
test-qmp-input-visitor.c | 18 ++++
test-qmp-output-visitor.c | 34 +++++++
10 files changed, 496 insertions(+), 76 deletions(-)
create mode 100644 block/blkmirror.c