96 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env python
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Copyright (C) 2017 Red Hat, Inc.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This program is free software; you can redistribute it and/or modify
							 | 
						||
| 
								 | 
							
								# it under the terms of the GNU General Public License as published by
							 | 
						||
| 
								 | 
							
								# the Free Software Foundation; either version 2 of the License, or
							 | 
						||
| 
								 | 
							
								# (at your option) any later version.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								# but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								# GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# You should have received a copy of the GNU General Public License
							 | 
						||
| 
								 | 
							
								# along with this program.  If not, see <http://www.gnu.org/licenses/>.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Creator/Owner: Stefan Hajnoczi <stefanha@redhat.com>
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Check that QMP 'transaction' blockdev-snapshot-sync with multiple drives on a
							 | 
						||
| 
								 | 
							
								# single IOThread completes successfully.  This particular command triggered a
							 | 
						||
| 
								 | 
							
								# hang due to recursive AioContext locking and BDRV_POLL_WHILE().  Protect
							 | 
						||
| 
								 | 
							
								# against regressions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import iotests
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								iotests.verify_image_format(supported_fmts=['qcow2'])
							 | 
						||
| 
								 | 
							
								iotests.verify_platform(['linux'])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								with iotests.FilePath('disk0.img') as disk0_img_path, \
							 | 
						||
| 
								 | 
							
								     iotests.FilePath('disk1.img') as disk1_img_path, \
							 | 
						||
| 
								 | 
							
								     iotests.FilePath('disk0-snap.img') as disk0_snap_img_path, \
							 | 
						||
| 
								 | 
							
								     iotests.FilePath('disk1-snap.img') as disk1_snap_img_path, \
							 | 
						||
| 
								 | 
							
								     iotests.VM() as vm:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    img_size = '10M'
							 | 
						||
| 
								 | 
							
								    iotests.qemu_img_pipe('create', '-f', iotests.imgfmt, disk0_img_path, img_size)
							 | 
						||
| 
								 | 
							
								    iotests.qemu_img_pipe('create', '-f', iotests.imgfmt, disk1_img_path, img_size)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iotests.log('Launching VM...')
							 | 
						||
| 
								 | 
							
								    vm.launch()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iotests.log('Adding IOThread...')
							 | 
						||
| 
								 | 
							
								    iotests.log(vm.qmp('object-add',
							 | 
						||
| 
								 | 
							
								                       qom_type='iothread',
							 | 
						||
| 
								 | 
							
								                       id='iothread0'))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iotests.log('Adding blockdevs...')
							 | 
						||
| 
								 | 
							
								    iotests.log(vm.qmp('blockdev-add',
							 | 
						||
| 
								 | 
							
								                       driver=iotests.imgfmt,
							 | 
						||
| 
								 | 
							
								                       node_name='disk0',
							 | 
						||
| 
								 | 
							
								                       file={
							 | 
						||
| 
								 | 
							
								                           'driver': 'file',
							 | 
						||
| 
								 | 
							
								                           'filename': disk0_img_path,
							 | 
						||
| 
								 | 
							
								                       }))
							 | 
						||
| 
								 | 
							
								    iotests.log(vm.qmp('blockdev-add',
							 | 
						||
| 
								 | 
							
								                       driver=iotests.imgfmt,
							 | 
						||
| 
								 | 
							
								                       node_name='disk1',
							 | 
						||
| 
								 | 
							
								                       file={
							 | 
						||
| 
								 | 
							
								                           'driver': 'file',
							 | 
						||
| 
								 | 
							
								                           'filename': disk1_img_path,
							 | 
						||
| 
								 | 
							
								                       }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iotests.log('Setting iothread...')
							 | 
						||
| 
								 | 
							
								    iotests.log(vm.qmp('x-blockdev-set-iothread',
							 | 
						||
| 
								 | 
							
								                       node_name='disk0',
							 | 
						||
| 
								 | 
							
								                       iothread='iothread0'))
							 | 
						||
| 
								 | 
							
								    iotests.log(vm.qmp('x-blockdev-set-iothread',
							 | 
						||
| 
								 | 
							
								                       node_name='disk1',
							 | 
						||
| 
								 | 
							
								                       iothread='iothread0'))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iotests.log('Creating external snapshots...')
							 | 
						||
| 
								 | 
							
								    iotests.log(vm.qmp(
							 | 
						||
| 
								 | 
							
								                  'transaction',
							 | 
						||
| 
								 | 
							
								                  actions=[
							 | 
						||
| 
								 | 
							
								                      {
							 | 
						||
| 
								 | 
							
								                          'data': {
							 | 
						||
| 
								 | 
							
								                              'node-name': 'disk0',
							 | 
						||
| 
								 | 
							
								                              'snapshot-file': disk0_snap_img_path,
							 | 
						||
| 
								 | 
							
								                              'snapshot-node-name': 'disk0-snap',
							 | 
						||
| 
								 | 
							
								                              'mode': 'absolute-paths',
							 | 
						||
| 
								 | 
							
								                              'format': iotests.imgfmt,
							 | 
						||
| 
								 | 
							
								                          },
							 | 
						||
| 
								 | 
							
								                          'type': 'blockdev-snapshot-sync'
							 | 
						||
| 
								 | 
							
								                      }, {
							 | 
						||
| 
								 | 
							
								                          'data': {
							 | 
						||
| 
								 | 
							
								                              'node-name': 'disk1',
							 | 
						||
| 
								 | 
							
								                              'snapshot-file': disk1_snap_img_path,
							 | 
						||
| 
								 | 
							
								                              'snapshot-node-name': 'disk1-snap',
							 | 
						||
| 
								 | 
							
								                              'mode': 'absolute-paths',
							 | 
						||
| 
								 | 
							
								                              'format': iotests.imgfmt
							 | 
						||
| 
								 | 
							
								                          },
							 | 
						||
| 
								 | 
							
								                          'type': 'blockdev-snapshot-sync'
							 | 
						||
| 
								 | 
							
								                      }
							 | 
						||
| 
								 | 
							
								                  ]))
							 |