Re: [Qemu-devel] [PATCH v9 07/13] iotests: prepare 124 and 257 bitmap querying for backup-top filter
On 29.08.19 15:22, Vladimir Sementsov-Ogievskiy wrote: > 28.08.2019 19:40, Max Reitz wrote: >> On 26.08.19 18:13, Vladimir Sementsov-Ogievskiy wrote: [...] >>> + >>> +def get_bitmap(self, bitmaps, node_name, name, recording=None): >>> +""" >>> +get a specific bitmap from the object returned by query_bitmaps. >>> +:param recording: If specified, filter results by the specified >>> value. >>> +""" >>> +if bitmaps is None: >>> +bitmaps = self.query_bitmaps() >>> + >>> +for bitmap in bitmaps['bitmaps'][node_name]: >>> +if bitmap.get('name', '') == name: >>> +if recording is None: >>> +return bitmap >>> +elif bitmap.get('recording') == recording: >>> +return bitmap >> >> Maybe add a “break” or “return None” here? >> >> (Yes, yes, you just moved existing code. Still.) >> > > No, as we may have several unnamed bitmaps, which should be selected by > "recording".. Ah. OK. Now it all makes sense... Max signature.asc Description: OpenPGP digital signature
Re: [Qemu-devel] [PATCH v9 07/13] iotests: prepare 124 and 257 bitmap querying for backup-top filter
28.08.2019 19:40, Max Reitz wrote: > On 26.08.19 18:13, Vladimir Sementsov-Ogievskiy wrote: >> After backup-top filter appearing it's not possible to see dirty >> bitmaps in top node, so use node-name instead. >> >> Signed-off-by: Vladimir Sementsov-Ogievskiy >> --- >> tests/qemu-iotests/124| 3 +- >> tests/qemu-iotests/257| 39 +--- >> tests/qemu-iotests/257.out| 364 +- >> tests/qemu-iotests/iotests.py | 22 ++ >> 4 files changed, 173 insertions(+), 255 deletions(-) >> >> diff --git a/tests/qemu-iotests/124 b/tests/qemu-iotests/124 >> index 3440f54781..8b6024769c 100755 >> --- a/tests/qemu-iotests/124 >> +++ b/tests/qemu-iotests/124 >> @@ -749,8 +749,7 @@ class >> TestIncrementalBackupBlkdebug(TestIncrementalBackupBase): >> >> # Bitmap Status Check >> query = self.vm.qmp('query-block') >> -ret = [bmap for bmap in query['return'][0]['dirty-bitmaps'] >> - if bmap.get('name') == bitmap.name][0] >> +ret = self.vm.get_bitmap(None, drive0['id'], bitmap.name) >> self.assert_qmp(ret, 'count', 458752) >> self.assert_qmp(ret, 'granularity', 65536) >> self.assert_qmp(ret, 'status', 'frozen') > > I see a couple more instances of querying the bitmaps through > query-block here. Wouldn’t it make sense to replace them all with > get_bitmap()? > > [...] > >> diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py >> index 84438e837c..9381964d9f 100644 >> --- a/tests/qemu-iotests/iotests.py >> +++ b/tests/qemu-iotests/iotests.py >> @@ -643,6 +643,28 @@ class VM(qtest.QEMUQtestMachine): >> return x >> return None >> >> +def query_bitmaps(self): >> +res = self.qmp("query-named-block-nodes") >> +return {"bitmaps": {device['node-name']: device['dirty-bitmaps'] >> +for device in res['return'] >> +if 'dirty-bitmaps' in device}} > > I’d leave the wrapping in {"bitmaps": x} to the callers, if they need it. > >> + >> +def get_bitmap(self, bitmaps, node_name, name, recording=None): >> +""" >> +get a specific bitmap from the object returned by query_bitmaps. >> +:param recording: If specified, filter results by the specified >> value. >> +""" >> +if bitmaps is None: >> +bitmaps = self.query_bitmaps() >> + >> +for bitmap in bitmaps['bitmaps'][node_name]: >> +if bitmap.get('name', '') == name: >> +if recording is None: >> +return bitmap >> +elif bitmap.get('recording') == recording: >> +return bitmap > > Maybe add a “break” or “return None” here? > > (Yes, yes, you just moved existing code. Still.) > No, as we may have several unnamed bitmaps, which should be selected by "recording".. > >> +return None >> + >> >> index_re = re.compile(r'([^\[]+)\[([^\]]+)\]') >> >> > > -- Best regards, Vladimir
Re: [Qemu-devel] [PATCH v9 07/13] iotests: prepare 124 and 257 bitmap querying for backup-top filter
On 26.08.19 18:13, Vladimir Sementsov-Ogievskiy wrote: > After backup-top filter appearing it's not possible to see dirty > bitmaps in top node, so use node-name instead. > > Signed-off-by: Vladimir Sementsov-Ogievskiy > --- > tests/qemu-iotests/124| 3 +- > tests/qemu-iotests/257| 39 +--- > tests/qemu-iotests/257.out| 364 +- > tests/qemu-iotests/iotests.py | 22 ++ > 4 files changed, 173 insertions(+), 255 deletions(-) > > diff --git a/tests/qemu-iotests/124 b/tests/qemu-iotests/124 > index 3440f54781..8b6024769c 100755 > --- a/tests/qemu-iotests/124 > +++ b/tests/qemu-iotests/124 > @@ -749,8 +749,7 @@ class > TestIncrementalBackupBlkdebug(TestIncrementalBackupBase): > > # Bitmap Status Check > query = self.vm.qmp('query-block') > -ret = [bmap for bmap in query['return'][0]['dirty-bitmaps'] > - if bmap.get('name') == bitmap.name][0] > +ret = self.vm.get_bitmap(None, drive0['id'], bitmap.name) > self.assert_qmp(ret, 'count', 458752) > self.assert_qmp(ret, 'granularity', 65536) > self.assert_qmp(ret, 'status', 'frozen') I see a couple more instances of querying the bitmaps through query-block here. Wouldn’t it make sense to replace them all with get_bitmap()? [...] > diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py > index 84438e837c..9381964d9f 100644 > --- a/tests/qemu-iotests/iotests.py > +++ b/tests/qemu-iotests/iotests.py > @@ -643,6 +643,28 @@ class VM(qtest.QEMUQtestMachine): > return x > return None > > +def query_bitmaps(self): > +res = self.qmp("query-named-block-nodes") > +return {"bitmaps": {device['node-name']: device['dirty-bitmaps'] > +for device in res['return'] > +if 'dirty-bitmaps' in device}} I’d leave the wrapping in {"bitmaps": x} to the callers, if they need it. > + > +def get_bitmap(self, bitmaps, node_name, name, recording=None): > +""" > +get a specific bitmap from the object returned by query_bitmaps. > +:param recording: If specified, filter results by the specified > value. > +""" > +if bitmaps is None: > +bitmaps = self.query_bitmaps() > + > +for bitmap in bitmaps['bitmaps'][node_name]: > +if bitmap.get('name', '') == name: > +if recording is None: > +return bitmap > +elif bitmap.get('recording') == recording: > +return bitmap Maybe add a “break” or “return None” here? (Yes, yes, you just moved existing code. Still.) Max > +return None > + > > index_re = re.compile(r'([^\[]+)\[([^\]]+)\]') > > signature.asc Description: OpenPGP digital signature
[Qemu-devel] [PATCH v9 07/13] iotests: prepare 124 and 257 bitmap querying for backup-top filter
After backup-top filter appearing it's not possible to see dirty bitmaps in top node, so use node-name instead. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/124| 3 +- tests/qemu-iotests/257| 39 +--- tests/qemu-iotests/257.out| 364 +- tests/qemu-iotests/iotests.py | 22 ++ 4 files changed, 173 insertions(+), 255 deletions(-) diff --git a/tests/qemu-iotests/124 b/tests/qemu-iotests/124 index 3440f54781..8b6024769c 100755 --- a/tests/qemu-iotests/124 +++ b/tests/qemu-iotests/124 @@ -749,8 +749,7 @@ class TestIncrementalBackupBlkdebug(TestIncrementalBackupBase): # Bitmap Status Check query = self.vm.qmp('query-block') -ret = [bmap for bmap in query['return'][0]['dirty-bitmaps'] - if bmap.get('name') == bitmap.name][0] +ret = self.vm.get_bitmap(None, drive0['id'], bitmap.name) self.assert_qmp(ret, 'count', 458752) self.assert_qmp(ret, 'granularity', 65536) self.assert_qmp(ret, 'status', 'frozen') diff --git a/tests/qemu-iotests/257 b/tests/qemu-iotests/257 index c2a72c577a..8c3e96a7fc 100755 --- a/tests/qemu-iotests/257 +++ b/tests/qemu-iotests/257 @@ -188,25 +188,6 @@ class Drive: self.size = size self.node = name -def query_bitmaps(vm): -res = vm.qmp("query-block") -return {"bitmaps": {device['device'] or device['qdev']: -device.get('dirty-bitmaps', []) for -device in res['return']}} - -def get_bitmap(bitmaps, drivename, name, recording=None): -""" -get a specific bitmap from the object returned by query_bitmaps. -:param recording: If specified, filter results by the specified value. -""" -for bitmap in bitmaps['bitmaps'][drivename]: -if bitmap.get('name', '') == name: -if recording is None: -return bitmap -elif bitmap.get('recording') == recording: -return bitmap -return None - def blockdev_backup(vm, device, target, sync, **kwargs): # Strip any arguments explicitly nulled by the caller: kwargs = {key: val for key, val in kwargs.items() if val is not None} @@ -249,7 +230,7 @@ def perform_writes(drive, n): pattern.size) log(cmd) log(drive.vm.hmp_qemu_io(drive.name, cmd)) -bitmaps = query_bitmaps(drive.vm) +bitmaps = drive.vm.query_bitmaps() log(bitmaps, indent=2) log('') return bitmaps @@ -370,7 +351,7 @@ def test_bitmap_sync(bsync_mode, msync_mode='bitmap', failure=None): # 1 - Writes and Reference Backup bitmaps = perform_writes(drive0, 1) ebitmap.dirty_group(1) -bitmap = get_bitmap(bitmaps, drive0.device, 'bitmap0') +bitmap = vm.get_bitmap(bitmaps, drive0.node, 'bitmap0') ebitmap.compare(bitmap) reference_backup(drive0, 1, fbackup1) @@ -388,11 +369,11 @@ def test_bitmap_sync(bsync_mode, msync_mode='bitmap', failure=None): log('') bitmaps = perform_writes(drive0, 2) # Named bitmap (static, should be unchanged) -ebitmap.compare(get_bitmap(bitmaps, drive0.device, 'bitmap0')) +ebitmap.compare(vm.get_bitmap(bitmaps, drive0.node, 'bitmap0')) # Anonymous bitmap (dynamic, shows new writes) anonymous = EmulatedBitmap() anonymous.dirty_group(2) -anonymous.compare(get_bitmap(bitmaps, drive0.device, '', +anonymous.compare(vm.get_bitmap(bitmaps, drive0.node, '', recording=True)) # Simulate the order in which this will happen: @@ -405,7 +386,7 @@ def test_bitmap_sync(bsync_mode, msync_mode='bitmap', failure=None): vm.run_job(job, auto_dismiss=True, auto_finalize=False, pre_finalize=_callback, cancel=(failure == 'simulated')) -bitmaps = query_bitmaps(vm) +bitmaps = vm.query_bitmaps() log(bitmaps, indent=2) log('') @@ -423,29 +404,29 @@ def test_bitmap_sync(bsync_mode, msync_mode='bitmap', failure=None): ebitmap.clear() ebitmap.dirty_bits(range(fail_bit, SIZE // GRANULARITY)) -ebitmap.compare(get_bitmap(bitmaps, drive0.device, 'bitmap0')) +ebitmap.compare(vm.get_bitmap(bitmaps, drive0.node, 'bitmap0')) # 2 - Writes and Reference Backup bitmaps = perform_writes(drive0, 3) ebitmap.dirty_group(3) -ebitmap.compare(get_bitmap(bitmaps, drive0.device, 'bitmap0')) +ebitmap.compare(vm.get_bitmap(bitmaps, drive0.node, 'bitmap0')) reference_backup(drive0, 2, fbackup2) # 2 - Bitmap Backup (In failure modes, this is a recovery.) job = backup(drive0, 2, bsync2, "bitmap", bitmap="bitmap0", bitmap_mode=bsync_mode) vm.run_job(job, auto_dismiss=True, auto_finalize=False)