From: Rishabh Dave Date: Wed, 1 Nov 2023 10:39:25 +0000 (+0530) Subject: cephfs: allow FS fail only if client_refuse_session is set X-Git-Tag: v19.0.0~133^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3f93d740677419756ca94dac99abc16c4e43a8cc;p=ceph-ci.git cephfs: allow FS fail only if client_refuse_session is set client_refuse_session must be set for a CephFS before an attempt to rename a CephFS can be made. Add a new test for this, and update current tests (test_admin.py and test_volumes.py) accordingly. Fixes: https://tracker.ceph.com/issues/63154 Signed-off-by: Rishabh Dave --- diff --git a/qa/tasks/cephfs/test_admin.py b/qa/tasks/cephfs/test_admin.py index fe224b6831d..6edea8d8bb1 100644 --- a/qa/tasks/cephfs/test_admin.py +++ b/qa/tasks/cephfs/test_admin.py @@ -628,9 +628,11 @@ class TestRenameCommand(TestAdminCommands): client_id = 'test_new_cephfs' self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) self.run_ceph_cmd(f'fs rename {orig_fs_name} {new_fs_name} --yes-i-really-mean-it') self.run_ceph_cmd(f'fs set {new_fs_name} joinable true') + self.run_ceph_cmd(f'fs set {new_fs_name} refuse_client_session false') sleep(5) # authorize a cephx ID access to the renamed file system. @@ -665,10 +667,12 @@ class TestRenameCommand(TestAdminCommands): new_fs_name = 'new_cephfs' self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) self.run_ceph_cmd(f'fs rename {orig_fs_name} {new_fs_name} --yes-i-really-mean-it') self.run_ceph_cmd(f'fs rename {orig_fs_name} {new_fs_name} --yes-i-really-mean-it') self.run_ceph_cmd(f'fs set {new_fs_name} joinable true') + self.run_ceph_cmd(f'fs set {new_fs_name} refuse_client_session false') sleep(5) # original file system name does not appear in `fs ls` command @@ -689,9 +693,11 @@ class TestRenameCommand(TestAdminCommands): data_pool = self.fs.get_data_pool_name() metadata_pool = self.fs.get_metadata_pool_name() self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) self.run_ceph_cmd(f'fs rename {orig_fs_name} {new_fs_name} --yes-i-really-mean-it') self.run_ceph_cmd(f'fs set {new_fs_name} joinable true') + self.run_ceph_cmd(f'fs set {new_fs_name} refuse_client_session false') sleep(5) try: @@ -730,6 +736,7 @@ class TestRenameCommand(TestAdminCommands): That renaming a file system without '--yes-i-really-mean-it' flag fails. """ self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) try: self.run_ceph_cmd(f"fs rename {self.fs.name} new_fs") @@ -741,12 +748,14 @@ class TestRenameCommand(TestAdminCommands): self.fail("expected renaming of file system without the " "'--yes-i-really-mean-it' flag to fail ") self.run_ceph_cmd(f'fs set {self.fs.name} joinable true') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session false') def test_fs_rename_fails_for_non_existent_fs(self): """ That renaming a non-existent file system fails. """ self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) try: self.run_ceph_cmd("fs rename non_existent_fs new_fs --yes-i-really-mean-it") @@ -762,6 +771,7 @@ class TestRenameCommand(TestAdminCommands): self.fs2 = self.mds_cluster.newfs(name='cephfs2', create=True) self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) try: self.run_ceph_cmd(f"fs rename {self.fs.name} {self.fs2.name} --yes-i-really-mean-it") @@ -771,6 +781,7 @@ class TestRenameCommand(TestAdminCommands): else: self.fail("expected renaming to a new file system name that is already in use to fail.") self.run_ceph_cmd(f'fs set {self.fs.name} joinable true') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session false') def test_fs_rename_fails_with_mirroring_enabled(self): """ @@ -781,6 +792,7 @@ class TestRenameCommand(TestAdminCommands): self.run_ceph_cmd(f'fs mirror enable {orig_fs_name}') self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') sleep(5) try: self.run_ceph_cmd(f'fs rename {orig_fs_name} {new_fs_name} --yes-i-really-mean-it') @@ -790,6 +802,7 @@ class TestRenameCommand(TestAdminCommands): self.fail("expected renaming of a mirrored file system to fail") self.run_ceph_cmd(f'fs mirror disable {orig_fs_name}') self.run_ceph_cmd(f'fs set {self.fs.name} joinable true') + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session false') def test_rename_when_fs_is_online(self): ''' @@ -798,6 +811,8 @@ class TestRenameCommand(TestAdminCommands): ''' client_id = 'test_new_cephfs' new_fs_name = 'new_cephfs' + + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session true') self.negtest_ceph_cmd( args=(f'fs rename {self.fs.name} {new_fs_name} ' '--yes-i-really-mean-it'), @@ -805,6 +820,7 @@ class TestRenameCommand(TestAdminCommands): "renaming a CephFS, it must be marked as down. See " "`ceph fs fail`."), retval=errno.EPERM) + self.run_ceph_cmd(f'fs set {self.fs.name} refuse_client_session false') self.fs.getinfo() keyring = self.fs.authorize(client_id, ('/', 'rw')) @@ -820,6 +836,23 @@ class TestRenameCommand(TestAdminCommands): self.fs.get_metadata_pool_name(), 'cephfs', 'metadata', self.fs.name) + def test_rename_when_clients_not_refused(self): + ''' + Test that "ceph fs rename" fails when client_refuse_session is not + set. + ''' + self.mount_a.umount_wait(require_clean=True) + + self.run_ceph_cmd(f'fs fail {self.fs.name}') + self.negtest_ceph_cmd( + args=f"fs rename {self.fs.name} new_fs --yes-i-really-mean-it", + errmsgs=(f"CephFS '{self.fs.name}' doesn't refuse clients. " + "Before renaming a CephFS, flag " + "'refuse_client_session' must be set. See " + "`ceph fs set`."), + retval=errno.EPERM) + self.run_ceph_cmd(f'fs fail {self.fs.name}') + class TestDump(CephFSTestCase): CLIENTS_REQUIRED = 0 diff --git a/qa/tasks/cephfs/test_volumes.py b/qa/tasks/cephfs/test_volumes.py index 22bfd4808e4..d203e66db30 100644 --- a/qa/tasks/cephfs/test_volumes.py +++ b/qa/tasks/cephfs/test_volumes.py @@ -669,9 +669,11 @@ class TestRenameCmd(TestVolumesHelper): new_data_pool, new_metadata_pool = f"cephfs.{newvolname}.data", f"cephfs.{newvolname}.meta" self.run_ceph_cmd(f'fs fail {oldvolname}') + self.run_ceph_cmd(f'fs set {oldvolname} refuse_client_session true') self._fs_cmd("volume", "rename", oldvolname, newvolname, "--yes-i-really-mean-it") self.run_ceph_cmd(f'fs set {newvolname} joinable true') + self.run_ceph_cmd(f'fs set {newvolname} refuse_client_session false') volumels = json.loads(self._fs_cmd('volume', 'ls')) volnames = [volume['name'] for volume in volumels] @@ -694,11 +696,13 @@ class TestRenameCmd(TestVolumesHelper): new_data_pool, new_metadata_pool = f"cephfs.{newvolname}.data", f"cephfs.{newvolname}.meta" self.run_ceph_cmd(f'fs fail {oldvolname}') + self.run_ceph_cmd(f'fs set {oldvolname} refuse_client_session true') self._fs_cmd("volume", "rename", oldvolname, newvolname, "--yes-i-really-mean-it") self._fs_cmd("volume", "rename", oldvolname, newvolname, "--yes-i-really-mean-it") self.run_ceph_cmd(f'fs set {newvolname} joinable true') + self.run_ceph_cmd(f'fs set {newvolname} refuse_client_session false') volumels = json.loads(self._fs_cmd('volume', 'ls')) volnames = [volume['name'] for volume in volumels] @@ -715,6 +719,7 @@ class TestRenameCmd(TestVolumesHelper): newvolname = self._generate_random_volume_name() self.run_ceph_cmd(f'fs fail {self.volname}') + self.run_ceph_cmd(f'fs set {self.volname} refuse_client_session true') try: self._fs_cmd("volume", "rename", self.volname, newvolname) except CommandFailedError as ce: @@ -725,6 +730,7 @@ class TestRenameCmd(TestVolumesHelper): self.fail("expected renaming of FS volume to fail without the " "'--yes-i-really-mean-it' flag") self.run_ceph_cmd(f'fs set {self.volname} joinable true') + self.run_ceph_cmd(f'fs set {self.volname} refuse_client_session false') def test_volume_rename_for_more_than_one_data_pool(self): """ @@ -741,9 +747,11 @@ class TestRenameCmd(TestVolumesHelper): new_metadata_pool = f"cephfs.{newvolname}.meta" self.run_ceph_cmd(f'fs fail {oldvolname}') - self._fs_cmd("volume", "rename", self.volname, newvolname, + self.run_ceph_cmd(f'fs set {oldvolname} refuse_client_session true') + self._fs_cmd("volume", "rename", oldvolname, newvolname, "--yes-i-really-mean-it") self.run_ceph_cmd(f'fs set {newvolname} joinable true') + self.run_ceph_cmd(f'fs set {newvolname} refuse_client_session false') volumels = json.loads(self._fs_cmd('volume', 'ls')) volnames = [volume['name'] for volume in volumels] @@ -761,6 +769,7 @@ class TestRenameCmd(TestVolumesHelper): m.umount_wait() newvolname = self._generate_random_volume_name() + self.run_ceph_cmd(f'fs set {self.volname} refuse_client_session true') self.negtest_ceph_cmd( args=(f'fs volume rename {self.volname} {newvolname} ' '--yes-i-really-mean-it'), @@ -768,6 +777,22 @@ class TestRenameCmd(TestVolumesHelper): "renaming a CephFS, it must be marked as down. See " "`ceph fs fail`."), retval=errno.EPERM) + self.run_ceph_cmd(f'fs set {self.volname} refuse_client_session false') + + def test_rename_when_clients_arent_refused(self): + newvolname = self._generate_random_volume_name() + for m in self.mounts: + m.umount_wait() + + self.run_ceph_cmd(f'fs fail {self.volname}') + self.negtest_ceph_cmd( + args=(f'fs volume rename {self.volname} {newvolname} ' + '--yes-i-really-mean-it'), + errmsgs=(f"CephFS '{self.volname}' doesn't refuse clients. " + "Before renaming a CephFS, flag " + "'refuse_client_session' must be set. See " + "`ceph fs set`."), + retval=errno.EPERM) class TestSubvolumeGroups(TestVolumesHelper): """Tests for FS subvolume group operations.""" diff --git a/src/mon/FSCommands.cc b/src/mon/FSCommands.cc index 906505224ea..17cc9501c78 100644 --- a/src/mon/FSCommands.cc +++ b/src/mon/FSCommands.cc @@ -1254,6 +1254,14 @@ class RenameFilesystemHandler : public FileSystemCommandHandler return -EPERM; } + // Check that refuse_client_session is set. + if (!fsp->get_mds_map().test_flag(CEPH_MDSMAP_REFUSE_CLIENT_SESSION)) { + ss << "CephFS '" << fs_name << "' doesn't refuse clients. Before " + << "renaming a CephFS, flag 'refuse_client_session' must be set. " + << "See `ceph fs set`."; + return -EPERM; + } + for (const auto p : fsp->get_mds_map().get_data_pools()) { mon->osdmon()->do_application_enable(p, pg_pool_t::APPLICATION_NAME_CEPHFS,