From 88ae4bb0679c7fe0002ecbbc0f23f65e3802b8b4 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 26 Dec 2016 10:14:12 -0500 Subject: [PATCH] mon/OSDMonitor: ceph osd pool get/set crush_rule by name This means users don't have to manually translate a rule they just created to a ruleset ID in order to map a pool to it. Signed-off-by: Sage Weil --- qa/workunits/cephtool/test.sh | 3 ++- src/mon/MonCommands.h | 4 ++-- src/mon/OSDMonitor.cc | 36 +++++++++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 6ff62df586533..27f5ecbc1c5c9 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1441,7 +1441,7 @@ function test_mon_osd_pool_set() wait_for_clean ceph osd pool get $TEST_POOL_GETSET all - for s in pg_num pgp_num size min_size crash_replay_interval crush_ruleset; do + for s in pg_num pgp_num size min_size crash_replay_interval crush_rule crush_ruleset; do ceph osd pool get $TEST_POOL_GETSET $s done @@ -1545,6 +1545,7 @@ function test_mon_osd_pool_set() ceph osd pool delete $TEST_POOL_GETSET $TEST_POOL_GETSET --yes-i-really-really-mean-it ceph osd pool get rbd crush_ruleset | grep 'crush_ruleset: 0' + ceph osd pool get rbd crush_rule | grep 'crush_rule: ' } function test_mon_osd_tiered_pool_set() diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 6cf911e47e608..b807e04068929 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -739,11 +739,11 @@ COMMAND("osd pool rename " \ "rename to ", "osd", "rw", "cli,rest") COMMAND("osd pool get " \ "name=pool,type=CephPoolname " \ - "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|auid|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", \ + "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_rule|crush_ruleset|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|auid|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", \ "get pool parameter ", "osd", "r", "cli,rest") COMMAND("osd pool set " \ "name=pool,type=CephPoolname " \ - "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|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|debug_fake_ec_pool|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|auid|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|debug_white_box_testing_ec_overwrites " \ + "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_rule|crush_ruleset|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|debug_fake_ec_pool|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|auid|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|debug_white_box_testing_ec_overwrites " \ "name=val,type=CephString " \ "name=force,type=CephChoices,strings=--yes-i-really-mean-it,req=false", \ "set pool parameter to ", "osd", "rw", "cli,rest") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 23b9a906c1c15..8c6c5fb0fa828 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3167,7 +3167,7 @@ void OSDMonitor::dump_info(Formatter *f) namespace { enum osd_pool_get_choices { SIZE, MIN_SIZE, CRASH_REPLAY_INTERVAL, - PG_NUM, PGP_NUM, CRUSH_RULESET, HASHPSPOOL, + PG_NUM, PGP_NUM, CRUSH_RULE, CRUSH_RULESET, HASHPSPOOL, NODELETE, NOPGCHANGE, NOSIZECHANGE, WRITE_FADVISE_DONTNEED, NOSCRUB, NODEEP_SCRUB, HIT_SET_TYPE, HIT_SET_PERIOD, HIT_SET_COUNT, HIT_SET_FPP, @@ -3652,7 +3652,9 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) {"size", SIZE}, {"min_size", MIN_SIZE}, {"crash_replay_interval", CRASH_REPLAY_INTERVAL}, - {"pg_num", PG_NUM}, {"pgp_num", PGP_NUM}, {"crush_ruleset", CRUSH_RULESET}, + {"pg_num", PG_NUM}, {"pgp_num", PGP_NUM}, + {"crush_rule", CRUSH_RULE}, + {"crush_ruleset", CRUSH_RULESET}, {"hashpspool", HASHPSPOOL}, {"nodelete", NODELETE}, {"nopgchange", NOPGCHANGE}, {"nosizechange", NOSIZECHANGE}, {"noscrub", NOSCRUB}, {"nodeep-scrub", NODEEP_SCRUB}, @@ -3770,6 +3772,14 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) f->dump_int("crash_replay_interval", p->get_crash_replay_interval()); break; + case CRUSH_RULE: + if (osdmap.crush->rule_exists(p->get_crush_ruleset())) { + f->dump_string("crush_rule", osdmap.crush->get_rule_name( + p->get_crush_ruleset())); + } else { + f->dump_string("crush_rule", stringify(p->get_crush_ruleset())); + } + break; case CRUSH_RULESET: f->dump_int("crush_ruleset", p->get_crush_ruleset()); break; @@ -3926,6 +3936,14 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) ss << "crash_replay_interval: " << p->get_crash_replay_interval() << "\n"; break; + case CRUSH_RULE: + if (osdmap.crush->rule_exists(p->get_crush_ruleset())) { + ss << "crush_rule: " << osdmap.crush->get_rule_name( + p->get_crush_ruleset()) << "\n"; + } else { + ss << "crush_rule: " << p->get_crush_ruleset() << "\n"; + } + break; case CRUSH_RULESET: ss << "crush_ruleset: " << p->get_crush_ruleset() << "\n"; break; @@ -5317,6 +5335,20 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, } } p.set_pgp_num(n); + } else if (var == "crush_rule") { + int id = osdmap.crush->get_rule_id(val); + if (id == -ENOENT) { + ss << "crush rule " << val << " does not exist"; + return -ENOENT; + } + if (id < 0) { + ss << cpp_strerror(id); + return -ENOENT; + } + if (!osdmap.crush->check_crush_rule(id, p.get_type(), p.get_size(), ss)) { + return -EINVAL; + } + p.crush_ruleset = id; } else if (var == "crush_ruleset") { if (interr.length()) { ss << "error parsing integer value '" << val << "': " << interr; -- 2.39.5