All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@gmail.com>
To: Kashyap Chamarthy <kchamart@redhat.com>
Cc: qemu-devel@nongnu.org, kwolf@redhat.com, famz@redhat.com,
	qemu-block@nongnu.org, dgilbert@redhat.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [Qemu-block] [PATCH v2] qemu-iotests: Extend non-shared storage migration test (194)
Date: Tue, 29 Aug 2017 15:19:54 +0100	[thread overview]
Message-ID: <20170829141954.GA18927@stefanha-x1.localdomain> (raw)
In-Reply-To: <20170829090622.30843-1-kchamart@redhat.com>

On Tue, Aug 29, 2017 at 11:06:22AM +0200, Kashyap Chamarthy wrote:
> This is the follow-up patch that was discussed[*] as part of feedback to
> qemu-iotest 194.
> 
> Changes in this patch:
> 
>   - Supply 'job-id' parameter to `drive-mirror` invocation.
> 
>   - Issue QMP `block-job-cancel` command on the source QEMU to
>     gracefully complete `drive-mirror` operation.
> 
>   - Stop the NBD server on the destination QEMU.
> 
>   - Finally, check for both the events: MIGRATION and
>     BLOCK_JOB_COMPLETED
> 
> With the above, the test will also be (almost) in sync with the
> procedure outlined in the document 'live-block-operations.rst'[+]
> (section: "QMP invocation for live storage migration with
> ``drive-mirror`` + NBD").
> 
> [*] https://lists.nongnu.org/archive/html/qemu-devel/2017-08/msg04820.html
>     -- qemu-iotests: add 194 non-shared storage migration test
> [+] https://git.qemu.org/gitweb.cgi?p=qemu.git;a=blob;f=docs/interop/live-block-operations.rst
> 
> Signed-off-by: Kashyap Chamarthy <kchamart@redhat.com>
> ---
> Changes in v2:
>  - Check for both the events: MIGRATION and BLOCK_JOB_COMPLETED (Eric)
> ---
>  tests/qemu-iotests/194     | 25 +++++++++++++++++++------
>  tests/qemu-iotests/194.out | 11 ++++++++---
>  2 files changed, 27 insertions(+), 9 deletions(-)
> 
> diff --git a/tests/qemu-iotests/194 b/tests/qemu-iotests/194
> index 8028111e21bed5cf4a2e8e32dc04aa5a9ea9caca..9d81189fe3e790d060da5a0fd41836f4b57f95c7 100755
> --- a/tests/qemu-iotests/194
> +++ b/tests/qemu-iotests/194
> @@ -46,16 +46,17 @@ iotests.log('Launching NBD server on destination...')
>  iotests.log(dest_vm.qmp('nbd-server-start', addr={'type': 'unix', 'data': {'path': nbd_sock_path}}))
>  iotests.log(dest_vm.qmp('nbd-server-add', device='drive0', writable=True))
>  
> -iotests.log('Starting drive-mirror on source...')
> +iotests.log('Starting `drive-mirror` on source...')
>  iotests.log(source_vm.qmp(
>                'drive-mirror',
>                device='drive0',
>                target='nbd+unix:///drive0?socket={0}'.format(nbd_sock_path),
>                sync='full',
>                format='raw', # always raw, the server handles the format
> -              mode='existing'))
> +              mode='existing',
> +              job_id='mirror-job0'))
>  
> -iotests.log('Waiting for drive-mirror to complete...')
> +iotests.log('Waiting for `drive-mirror` to complete...')
>  iotests.log(source_vm.event_wait('BLOCK_JOB_READY'),
>              filters=[iotests.filter_qmp_event])
>  
> @@ -66,8 +67,20 @@ dest_vm.qmp('migrate-set-capabilities',
>              capabilities=[{'capability': 'events', 'state': True}])
>  iotests.log(source_vm.qmp('migrate', uri='unix:{0}'.format(migration_sock_path)))
>  
> +iotests.log('Gracefully ending the `drive-mirror` job on source...')
> +iotests.log(source_vm.qmp('block-job-cancel', device='mirror-job0'))

Two issues:

1. Migration may not have completed yet so drive-mirror cannot be
   stopped here.  We need to wait for migration to complete on the
   source before cancelling the block job.

2. block-job-cancel is asynchronous.  The block job may still be running
   after this returns.  Therefore it may still be using the NBD drive...

> +
> +iotests.log('Stopping the NBD server on destination...')
> +iotests.log(dest_vm.qmp('nbd-server-stop'))

...and that races with this command on the destination.

We need to wait for the BLOCK_JOB_CANCELLED/COMPLETED event on the
source QEMU before stopping the NBD server on the destination.

> +
>  while True:
> -    event = source_vm.event_wait('MIGRATION')
> -    iotests.log(event, filters=[iotests.filter_qmp_event])
> -    if event['data']['status'] in ('completed', 'failed'):
> +    event1 = source_vm.event_wait('MIGRATION')
> +    iotests.log(event1, filters=[iotests.filter_qmp_event])
> +    if event1['data']['status'] in ('completed', 'failed'):
> +        break
> +
> +while True:
> +    event2 = source_vm.event_wait('BLOCK_JOB_COMPLETED')
> +    iotests.log(event2, filters=[iotests.filter_qmp_event])
> +    if event2['event'] == 'BLOCK_JOB_COMPLETED':
>          break
> diff --git a/tests/qemu-iotests/194.out b/tests/qemu-iotests/194.out
> index ae501fecacb706b1851cb9063ce9c9d5a28bb7ea..a461d7e21abb2dee54d72d93d644100f9fbcb17d 100644
> --- a/tests/qemu-iotests/194.out
> +++ b/tests/qemu-iotests/194.out
> @@ -2,12 +2,17 @@ Launching VMs...
>  Launching NBD server on destination...
>  {u'return': {}}
>  {u'return': {}}
> -Starting drive-mirror on source...
> +Starting `drive-mirror` on source...
>  {u'return': {}}
> -Waiting for drive-mirror to complete...
> -{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'drive0', u'type': u'mirror', u'speed': 0, u'len': 1073741824, u'offset': 1073741824}, u'event': u'BLOCK_JOB_READY'}
> +Waiting for `drive-mirror` to complete...
> +{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror-job0', u'type': u'mirror', u'speed': 0, u'len': 1073741824, u'offset': 1073741824}, u'event': u'BLOCK_JOB_READY'}
>  Starting migration...
>  {u'return': {}}
> +Gracefully ending the `drive-mirror` job on source...
> +{u'return': {}}
> +Stopping the NBD server on destination...
> +{u'return': {}}
>  {u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'setup'}, u'event': u'MIGRATION'}
>  {u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'active'}, u'event': u'MIGRATION'}
>  {u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'completed'}, u'event': u'MIGRATION'}
> +{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror-job0', u'type': u'mirror', u'speed': 0, u'len': 1073741824, u'offset': 1073741824}, u'event': u'BLOCK_JOB_COMPLETED'}
> -- 
> 2.9.5
> 
> 

  reply	other threads:[~2017-08-29 14:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-29  9:06 [Qemu-devel] [PATCH v2] qemu-iotests: Extend non-shared storage migration test (194) Kashyap Chamarthy
2017-08-29 14:19 ` Stefan Hajnoczi [this message]
2017-08-29 14:47   ` [Qemu-devel] [Qemu-block] " Kashyap Chamarthy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170829141954.GA18927@stefanha-x1.localdomain \
    --to=stefanha@gmail.com \
    --cc=dgilbert@redhat.com \
    --cc=famz@redhat.com \
    --cc=kchamart@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.