commit 7fd4d46a8ea1fa18cc641845ec932b84e45c4657
Author: Jon Bernard <email address hidden>
Date: Wed Apr 14 11:14:13 2021 -0400
RBD: use correct stripe unit in clone operation
The recent release of Ceph Pacific saw a change to the clone() logic
where invalid values of stripe unit would cause an error to be returned
where previous versions would correct the value at runtime. This
becomes a problem when creating a volume from an image, where the source
RBD image may have a larger stripe unit than cinder's RBD driver is
configured for. When this happens, clone() is called with a stripe unit
that is too small given that of the source image and the clone fails.
The RBD driver in Cinder has a configuration parameter
'rbd_store_chunk_size' that stores the preferred object size for cloned
images. If clone() is called without a stripe_unit passed in, the
stripe unit defaults to the object size, which is 4MB by default. The
issue arises when creating a volume from a Glance image, where Glance is
creating images with a default stripe unit of 8MB (distinctly larger
than that of Cinder). If we do not consider the incoming stripe unit
and select the larger of the two, Ceph cannot clone an RBD image with a
smaller stripe unit and raises an error.
This patch adds a function in our driver's clone logic to select the
larger of the two stripe unit values so that the appropriate stripe unit
is chosen.
It should also be noted that we're determining the correct stripe unit,
but using the 'order' argument to clone(). Ceph will set the stripe
unit equal to the object size (order) by default and we rely on this
behaviour for the following reason: passing stripe-unit alone or with
an order argument causes an invalid argument exception to be raised in
pre-pacific releases of Ceph, as it's argument parsing appears to have
limitations.
Closes-Bug: #1931004
Change-Id: Iec111ab83e9ed8182c9679c911e3d90927d5a7c3
(cherry picked from commit 49a2c85eda9fd3cddc75fd904fe62c87a6b50735)
(cherry picked from commit 5db58159feec3d2d39d1abf3637310f5ac60a3cf)
Conflicts: cinder/tests/unit/volume/drivers/test_rbd.py
(cherry picked from commit 07ead73eec0ac6b962b533b07861d6a81226fa37)
(cherry picked from commit 06b32da4be8b69e626eb7eb8091f695cbdcd92e7)
Conflicts: cinder/tests/unit/volume/drivers/test_rbd.py
Reviewed: https:/ /review. opendev. org/c/openstack /cinder/ +/809190 /opendev. org/openstack/ cinder/ commit/ 7fd4d46a8ea1fa1 8cc641845ec932b 84e45c4657
Committed: https:/
Submitter: "Zuul (22348)"
Branch: stable/train
commit 7fd4d46a8ea1fa1 8cc641845ec932b 84e45c4657
Author: Jon Bernard <email address hidden>
Date: Wed Apr 14 11:14:13 2021 -0400
RBD: use correct stripe unit in clone operation
The recent release of Ceph Pacific saw a change to the clone() logic
where invalid values of stripe unit would cause an error to be returned
where previous versions would correct the value at runtime. This
becomes a problem when creating a volume from an image, where the source
RBD image may have a larger stripe unit than cinder's RBD driver is
configured for. When this happens, clone() is called with a stripe unit
that is too small given that of the source image and the clone fails.
The RBD driver in Cinder has a configuration parameter store_chunk_ size' that stores the preferred object size for cloned
'rbd_
images. If clone() is called without a stripe_unit passed in, the
stripe unit defaults to the object size, which is 4MB by default. The
issue arises when creating a volume from a Glance image, where Glance is
creating images with a default stripe unit of 8MB (distinctly larger
than that of Cinder). If we do not consider the incoming stripe unit
and select the larger of the two, Ceph cannot clone an RBD image with a
smaller stripe unit and raises an error.
This patch adds a function in our driver's clone logic to select the
larger of the two stripe unit values so that the appropriate stripe unit
is chosen.
It should also be noted that we're determining the correct stripe unit,
but using the 'order' argument to clone(). Ceph will set the stripe
unit equal to the object size (order) by default and we rely on this
behaviour for the following reason: passing stripe-unit alone or with
an order argument causes an invalid argument exception to be raised in
pre-pacific releases of Ceph, as it's argument parsing appears to have
limitations.
Closes-Bug: #1931004 182c9679c911e3d 90927d5a7c3 ddc75fd904fe62c 87a6b50735) d39d1abf3637310 f5ac60a3cf)
cinder/ tests/unit/ volume/ drivers/ test_rbd. py 962b533b07861d6 a81226fa37) 626eb7eb8091f69 5cbdcd92e7)
cinder/ tests/unit/ volume/ drivers/ test_rbd. py
Change-Id: Iec111ab83e9ed8
(cherry picked from commit 49a2c85eda9fd3c
(cherry picked from commit 5db58159feec3d2
Conflicts:
(cherry picked from commit 07ead73eec0ac6b
(cherry picked from commit 06b32da4be8b69e
Conflicts: