From 4439035c32ceef9e306f12dd930e57a5ed7bb122 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Nov 2021 16:09:00 -0500 Subject: [PATCH] mon: add pg_num_max pool property Signed-off-by: Sage Weil --- qa/workunits/mon/pool_ops.sh | 13 +++++++++++++ src/mon/MonCommands.h | 4 ++-- src/mon/OSDMonitor.cc | 15 ++++++++++++++- src/osd/osd_types.cc | 2 ++ src/osd/osd_types.h | 1 + 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/qa/workunits/mon/pool_ops.sh b/qa/workunits/mon/pool_ops.sh index ab15832ea74..9a98eab8b13 100755 --- a/qa/workunits/mon/pool_ops.sh +++ b/qa/workunits/mon/pool_ops.sh @@ -43,6 +43,19 @@ function expect_config_value() fi } +# pg_num min/max +TEST_POOL=testpool1234 +ceph osd pool create testpool1234 8 --autoscale-mode off +ceph osd pool set $TEST_POOL pg_num_min 2 +ceph osd pool get $TEST_POOL pg_num_min | grep 2 +ceph osd pool set $TEST_POOL pg_num_max 33 +ceph osd pool get $TEST_POOL pg_num_max | grep 33 +ceph osd pool set $TEST_POOL pg_num_min 0 +expect_false ceph osd pool get $TEST_POOL pg_num_min +ceph osd pool set $TEST_POOL pg_num_max 0 +expect_false ceph osd pool get $TEST_POOL pg_num_max +ceph osd pool delete $TEST_POOL $TEST_POOL --yes-i-really-really-mean-it + # note: we need to pass the other args or ceph_argparse.py will take # 'invalid' that is not replicated|erasure and assume it is the next # argument, which is a string. diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 0a8ce0599df..1613f457df5 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -1083,11 +1083,11 @@ COMMAND("osd pool rename " "rename to ", "osd", "rw") COMMAND("osd pool get " "name=pool,type=CephPoolname " - "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|all|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio|dedup_tier|dedup_chunk_algorithm|dedup_cdc_chunk_size|eio|bulk", + "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|all|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|pg_num_max|target_size_bytes|target_size_ratio|dedup_tier|dedup_chunk_algorithm|dedup_cdc_chunk_size|eio|bulk", "get pool parameter ", "osd", "r") COMMAND("osd pool set " "name=pool,type=CephPoolname " - "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|pgp_num_actual|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|min_read_recency_for_promote|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio|dedup_tier|dedup_chunk_algorithm|dedup_cdc_chunk_size|eio|bulk " + "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|pgp_num_actual|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|min_read_recency_for_promote|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|pg_num_max|target_size_bytes|target_size_ratio|dedup_tier|dedup_chunk_algorithm|dedup_cdc_chunk_size|eio|bulk " "name=val,type=CephString " "name=yes_i_really_mean_it,type=CephBool,req=false", "set pool parameter to ", "osd", "rw") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index a35d0137862..00ae7ad9f55 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -5353,7 +5353,7 @@ namespace { CSUM_TYPE, CSUM_MAX_BLOCK, CSUM_MIN_BLOCK, FINGERPRINT_ALGORITHM, PG_AUTOSCALE_MODE, PG_NUM_MIN, TARGET_SIZE_BYTES, TARGET_SIZE_RATIO, PG_AUTOSCALE_BIAS, DEDUP_TIER, DEDUP_CHUNK_ALGORITHM, - DEDUP_CDC_CHUNK_SIZE, POOL_EIO, BULK }; + DEDUP_CDC_CHUNK_SIZE, POOL_EIO, BULK, PG_NUM_MAX }; std::set subtract_second_from_first(const std::set& first, @@ -6082,6 +6082,7 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) {"fingerprint_algorithm", FINGERPRINT_ALGORITHM}, {"pg_autoscale_mode", PG_AUTOSCALE_MODE}, {"pg_num_min", PG_NUM_MIN}, + {"pg_num_max", PG_NUM_MAX}, {"target_size_bytes", TARGET_SIZE_BYTES}, {"target_size_ratio", TARGET_SIZE_RATIO}, {"pg_autoscale_bias", PG_AUTOSCALE_BIAS}, @@ -6311,6 +6312,7 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) case CSUM_MIN_BLOCK: case FINGERPRINT_ALGORITHM: case PG_NUM_MIN: + case PG_NUM_MAX: case TARGET_SIZE_BYTES: case TARGET_SIZE_RATIO: case PG_AUTOSCALE_BIAS: @@ -6473,6 +6475,7 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) case CSUM_MIN_BLOCK: case FINGERPRINT_ALGORITHM: case PG_NUM_MIN: + case PG_NUM_MAX: case TARGET_SIZE_BYTES: case TARGET_SIZE_RATIO: case PG_AUTOSCALE_BIAS: @@ -8737,6 +8740,16 @@ int OSDMonitor::prepare_command_pool_set(const cmdmap_t& cmdmap, << " > pg_num " << p.get_pg_num_target(); return -EINVAL; } + } else if (var == "pg_num_max") { + if (interr.length()) { + ss << "error parsing int value '" << val << "': " << interr; + return -EINVAL; + } + if (n && n < (int)p.get_pg_num_target()) { + ss << "specified pg_num_max " << n + << " < pg_num " << p.get_pg_num_target(); + return -EINVAL; + } } else if (var == "recovery_priority") { if (interr.length()) { ss << "error parsing int value '" << val << "': " << interr; diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index d439cdb2e8d..f2e983f7d6e 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1350,6 +1350,8 @@ static opt_mapping_t opt_mapping = boost::assign::map_list_of pool_opts_t::FINGERPRINT_ALGORITHM, pool_opts_t::STR)) ("pg_num_min", pool_opts_t::opt_desc_t( pool_opts_t::PG_NUM_MIN, pool_opts_t::INT)) + ("pg_num_max", pool_opts_t::opt_desc_t( + pool_opts_t::PG_NUM_MAX, pool_opts_t::INT)) ("target_size_bytes", pool_opts_t::opt_desc_t( pool_opts_t::TARGET_SIZE_BYTES, pool_opts_t::INT)) ("target_size_ratio", pool_opts_t::opt_desc_t( diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index fcc3939ccde..417f9a9cb1a 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1093,6 +1093,7 @@ public: CSUM_MIN_BLOCK, FINGERPRINT_ALGORITHM, PG_NUM_MIN, // min pg_num + PG_NUM_MAX, // max pg_num TARGET_SIZE_BYTES, // total bytes in pool TARGET_SIZE_RATIO, // fraction of total cluster PG_AUTOSCALE_BIAS, -- 2.39.5