This patch allows delete_volume and delete_snapshot calls
to fail less often when using RBD volume clones and snapshots.
RBD clone v2 support allows remove() to pass in situations
where it would previously fail, but it still fails with an
ImageBusy error in some situations. For example:
volume1
-> snapshot s1 of volume 1
-> volume2 cloned from snapshot 1
Deleting snapshot s1 would fail with ImageBusy.
This is fixed by using RBD flatten operations to break
dependencies between volumes/snapshots and other RBD volumes
or snapshots.
Delete now works as follows:
1. Attempt RBD remove()
This is the "fast path" for removing a simple volume
that involves no extra overhead.
2. If busy and the volume has child dependencies,
flatten those dependencies with RBD flatten()
3. Attempt RBD remove() again
This will succeed in more cases than (1) would have.
4. If remove() failed, use trash_move() instead to move
the image to the trash instead.
This allows Cinder deletion of a volume (volume1) to proceed
in the scenario where volume2 was cloned from snapshot s1 of
volume1, and snapshot s1 has been trashed and not fully
deleted from the RBD backend. (Snapshots in the trash
namespace are no longer visible but are still in the
dependency chain.)
This allows Cinder deletions to succeed in most scenarios where
they would previously fail.
In cases where a .clone_snap snapshot is present, we still do a
rename to .deleted instead of deleting/trashing the volume. This
should be worked on further in a follow-up as it is likely not
necessary most of the time.
A new configuration option, rbd_concurrent_flatten_operations, was
introduced to limit how many flatten calls can be made at the same time.
This is to prevent overloading the backend. The default value is 3.
Co-Authored-By: Eric Harney <email address hidden>
Co-Authored-By: Sofia Enriquez <email address hidden>
Reviewed: https:/ /review. opendev. org/c/openstack /cinder/ +/835384 /opendev. org/openstack/ cinder/ commit/ 1a675c9aa178c6d 9c6ed10fd98f086 c46d350d3f
Committed: https:/
Submitter: "Zuul (22348)"
Branch: master
commit 1a675c9aa178c6d 9c6ed10fd98f086 c46d350d3f
Author: Eric Harney <email address hidden>
Date: Wed Apr 20 12:08:31 2022 -0400
RBD: Flattening of child volumes during deletion
This patch allows delete_volume and delete_snapshot calls
to fail less often when using RBD volume clones and snapshots.
RBD clone v2 support allows remove() to pass in situations
where it would previously fail, but it still fails with an
ImageBusy error in some situations. For example:
volume1
-> snapshot s1 of volume 1
-> volume2 cloned from snapshot 1
Deleting snapshot s1 would fail with ImageBusy.
This is fixed by using RBD flatten operations to break
dependencies between volumes/snapshots and other RBD volumes
or snapshots.
Delete now works as follows:
1. Attempt RBD remove()
This is the "fast path" for removing a simple volume
that involves no extra overhead.
2. If busy and the volume has child dependencies,
flatten those dependencies with RBD flatten()
3. Attempt RBD remove() again
This will succeed in more cases than (1) would have.
4. If remove() failed, use trash_move() instead to move
the image to the trash instead.
This allows Cinder deletion of a volume (volume1) to proceed
in the scenario where volume2 was cloned from snapshot s1 of
volume1, and snapshot s1 has been trashed and not fully
deleted from the RBD backend. (Snapshots in the trash
namespace are no longer visible but are still in the
dependency chain.)
This allows Cinder deletions to succeed in most scenarios where
they would previously fail.
In cases where a .clone_snap snapshot is present, we still do a
rename to .deleted instead of deleting/trashing the volume. This
should be worked on further in a follow-up as it is likely not
necessary most of the time.
A new configuration option, rbd_concurrent_ flatten_ operations, was
introduced to limit how many flatten calls can be made at the same time.
This is to prevent overloading the backend. The default value is 3.
Co-Authored-By: Eric Harney <email address hidden>
Co-Authored-By: Sofia Enriquez <email address hidden>
Closes-Bug: #1969643 ca0b4f99bc9b70d add19717d04
Change-Id: I009d0748fdc829