diff mbox series

[for-4.0,v2,3/3] block: test block-stream with a base node that is used by block-commit

Message ID 001949bcb5ba28d72ab14731dbcf8e6b239ebe78.1553789986.git.berto@igalia.com
State New
Headers show
Series freeze the backing chain earlier in stream_start() | expand

Commit Message

Alberto Garcia March 28, 2019, 4:25 p.m. UTC
The base node of a block-stream operation indicates the first image
from the backing chain starting from which no data is copied to the
top node.

The block-stream job allows others to use that base image, so a second
block-stream job could be writing to it at the same time. An important
restriction is that the base image must not disappear while the stream
job is ongoing. stream_start() freezes the backing chain from top to
base with that purpose but it does it too late in the code so there is
a race condition there.

This bug was fixed in the previous commit, and this patch contains an
iotest for this scenario.

Signed-off-by: Alberto Garcia <berto@igalia.com>
---
 tests/qemu-iotests/030     | 17 +++++++++++++++++
 tests/qemu-iotests/030.out |  4 ++--
 2 files changed, 19 insertions(+), 2 deletions(-)

Comments

Vladimir Sementsov-Ogievskiy March 29, 2019, 9:40 a.m. UTC | #1
28.03.2019 19:25, Alberto Garcia wrote:
> The base node of a block-stream operation indicates the first image
> from the backing chain starting from which no data is copied to the
> top node.
> 
> The block-stream job allows others to use that base image, so a second
> block-stream job could be writing to it at the same time. An important
> restriction is that the base image must not disappear while the stream
> job is ongoing. stream_start() freezes the backing chain from top to
> base with that purpose but it does it too late in the code so there is
> a race condition there.
> 
> This bug was fixed in the previous commit, and this patch contains an
> iotest for this scenario.
> 
> Signed-off-by: Alberto Garcia <berto@igalia.com>

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
diff mbox series

Patch

diff --git a/tests/qemu-iotests/030 b/tests/qemu-iotests/030
index 276e06b5ba..c6311d1825 100755
--- a/tests/qemu-iotests/030
+++ b/tests/qemu-iotests/030
@@ -314,6 +314,23 @@  class TestParallelOps(iotests.QMPTestCase):
 
         self.wait_until_completed(drive='commit-drive0')
 
+    # In this case the base node of the stream job is the same as the
+    # top node of commit job. Since block-commit removes the top node
+    # when it finishes, this is not allowed.
+    def test_overlapping_4(self):
+        self.assert_no_active_block_jobs()
+
+        # Commit from node2 into node0
+        result = self.vm.qmp('block-commit', device='drive0', top=self.imgs[2], base=self.imgs[0])
+        self.assert_qmp(result, 'return', {})
+
+        # Stream from node2 into node4
+        result = self.vm.qmp('block-stream', device='node4', base_node='node2', job_id='node4')
+        self.assert_qmp(result, 'error/class', 'GenericError')
+
+        self.wait_until_completed()
+        self.assert_no_active_block_jobs()
+
     # Test a block-stream and a block-commit job in parallel
     # Here the stream job is supposed to finish quickly in order to reproduce
     # the scenario that triggers the bug fixed in 3d5d319e1221 and 1a63a907507
diff --git a/tests/qemu-iotests/030.out b/tests/qemu-iotests/030.out
index 42314e9c00..4fd1c2dcd2 100644
--- a/tests/qemu-iotests/030.out
+++ b/tests/qemu-iotests/030.out
@@ -1,5 +1,5 @@ 
-........................
+.........................
 ----------------------------------------------------------------------
-Ran 24 tests
+Ran 25 tests
 
 OK