29-APR-2015 =========== [kashyapc@tesla qmp]$ ./qmp-shell ~/work/virt/qemu/incremental-backup-test-qemu/tests/qmp-sock Welcome to the QMP low-level shell! Connected to QEMU 2.2.94 (QEMU) transaction( TRANS> blockdev-snapshot-sync device=drive-ide0-0-0 snapshot-file=./ext-snap1.qcow2 format=qcow2 TRANS> blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot0 TRANS> ) {"return": {}} (QEMU) A transaction of three commands: (QEMU) transaction( TRANS> blockdev-snapshot-sync device=drive-ide0-0-0 snapshot-file=./ext-snap2.qcow2 format=qcow2 TRANS> blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot1 TRANS> drive-backup device=drive-ide0-0-0 sync=full target=./backup-copy.qcow2 mode=absolute-paths format=qcow2 TRANS> ) {"return": {}} (QEMU) A two command transaction with verbose details: $ ./qmp-shell -v ~/work/virt/qemu/incremental-backup-test-qemu/tests/qmp-sock Welcome to the QMP low-level shell! Connected to QEMU 2.2.94 (QEMU) transaction( TRANS> blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot3 TRANS> blockdev-snapshot-sync device=drive-ide0-0-0 snapshot-file=./ext-snap3.qcow2 format=qcow2 TRANS> ) {"execute": "transaction", "arguments": {"actions": [{"data": {"device": "drive-ide0-0-0", "name": "snapshot3"}, "type": "blockdev-snapshot-internal-sync"}, {"data": {"device": "drive-ide0-0-0", "snapshot-file": "./ext-snap3.qcow2", "format": "qcow2"}, "type": "blockdev-snapshot-sync"}]}} {"return": {}} (QEMU) Example two ----------- $ ./qmp-shell -v ~/work/virt/qemu/incremental-backup-test-qemu/tests/qmp-sock Welcome to the QMP low-level shell! Connected to QEMU 2.2.94 (QEMU) transaction( TRANS> blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot4 TRANS> block-dirty-bitmap-add node=drive-ide0-0-0 name=bitmap0 TRANS> ) {"execute": "transaction", "arguments": {"actions": [{"data": {"device": "drive-ide0-0-0", "name": "snapshot4"}, "type": "blockdev-snapshot-internal-sync"}, {"data": {"node": "drive-ide0-0-0", "name": "bitmap0"}, "type": "block-dirty-bitmap-add"}]}} {"return": {}} (QEMU) Incremental backup transaction with dirty bitmap ------------------------------------------------ $ ./qmp-shell -v ~/work/virt/qemu/incremental-backup-test-qemu/tests/qmp-sock Welcome to the QMP low-level shell! Connected to QEMU 2.2.94 (QEMU) transaction( TRANS> blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot5 TRANS> block-dirty-bitmap-add node=drive-ide0-0-0 name=bitmap1 TRANS> block-dirty-bitmap-clear node=drive-ide0-0-0 name=bitmap0 TRANS> drive-backup device=drive-ide0-0-0 bitmap=bitmap1 sync=dirty-bitmap target=./incremental.0.img mode=existing format=qcow2 TRANS> ) {"execute": "transaction", "arguments": {"actions": [{"data": {"device": "drive-ide0-0-0", "name": "snapshot5"}, "type": "blockdev-snapshot-internal-sync"}, {"data": {"node": "drive-ide0-0-0", "name": "bitmap1"}, "type": "block-dirty-bitmap-add"}, {"data": {"node": "drive-ide0-0-0", "name": "bitmap0"}, "type": "block-dirty-bitmap-clear"}, {"data": {"target": "./incremental.0.img", "format": "qcow2", "sync": "dirty-bitmap", "bitmap": "bitmap1", "mode": "existing", "device": "drive-ide0-0-0"}, "type": "drive-backup"}]}} {"return": {}} (QEMU) [22-APR-2015] Apply the patch series: [PATCH 0/5] scripts: qmp-shell: add transaction support $ git am `git-find-series-in-maildir \ ~/Mail/RH/qemu-devel/new/1429685258_0.5052.tesla\,U\=1159679\,FMD5\=562b0631ee21e0a9a48da8d7e0d4f558\:2\,` Applying: scripts: qmp-shell: refactor helpers Applying: scripts: qmp-shell: add support for [] expressions Applying: scripts: qmp-shell: allow single-quotes in JSON expressions Applying: scripts: qmp-shell: add transaction subshell Applying: scripts: qmp-shell: Add verbose flag $ git describe v2.3.0-rc3-42-g5aada09 $ git status On branch v2.5-and-v6-inc-backup Your branch is ahead of 'jsnow/incremental-transactions' by 5 commits. (use "git push" to publish your local commits) Untracked files: (use "git add ..." to include in what will be committed) Test ---- $ cd ~/tinker-space/qemu-upstream/scripts/qmp/ $ ./qmp-shell ~/work/virt/qemu/incremental-backup-test-qemu/tests/qmp-sock (QEMU) transaction( block-dirty-bitmap-add node=drive-ide0-0-0 name=bitmap0 ) {u'return': {}} (QEMU) (QEMU) transaction( block-dirty-bitmap-clear node=drive-ide0-0-0 name=bitmap0 ) {u'return': {}} (QEMU) [23-APR-2015] Test v3 of the patch: $ find . -name "*1429*" | xargs grep -i "qmp-shell*" | grep v3 $ git am `git-find-series-in-maildir ~/Mail/RH/INBOX/cur/1429799820_0.26715.tesla\,U\=1162474\,FMD5\=7e33429f656f1e6e9d79b29c3f82c57e\:2\,S` Applying: scripts: qmp-shell: refactor helpers Applying: scripts: qmp-shell: Expand support for QMP expressions Applying: scripts: qmp-shell: add transaction subshell Applying: scripts: qmp-shell: Add verbose flag Try the transactions commands ----------------------------- (QEMU) transaction( TRANS> blockdev-snapshot-sync device=drive-ide0-0-0 snapshot-file=./ext-snap1.qcow2 format=qcow2 TRANS> blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot0 TRANS> ) {u'return': {}} (QEMU) 28-APR-2015 =========== Test from 'qmp-shell-plus' branch: Non-transaction test -------------------- $ ./qmp-shell ~/work/virt/qemu/incremental-backup-test-qemu/tests/qmp-sock Welcome to the QMP low-level shell! Connected to QEMU 2.2.94 (QEMU) blockdev-snapshot-sync device=drive-ide0-0-0 snapshot-file=./ext-snap1.qcow2 format=qcow2 {u'return': {}} (QEMU) blockdev-snapshot-internal-sync device=drive-ide0-0-0 name=snapshot0 {u'return': {}} (QEMU) blockdev-snapshot-delete-internal-sync device=drive-ide0-0-0 name=snapshot0 {u'return': {u'name': u'snapshot0', u'date-sec': 1430236952, u'vm-state-size': 0, u'vm-clock-nsec': 0, u'vm-clock-sec': 0, u'date-nsec': 975016000, u'id': u'1'}} (QEMU)