Re: [Qemu-devel] [PATCH 4/4] iotests: Add test for failing mirror complete

2019-09-19 Thread Max Reitz
On 19.09.19 19:02, John Snow wrote:
> 
> 
> On 9/19/19 12:58 PM, Max Reitz wrote:
>> On 18.09.19 20:46, John Snow wrote:
>>>
>>>
>>> On 9/12/19 9:56 AM, Max Reitz wrote:
 Signed-off-by: Max Reitz 
 ---
   tests/qemu-iotests/041 | 44 ++
   tests/qemu-iotests/041.out |  4 ++--
   2 files changed, 46 insertions(+), 2 deletions(-)

 diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
 index 8568426311..84bc6d6581 100755
 --- a/tests/qemu-iotests/041
 +++ b/tests/qemu-iotests/041
 @@ -1121,6 +1121,50 @@ class TestOrphanedSource(iotests.QMPTestCase):
    target='dest-ro')
   self.assert_qmp(result, 'error/class', 'GenericError')
   +    def test_failing_permission_in_complete(self):
 +    self.assert_no_active_block_jobs()
 +
 +    # Unshare consistent-read on the target
 +    # (The mirror job does not care)
 +    result = self.vm.qmp('blockdev-add',
 + driver='blkdebug',
 + node_name='dest-perm',
 + image='dest',
 + unshare_child_perms=['consistent-read'])
 +    self.assert_qmp(result, 'return', {})
 +
 +    result = self.vm.qmp('blockdev-mirror', job_id='job',
 device='src',
 + sync='full', target='dest',
 + filter_node_name='mirror-filter')
 +    self.assert_qmp(result, 'return', {})
 +
 +    # Require consistent-read on the source
 +    # (We can only add this node once the job has started, or it
 +    # will complain that it does not want to run on non-root nodes)
 +    result = self.vm.qmp('blockdev-add',
 + driver='blkdebug',
 + node_name='src-perm',
 + image='src',
 + take_child_perms=['consistent-read'])
 +    self.assert_qmp(result, 'return', {})
 +
 +    # While completing, mirror will attempt to replace src by
 +    # dest, which must fail because src-perm requires
 +    # consistent-read but dest-perm does not share it; thus
 +    # aborting the job when it is supposed to complete
 +    self.complete_and_wait('job',
 +   completion_error='Operation not
 permitted')
 +
 +    # Assert that all of our nodes are still there (except for the
 +    # mirror filter, which should be gone despite the failure)
 +    nodes = self.vm.qmp('query-named-block-nodes')['return']
 +    nodes = list(map(lambda image: image['node-name'], nodes))
>>>
>>> Sadly, the list comprehension is a good suggestion. Squash it in if
>>> you'd like.
>>
>> You know I don’t, but I’ll do it anyway.
>>
> 
> Don't you dare make me feel bad by re-spinning, though.

I have to respin anyway. ;-)

 +
 +    for expect in ['src', 'src-perm', 'dest', 'dest-perm']:
 +    self.assertTrue(expect in nodes, '%s disappeared' % expect)
>>>
>>> I could be a real weenie and say "why not use a tuple here?"
>>
>> OK.
>>
>>> but, I'll only pretend I didn't say that instead of couching it in a
>>> self-deprecating wrapper to the same end effect.
>>>
>>> (I'm a weenie.)
>>>
 +    self.assertFalse('mirror-filter' in nodes,
 + 'Mirror filter node did not disappear')
 +
   if __name__ == '__main__':
   iotests.main(supported_fmts=['qcow2', 'qed'],
    supported_protocols=['file'])
 diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
 index 2c448b4239..f496be9197 100644
 --- a/tests/qemu-iotests/041.out
 +++ b/tests/qemu-iotests/041.out
 @@ -1,5 +1,5 @@
 -..

 +...

   --
 -Ran 90 tests
 +Ran 91 tests
     OK

>>>
>>> Or don't do anything, because I'm just being obnoxious, and I owe you
>>> one for giving you bad advice last round.
>>
>> Come on, I have better (more selfish) reasons.
>>
>> For the list comprehension: I want to introduce as many instances of
>> map/filter as I can so using those functions becomes normal.
>>
> 
> They have their uses! But also they're usually just simply longer and
> aren't worth using where list comprehensions do.

The point is that they’re special language constructs whereas map/filter
are available in basically any decent language.

>> For the tuple: This is a test, nobody cares whether it uses 60 bytes
>> more memory or is 10 µs slower or lets so

Re: [Qemu-devel] [PATCH 4/4] iotests: Add test for failing mirror complete

2019-09-19 Thread John Snow



On 9/19/19 12:58 PM, Max Reitz wrote:
> On 18.09.19 20:46, John Snow wrote:
>>
>>
>> On 9/12/19 9:56 AM, Max Reitz wrote:
>>> Signed-off-by: Max Reitz 
>>> ---
>>>   tests/qemu-iotests/041 | 44 ++
>>>   tests/qemu-iotests/041.out |  4 ++--
>>>   2 files changed, 46 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
>>> index 8568426311..84bc6d6581 100755
>>> --- a/tests/qemu-iotests/041
>>> +++ b/tests/qemu-iotests/041
>>> @@ -1121,6 +1121,50 @@ class TestOrphanedSource(iotests.QMPTestCase):
>>>    target='dest-ro')
>>>   self.assert_qmp(result, 'error/class', 'GenericError')
>>>   +    def test_failing_permission_in_complete(self):
>>> +    self.assert_no_active_block_jobs()
>>> +
>>> +    # Unshare consistent-read on the target
>>> +    # (The mirror job does not care)
>>> +    result = self.vm.qmp('blockdev-add',
>>> + driver='blkdebug',
>>> + node_name='dest-perm',
>>> + image='dest',
>>> + unshare_child_perms=['consistent-read'])
>>> +    self.assert_qmp(result, 'return', {})
>>> +
>>> +    result = self.vm.qmp('blockdev-mirror', job_id='job',
>>> device='src',
>>> + sync='full', target='dest',
>>> + filter_node_name='mirror-filter')
>>> +    self.assert_qmp(result, 'return', {})
>>> +
>>> +    # Require consistent-read on the source
>>> +    # (We can only add this node once the job has started, or it
>>> +    # will complain that it does not want to run on non-root nodes)
>>> +    result = self.vm.qmp('blockdev-add',
>>> + driver='blkdebug',
>>> + node_name='src-perm',
>>> + image='src',
>>> + take_child_perms=['consistent-read'])
>>> +    self.assert_qmp(result, 'return', {})
>>> +
>>> +    # While completing, mirror will attempt to replace src by
>>> +    # dest, which must fail because src-perm requires
>>> +    # consistent-read but dest-perm does not share it; thus
>>> +    # aborting the job when it is supposed to complete
>>> +    self.complete_and_wait('job',
>>> +   completion_error='Operation not
>>> permitted')
>>> +
>>> +    # Assert that all of our nodes are still there (except for the
>>> +    # mirror filter, which should be gone despite the failure)
>>> +    nodes = self.vm.qmp('query-named-block-nodes')['return']
>>> +    nodes = list(map(lambda image: image['node-name'], nodes))
>>
>> Sadly, the list comprehension is a good suggestion. Squash it in if
>> you'd like.
> 
> You know I don’t, but I’ll do it anyway.
> 

Don't you dare make me feel bad by re-spinning, though.

>>> +
>>> +    for expect in ['src', 'src-perm', 'dest', 'dest-perm']:
>>> +    self.assertTrue(expect in nodes, '%s disappeared' % expect)
>>
>> I could be a real weenie and say "why not use a tuple here?"
> 
> OK.
> 
>> but, I'll only pretend I didn't say that instead of couching it in a
>> self-deprecating wrapper to the same end effect.
>>
>> (I'm a weenie.)
>>
>>> +    self.assertFalse('mirror-filter' in nodes,
>>> + 'Mirror filter node did not disappear')
>>> +
>>>   if __name__ == '__main__':
>>>   iotests.main(supported_fmts=['qcow2', 'qed'],
>>>    supported_protocols=['file'])
>>> diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
>>> index 2c448b4239..f496be9197 100644
>>> --- a/tests/qemu-iotests/041.out
>>> +++ b/tests/qemu-iotests/041.out
>>> @@ -1,5 +1,5 @@
>>> -..
>>>
>>> +...
>>>
>>>   --
>>> -Ran 90 tests
>>> +Ran 91 tests
>>>     OK
>>>
>>
>> Or don't do anything, because I'm just being obnoxious, and I owe you
>> one for giving you bad advice last round.
> 
> Come on, I have better (more selfish) reasons.
> 
> For the list comprehension: I want to introduce as many instances of
> map/filter as I can so using those functions becomes normal.
> 

They have their uses! But also they're usually just simply longer and
aren't worth using where list comprehensions do.

> For the tuple: This is a test, nobody cares whether it uses 60 bytes
> more memory or is 10 µs slower or lets something be mutable when it is
> actually never changed.  As such, I like to use the most general
> solution which is simply a list.
> 

I did say I was being a weenie. You really can take the reviewed-by!



Re: [Qemu-devel] [PATCH 4/4] iotests: Add test for failing mirror complete

2019-09-19 Thread Max Reitz
On 18.09.19 20:46, John Snow wrote:
> 
> 
> On 9/12/19 9:56 AM, Max Reitz wrote:
>> Signed-off-by: Max Reitz 
>> ---
>>   tests/qemu-iotests/041 | 44 ++
>>   tests/qemu-iotests/041.out |  4 ++--
>>   2 files changed, 46 insertions(+), 2 deletions(-)
>>
>> diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
>> index 8568426311..84bc6d6581 100755
>> --- a/tests/qemu-iotests/041
>> +++ b/tests/qemu-iotests/041
>> @@ -1121,6 +1121,50 @@ class TestOrphanedSource(iotests.QMPTestCase):
>>    target='dest-ro')
>>   self.assert_qmp(result, 'error/class', 'GenericError')
>>   +    def test_failing_permission_in_complete(self):
>> +    self.assert_no_active_block_jobs()
>> +
>> +    # Unshare consistent-read on the target
>> +    # (The mirror job does not care)
>> +    result = self.vm.qmp('blockdev-add',
>> + driver='blkdebug',
>> + node_name='dest-perm',
>> + image='dest',
>> + unshare_child_perms=['consistent-read'])
>> +    self.assert_qmp(result, 'return', {})
>> +
>> +    result = self.vm.qmp('blockdev-mirror', job_id='job',
>> device='src',
>> + sync='full', target='dest',
>> + filter_node_name='mirror-filter')
>> +    self.assert_qmp(result, 'return', {})
>> +
>> +    # Require consistent-read on the source
>> +    # (We can only add this node once the job has started, or it
>> +    # will complain that it does not want to run on non-root nodes)
>> +    result = self.vm.qmp('blockdev-add',
>> + driver='blkdebug',
>> + node_name='src-perm',
>> + image='src',
>> + take_child_perms=['consistent-read'])
>> +    self.assert_qmp(result, 'return', {})
>> +
>> +    # While completing, mirror will attempt to replace src by
>> +    # dest, which must fail because src-perm requires
>> +    # consistent-read but dest-perm does not share it; thus
>> +    # aborting the job when it is supposed to complete
>> +    self.complete_and_wait('job',
>> +   completion_error='Operation not
>> permitted')
>> +
>> +    # Assert that all of our nodes are still there (except for the
>> +    # mirror filter, which should be gone despite the failure)
>> +    nodes = self.vm.qmp('query-named-block-nodes')['return']
>> +    nodes = list(map(lambda image: image['node-name'], nodes))
> 
> Sadly, the list comprehension is a good suggestion. Squash it in if
> you'd like.

You know I don’t, but I’ll do it anyway.

>> +
>> +    for expect in ['src', 'src-perm', 'dest', 'dest-perm']:
>> +    self.assertTrue(expect in nodes, '%s disappeared' % expect)
> 
> I could be a real weenie and say "why not use a tuple here?"

OK.

> but, I'll only pretend I didn't say that instead of couching it in a
> self-deprecating wrapper to the same end effect.
> 
> (I'm a weenie.)
> 
>> +    self.assertFalse('mirror-filter' in nodes,
>> + 'Mirror filter node did not disappear')
>> +
>>   if __name__ == '__main__':
>>   iotests.main(supported_fmts=['qcow2', 'qed'],
>>    supported_protocols=['file'])
>> diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
>> index 2c448b4239..f496be9197 100644
>> --- a/tests/qemu-iotests/041.out
>> +++ b/tests/qemu-iotests/041.out
>> @@ -1,5 +1,5 @@
>> -..
>>
>> +...
>>
>>   --
>> -Ran 90 tests
>> +Ran 91 tests
>>     OK
>>
> 
> Or don't do anything, because I'm just being obnoxious, and I owe you
> one for giving you bad advice last round.

Come on, I have better (more selfish) reasons.

For the list comprehension: I want to introduce as many instances of
map/filter as I can so using those functions becomes normal.

For the tuple: This is a test, nobody cares whether it uses 60 bytes
more memory or is 10 µs slower or lets something be mutable when it is
actually never changed.  As such, I like to use the most general
solution which is simply a list.

Max



signature.asc
Description: OpenPGP digital signature


Re: [Qemu-devel] [PATCH 4/4] iotests: Add test for failing mirror complete

2019-09-19 Thread Max Reitz
On 18.09.19 18:30, Vladimir Sementsov-Ogievskiy wrote:
> 12.09.2019 16:56, Max Reitz wrote:
>> Signed-off-by: Max Reitz 
>> ---
>>   tests/qemu-iotests/041 | 44 ++
>>   tests/qemu-iotests/041.out |  4 ++--
>>   2 files changed, 46 insertions(+), 2 deletions(-)
>>
>> diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
>> index 8568426311..84bc6d6581 100755
>> --- a/tests/qemu-iotests/041
>> +++ b/tests/qemu-iotests/041
>> @@ -1121,6 +1121,50 @@ class TestOrphanedSource(iotests.QMPTestCase):
>>target='dest-ro')
>>   self.assert_qmp(result, 'error/class', 'GenericError')
>>   
>> +def test_failing_permission_in_complete(self):
>> +self.assert_no_active_block_jobs()
>> +
>> +# Unshare consistent-read on the target
>> +# (The mirror job does not care)
>> +result = self.vm.qmp('blockdev-add',
>> + driver='blkdebug',
>> + node_name='dest-perm',
>> + image='dest',
>> + unshare_child_perms=['consistent-read'])
>> +self.assert_qmp(result, 'return', {})
>> +
>> +result = self.vm.qmp('blockdev-mirror', job_id='job', device='src',
>> + sync='full', target='dest',
>> + filter_node_name='mirror-filter')
>> +self.assert_qmp(result, 'return', {})
>> +
>> +# Require consistent-read on the source
>> +# (We can only add this node once the job has started, or it
>> +# will complain that it does not want to run on non-root nodes)
>> +result = self.vm.qmp('blockdev-add',
>> + driver='blkdebug',
>> + node_name='src-perm',
>> + image='src',
>> + take_child_perms=['consistent-read'])
>> +self.assert_qmp(result, 'return', {})
>> +
>> +# While completing, mirror will attempt to replace src by
>> +# dest, which must fail because src-perm requires
>> +# consistent-read but dest-perm does not share it; thus
>> +# aborting the job when it is supposed to complete
>> +self.complete_and_wait('job',
>> +   completion_error='Operation not permitted')
>> +
>> +# Assert that all of our nodes are still there (except for the
>> +# mirror filter, which should be gone despite the failure)
>> +nodes = self.vm.qmp('query-named-block-nodes')['return']
>> +nodes = list(map(lambda image: image['node-name'], nodes))
> 
> using list comprehension is a bit more pythonic:
> nodes = [node['node-name'] for node in nodes]

OK.  I can never remember, so I rarely bother using list/dict
comprehensions and instead use what I would do in any other language.
(Hence the “Sadly” from John.)

(And then wait for some kind reviewer to tell me how to do it right. :-))

Max



signature.asc
Description: OpenPGP digital signature


Re: [Qemu-block] [Qemu-devel] [PATCH 4/4] iotests: Add test for failing mirror complete

2019-09-18 Thread John Snow




On 9/12/19 9:56 AM, Max Reitz wrote:

Signed-off-by: Max Reitz 
---
  tests/qemu-iotests/041 | 44 ++
  tests/qemu-iotests/041.out |  4 ++--
  2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
index 8568426311..84bc6d6581 100755
--- a/tests/qemu-iotests/041
+++ b/tests/qemu-iotests/041
@@ -1121,6 +1121,50 @@ class TestOrphanedSource(iotests.QMPTestCase):
   target='dest-ro')
  self.assert_qmp(result, 'error/class', 'GenericError')
  
+def test_failing_permission_in_complete(self):

+self.assert_no_active_block_jobs()
+
+# Unshare consistent-read on the target
+# (The mirror job does not care)
+result = self.vm.qmp('blockdev-add',
+ driver='blkdebug',
+ node_name='dest-perm',
+ image='dest',
+ unshare_child_perms=['consistent-read'])
+self.assert_qmp(result, 'return', {})
+
+result = self.vm.qmp('blockdev-mirror', job_id='job', device='src',
+ sync='full', target='dest',
+ filter_node_name='mirror-filter')
+self.assert_qmp(result, 'return', {})
+
+# Require consistent-read on the source
+# (We can only add this node once the job has started, or it
+# will complain that it does not want to run on non-root nodes)
+result = self.vm.qmp('blockdev-add',
+ driver='blkdebug',
+ node_name='src-perm',
+ image='src',
+ take_child_perms=['consistent-read'])
+self.assert_qmp(result, 'return', {})
+
+# While completing, mirror will attempt to replace src by
+# dest, which must fail because src-perm requires
+# consistent-read but dest-perm does not share it; thus
+# aborting the job when it is supposed to complete
+self.complete_and_wait('job',
+   completion_error='Operation not permitted')
+
+# Assert that all of our nodes are still there (except for the
+# mirror filter, which should be gone despite the failure)
+nodes = self.vm.qmp('query-named-block-nodes')['return']
+nodes = list(map(lambda image: image['node-name'], nodes))


Sadly, the list comprehension is a good suggestion. Squash it in if 
you'd like.



+
+for expect in ['src', 'src-perm', 'dest', 'dest-perm']:
+self.assertTrue(expect in nodes, '%s disappeared' % expect)


I could be a real weenie and say "why not use a tuple here?"

but, I'll only pretend I didn't say that instead of couching it in a 
self-deprecating wrapper to the same end effect.


(I'm a weenie.)


+self.assertFalse('mirror-filter' in nodes,
+ 'Mirror filter node did not disappear')
+
  if __name__ == '__main__':
  iotests.main(supported_fmts=['qcow2', 'qed'],
   supported_protocols=['file'])
diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
index 2c448b4239..f496be9197 100644
--- a/tests/qemu-iotests/041.out
+++ b/tests/qemu-iotests/041.out
@@ -1,5 +1,5 @@
-..
+...
  --
-Ran 90 tests
+Ran 91 tests
  
  OK




Or don't do anything, because I'm just being obnoxious, and I owe you 
one for giving you bad advice last round.


Reviewed-by: John Snow 



Re: [Qemu-block] [Qemu-devel] [PATCH 4/4] iotests: Add test for failing mirror complete

2019-09-18 Thread Vladimir Sementsov-Ogievskiy
12.09.2019 16:56, Max Reitz wrote:
> Signed-off-by: Max Reitz 
> ---
>   tests/qemu-iotests/041 | 44 ++
>   tests/qemu-iotests/041.out |  4 ++--
>   2 files changed, 46 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
> index 8568426311..84bc6d6581 100755
> --- a/tests/qemu-iotests/041
> +++ b/tests/qemu-iotests/041
> @@ -1121,6 +1121,50 @@ class TestOrphanedSource(iotests.QMPTestCase):
>target='dest-ro')
>   self.assert_qmp(result, 'error/class', 'GenericError')
>   
> +def test_failing_permission_in_complete(self):
> +self.assert_no_active_block_jobs()
> +
> +# Unshare consistent-read on the target
> +# (The mirror job does not care)
> +result = self.vm.qmp('blockdev-add',
> + driver='blkdebug',
> + node_name='dest-perm',
> + image='dest',
> + unshare_child_perms=['consistent-read'])
> +self.assert_qmp(result, 'return', {})
> +
> +result = self.vm.qmp('blockdev-mirror', job_id='job', device='src',
> + sync='full', target='dest',
> + filter_node_name='mirror-filter')
> +self.assert_qmp(result, 'return', {})
> +
> +# Require consistent-read on the source
> +# (We can only add this node once the job has started, or it
> +# will complain that it does not want to run on non-root nodes)
> +result = self.vm.qmp('blockdev-add',
> + driver='blkdebug',
> + node_name='src-perm',
> + image='src',
> + take_child_perms=['consistent-read'])
> +self.assert_qmp(result, 'return', {})
> +
> +# While completing, mirror will attempt to replace src by
> +# dest, which must fail because src-perm requires
> +# consistent-read but dest-perm does not share it; thus
> +# aborting the job when it is supposed to complete
> +self.complete_and_wait('job',
> +   completion_error='Operation not permitted')
> +
> +# Assert that all of our nodes are still there (except for the
> +# mirror filter, which should be gone despite the failure)
> +nodes = self.vm.qmp('query-named-block-nodes')['return']
> +nodes = list(map(lambda image: image['node-name'], nodes))

using list comprehension is a bit more pythonic:
nodes = [node['node-name'] for node in nodes]

> +
> +for expect in ['src', 'src-perm', 'dest', 'dest-perm']:
> +self.assertTrue(expect in nodes, '%s disappeared' % expect)
> +self.assertFalse('mirror-filter' in nodes,
> + 'Mirror filter node did not disappear')
> +
>   if __name__ == '__main__':
>   iotests.main(supported_fmts=['qcow2', 'qed'],
>supported_protocols=['file'])
> diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
> index 2c448b4239..f496be9197 100644
> --- a/tests/qemu-iotests/041.out
> +++ b/tests/qemu-iotests/041.out
> @@ -1,5 +1,5 @@
> -..
> +...
>   --
> -Ran 90 tests
> +Ran 91 tests
>   
>   OK
> 


With or without my suggestion:
Reviewed-by: Vladimir Sementsov-Ogievskiy 

I checked, that it pass, and that fails (generates segfault) if drop patch 01:
Tested-by: Vladimir Sementsov-Ogievskiy 

-- 
Best regards,
Vladimir