From: MingXin Liu Date: Thu, 21 May 2015 12:21:50 +0000 (+0800) Subject: Osd: add two fields to pg_pool_t X-Git-Tag: v10.0.1~72^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e62909460fd87e375eeb68ea4b77164633733c46;p=ceph.git Osd: add two fields to pg_pool_t Signed-off-by: MingXin Liu Reviewed-by: Li Wang --- diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 849a70d59cdc..3cf41bd2572a 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -889,7 +889,6 @@ void pool_snap_info_t::generate_test_instances(list& o) o.back()->name = "foo"; } - // -- pg_pool_t -- void pg_pool_t::dump(Formatter *f) const @@ -947,6 +946,12 @@ void pg_pool_t::dump(Formatter *f) const f->dump_bool("use_gmt_hitset", use_gmt_hitset); f->dump_unsigned("min_read_recency_for_promote", min_read_recency_for_promote); f->dump_unsigned("min_write_recency_for_promote", min_write_recency_for_promote); + f->dump_unsigned("hit_set_grade_decay_rate", hit_set_grade_decay_rate); + f->dump_unsigned("hit_set_search_last_n", hit_set_search_last_n); + f->open_array_section("grade_table"); + for (unsigned i = 0; i < hit_set_count; ++i) + f->dump_unsigned("value", get_grade(i)); + f->close_section(); f->dump_unsigned("stripe_width", get_stripe_width()); f->dump_unsigned("expected_num_objects", expected_num_objects); f->dump_bool("fast_read", fast_read); @@ -1259,7 +1264,7 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const return; } - ENCODE_START(22, 5, bl); + ENCODE_START(23, 5, bl); ::encode(type, bl); ::encode(size, bl); ::encode(crush_ruleset, bl); @@ -1305,12 +1310,14 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const ::encode(min_write_recency_for_promote, bl); ::encode(use_gmt_hitset, bl); ::encode(fast_read, bl); + ::encode(hit_set_grade_decay_rate, bl); + ::encode(hit_set_search_last_n, bl); ENCODE_FINISH(bl); } void pg_pool_t::decode(bufferlist::iterator& bl) { - DECODE_START_LEGACY_COMPAT_LEN(22, 5, 5, bl); + DECODE_START_LEGACY_COMPAT_LEN(23, 5, 5, bl); ::decode(type, bl); ::decode(size, bl); ::decode(crush_ruleset, bl); @@ -1442,8 +1449,16 @@ void pg_pool_t::decode(bufferlist::iterator& bl) } else { fast_read = false; } + if (struct_v >= 23) { + ::decode(hit_set_grade_decay_rate, bl); + ::decode(hit_set_search_last_n, bl); + } else { + hit_set_grade_decay_rate = 0; + hit_set_search_last_n = 1; + } DECODE_FINISH(bl); calc_pg_masks(); + calc_grade_table(); } void pg_pool_t::generate_test_instances(list& o) @@ -1489,6 +1504,9 @@ void pg_pool_t::generate_test_instances(list& o) a.hit_set_count = 8; a.min_read_recency_for_promote = 1; a.min_write_recency_for_promote = 1; + a.hit_set_grade_decay_rate = 50; + a.hit_set_search_last_n = 1; + a.calc_grade_table(); a.set_stripe_width(12345); a.target_max_bytes = 1238132132; a.target_max_objects = 1232132; @@ -1542,7 +1560,9 @@ ostream& operator<<(ostream& out, const pg_pool_t& p) if (p.hit_set_params.get_type() != HitSet::TYPE_NONE) { out << " hit_set " << p.hit_set_params << " " << p.hit_set_period << "s" - << " x" << p.hit_set_count; + << " x" << p.hit_set_count << " decay_rate " + << p.hit_set_grade_decay_rate + << " search_last_n " << p.hit_set_search_last_n; } if (p.min_read_recency_for_promote) out << " min_read_recency_for_promote " << p.min_read_recency_for_promote; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index adcceee497cf..0f127f06dd43 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1104,6 +1104,9 @@ public: hit_set_params = HitSet::Params(); hit_set_period = 0; hit_set_count = 0; + hit_set_grade_decay_rate = 0; + hit_set_search_last_n = 0; + grade_table.resize(0); } uint64_t target_max_bytes; ///< tiering: target max pool size @@ -1122,6 +1125,10 @@ public: bool use_gmt_hitset; ///< use gmt to name the hitset archive object uint32_t min_read_recency_for_promote; ///< minimum number of HitSet to check before promote on read uint32_t min_write_recency_for_promote; ///< minimum number of HitSet to check before promote on write + uint32_t hit_set_grade_decay_rate; ///< current hit_set has highest priority on objects + ///temperature count,the follow hit_set's priority decay + ///by this params than pre hit_set + uint32_t hit_set_search_last_n; /// grade_table; + +public: + uint32_t get_grade(unsigned i) const { + if (grade_table.size() <= i) + return 0; + return grade_table[i]; + } + void calc_grade_table() { + unsigned v = 1000000; + grade_table.resize(hit_set_count); + for (unsigned i = 0; i < hit_set_count; i++) { + v = v * (1 - (hit_set_grade_decay_rate / 100.0)); + grade_table[i] = v; + } + } + pg_pool_t() : flags(0), type(0), size(0), min_size(0), crush_ruleset(0), object_hash(0), @@ -1154,6 +1179,8 @@ public: use_gmt_hitset(true), min_read_recency_for_promote(0), min_write_recency_for_promote(0), + hit_set_grade_decay_rate(0), + hit_set_search_last_n(0), stripe_width(0), expected_num_objects(0), fast_read(false)