]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes: fail removing subvolume with snapshots
authorVenky Shankar <vshankar@redhat.com>
Fri, 17 Jan 2020 09:42:58 +0000 (04:42 -0500)
committerRamana Raja <rraja@redhat.com>
Wed, 12 Feb 2020 10:11:59 +0000 (05:11 -0500)
Fixes: http://tracker.ceph.com/issues/43645
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit c158a1334207966c9727eb1e9e2eaab756e5e08b)

qa/tasks/cephfs/test_volumes.py
src/pybind/mgr/volumes/fs/operations/subvolume.py

index a21781e3e958fbbe1054a3b2ac4cb590d7d5745e..54f8619a451403747f019b29e2cee3905bc54ff5 100644 (file)
@@ -1217,3 +1217,31 @@ class TestVolumes(CephFSTestCase):
 
         # remove group
         self._fs_cmd("subvolumegroup", "rm", self.volname, group)
+
+    def test_subvolume_rm_with_snapshots(self):
+        subvolume = self._generate_random_subvolume_name()
+        snapshot = self._generate_random_snapshot_name()
+
+        # create subvolume
+        self._fs_cmd("subvolume", "create", self.volname, subvolume)
+
+        # snapshot subvolume
+        self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot)
+
+        # remove subvolume -- should fail with ENOTEMPTY since it has snapshots
+        try:
+            self._fs_cmd("subvolume", "rm", self.volname, subvolume)
+        except CommandFailedError as ce:
+            if ce.exitstatus != errno.ENOTEMPTY:
+                raise RuntimeError("invalid error code returned when deleting subvolume with snapshots")
+        else:
+            raise RuntimeError("expected subvolume deletion to fail")
+
+        # remove snapshot
+        self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot)
+
+        # remove subvolume
+        self._fs_cmd("subvolume", "rm", self.volname, subvolume)
+
+        # verify trash dir is clean
+        self._wait_for_trash_empty()
index 6759045b4b902e87ee161c2dae1ba72e998502e6..83f7ce691d4ea50ed347a85b11c45d81c7e5e8a3 100644 (file)
@@ -39,6 +39,8 @@ def remove_subvol(fs, vol_spec, group, subvolname):
     :return: None
     """
     with open_subvol(fs, vol_spec, group, subvolname) as subvolume:
+        if subvolume.list_snapshots():
+            raise VolumeException(-errno.ENOTEMPTY, "subvolume '{0}' has snapshots".format(subvolname))
         subvolume.remove()
 
 @contextmanager