from tasks.cephfs.cephfs_test_case import CephFSTestCase
from tasks.cephfs.fuse_mount import FuseMount
from teuthology.exceptions import CommandFailedError
+from teuthology import contextutil
log = logging.getLogger(__name__)
# remove group
self._fs_cmd("subvolumegroup", "rm", self.volname, group)
+ def test_dangling_symlink(self):
+ """
+ test_dangling_symlink
+ Tests for the presence of any dangling symlink, if yes,
+ will remove it.
+ """
+ subvolume = self._gen_subvol_name()
+ snapshot = self._gen_subvol_snap_name()
+ clone = self._gen_subvol_clone_name()
+
+ self._fs_cmd("subvolume", "create", self.volname, subvolume)
+
+ self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot)
+
+ self.config_set('mgr', 'mgr/volumes/snapshot_clone_delay', 60)
+
+ self.config_set('mgr', 'mgr/volumes/snapshot_clone_no_wait', False)
+
+ self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone)
+
+ result = json.loads(self._fs_cmd("subvolume", "snapshot", "info", self.volname, subvolume, snapshot))
+
+ # verify snapshot info
+ self.assertEqual(result['has_pending_clones'], "yes")
+
+ clone_path = f'./volumes/_nogroup/{clone}'
+ self.mount_a.run_shell(['sudo', 'rm', '-rf', clone_path], omit_sudo=False)
+
+ with contextutil.safe_while(sleep=5, tries=6) as proceed:
+ while proceed():
+ try:
+ result = json.loads(self._fs_cmd("subvolume", "snapshot", "info", self.volname, subvolume, snapshot))
+ # verify snapshot info
+ self.assertEqual(result['has_pending_clones'], "no")
+ break
+ except AssertionError as e:
+ log.debug(f'{e}, retrying')
+
+ self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot)
+
+ self._fs_cmd("subvolume", "rm", self.volname, subvolume)
+
+ self._wait_for_trash_empty()
+
+
class TestPerModuleFinsherThread(TestVolumesHelper):
"""
Per module finisher thread tests related to mgr/volume cmds.