From 17c039266020d3c6d9af1b4975a2e3c87f0509e4 Mon Sep 17 00:00:00 2001 From: Leonid Usov Date: Thu, 3 Aug 2023 19:41:12 +0300 Subject: [PATCH] mgr/volumes: set the 'bulk' flag for data pools created automatically for a new volume Signed-off-by: Leonid Usov Fixes: https://tracker.ceph.com/issues/61595 (cherry picked from commit 9a8219cc2bab2b5d4c0cc26783eac0ae87a8b24b) --- qa/tasks/cephfs/test_volumes.py | 18 +++++++++++++++--- src/pybind/mgr/volumes/fs/fs_util.py | 5 +++-- src/pybind/mgr/volumes/fs/operations/volume.py | 4 +++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/qa/tasks/cephfs/test_volumes.py b/qa/tasks/cephfs/test_volumes.py index aa48c41c8be04..c6a83ce0266f1 100644 --- a/qa/tasks/cephfs/test_volumes.py +++ b/qa/tasks/cephfs/test_volumes.py @@ -442,9 +442,21 @@ class TestVolumes(TestVolumesHelper): if not (volname in ([volume['name'] for volume in volumels])): raise RuntimeError("Error creating volume '{0}'".format(volname)) - else: - # clean up - self._fs_cmd("volume", "rm", volname, "--yes-i-really-mean-it") + + # check that the pools were created with the correct config + pool_details = json.loads(self._raw_cmd("osd", "pool", "ls", "detail", "--format=json")) + pool_flags = {} + for pool in pool_details: + pool_flags[pool["pool_id"]] = pool["flags_names"].split(",") + + volume_details = json.loads(self._fs_cmd("get", volname, "--format=json")) + for data_pool_id in volume_details['mdsmap']['data_pools']: + self.assertIn("bulk", pool_flags[data_pool_id]) + meta_pool_id = volume_details['mdsmap']['metadata_pool'] + self.assertNotIn("bulk", pool_flags[meta_pool_id]) + + # clean up + self._fs_cmd("volume", "rm", volname, "--yes-i-really-mean-it") def test_volume_ls(self): """ diff --git a/src/pybind/mgr/volumes/fs/fs_util.py b/src/pybind/mgr/volumes/fs/fs_util.py index be0a06acdd899..0b9382fc3e138 100644 --- a/src/pybind/mgr/volumes/fs/fs_util.py +++ b/src/pybind/mgr/volumes/fs/fs_util.py @@ -11,9 +11,10 @@ from .exception import VolumeException log = logging.getLogger(__name__) -def create_pool(mgr, pool_name): +def create_pool(mgr, pool_name, **extra_args): # create the given pool - command = {'prefix': 'osd pool create', 'pool': pool_name} + command = extra_args + command.update({'prefix': 'osd pool create', 'pool': pool_name}) return mgr.mon_command(command) def remove_pool(mgr, pool_name): diff --git a/src/pybind/mgr/volumes/fs/operations/volume.py b/src/pybind/mgr/volumes/fs/operations/volume.py index e6e374992fb0b..5cebe5c3143bd 100644 --- a/src/pybind/mgr/volumes/fs/operations/volume.py +++ b/src/pybind/mgr/volumes/fs/operations/volume.py @@ -80,7 +80,9 @@ def create_volume(mgr, volname, placement): r, outb, outs = create_pool(mgr, metadata_pool) if r != 0: return r, outb, outs - r, outb, outs = create_pool(mgr, data_pool) + # default to a bulk pool for data. In case autoscaling has been disabled + # for the cluster with `ceph osd pool set noautoscale`, this will have no effect. + r, outb, outs = create_pool(mgr, data_pool, bulk=True) if r != 0: #cleanup remove_pool(mgr, metadata_pool) -- 2.39.5