Skip to content

Commit 52ab44a

Browse files
authored
Merge pull request ceph#62140 from rzarzynski/wip-nitzan-pg_pool_t-encode-decode-versions-compability
osd_type: decouple is_stretch_pool() from versioning of pg_pool_t's schema Reviewed-by: Kamoltat Sirivadhna <[email protected]> Reviewed-by: Nitzan Mordechai <[email protected]>
2 parents 1f9e691 + f2b3bc8 commit 52ab44a

File tree

3 files changed

+158
-16
lines changed

3 files changed

+158
-16
lines changed

src/osd/osd_types.cc

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,21 +1955,25 @@ void pg_pool_t::encode(ceph::buffer::list& bl, uint64_t features) const
19551955
return;
19561956
}
19571957

1958-
uint8_t v = 30;
1958+
uint8_t v = 31;
19591959
// NOTE: any new encoding dependencies must be reflected by
19601960
// SIGNIFICANT_FEATURES
1961-
if (!(features & CEPH_FEATURE_NEW_OSDOP_ENCODING)) {
1962-
// this was the first post-hammer thing we added; if it's missing, encode
1963-
// like hammer.
1964-
v = 21;
1965-
} else if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
1966-
v = 24;
1967-
} else if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
1968-
v = 26;
1969-
} else if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
1970-
v = 27;
1971-
} else if (!is_stretch_pool()) {
1972-
v = 29;
1961+
if (!HAVE_FEATURE(features, SERVER_TENTACLE)) {
1962+
if (!(features & CEPH_FEATURE_NEW_OSDOP_ENCODING)) {
1963+
// this was the first post-hammer thing we added; if it's missing, encode
1964+
// like hammer.
1965+
v = 21;
1966+
} else if (!HAVE_FEATURE(features, SERVER_LUMINOUS)) {
1967+
v = 24;
1968+
} else if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
1969+
v = 26;
1970+
} else if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
1971+
v = 27;
1972+
} else if (!is_stretch_pool()) {
1973+
v = 29;
1974+
} else {
1975+
v = 30;
1976+
}
19731977
}
19741978

19751979
ENCODE_START(v, 5, bl);
@@ -2060,18 +2064,22 @@ void pg_pool_t::encode(ceph::buffer::list& bl, uint64_t features) const
20602064
if (v >= 29) {
20612065
encode(last_pg_merge_meta, bl);
20622066
}
2063-
if (v >= 30) {
2067+
if (v == 30) {
20642068
encode(peering_crush_bucket_count, bl);
20652069
encode(peering_crush_bucket_target, bl);
20662070
encode(peering_crush_bucket_barrier, bl);
20672071
encode(peering_crush_mandatory_member, bl);
20682072
}
2073+
if (v >= 31) {
2074+
auto maybe_peering_crush_data1 = maybe_peering_crush_data();
2075+
encode(maybe_peering_crush_data1, bl);
2076+
}
20692077
ENCODE_FINISH(bl);
20702078
}
20712079

20722080
void pg_pool_t::decode(ceph::buffer::list::const_iterator& bl)
20732081
{
2074-
DECODE_START_LEGACY_COMPAT_LEN(30, 5, 5, bl);
2082+
DECODE_START_LEGACY_COMPAT_LEN(31, 5, 5, bl);
20752083
decode(type, bl);
20762084
decode(size, bl);
20772085
decode(crush_rule, bl);
@@ -2246,12 +2254,22 @@ void pg_pool_t::decode(ceph::buffer::list::const_iterator& bl)
22462254
last_force_op_resend = last_force_op_resend_prenautilus;
22472255
pg_autoscale_mode = pg_autoscale_mode_t::WARN; // default to warn on upgrade
22482256
}
2249-
if (struct_v >= 30) {
2257+
if (struct_v == 30) {
22502258
decode(peering_crush_bucket_count, bl);
22512259
decode(peering_crush_bucket_target, bl);
22522260
decode(peering_crush_bucket_barrier, bl);
22532261
decode(peering_crush_mandatory_member, bl);
22542262
}
2263+
if (struct_v >= 31) {
2264+
std::optional<std::tuple<uint32_t,uint32_t,uint32_t,uint32_t>> peering_crush_data;
2265+
decode(peering_crush_data, bl);
2266+
if (peering_crush_data) {
2267+
std::tie(peering_crush_bucket_count,
2268+
peering_crush_bucket_target,
2269+
peering_crush_bucket_barrier,
2270+
peering_crush_mandatory_member) = *peering_crush_data;
2271+
}
2272+
}
22552273
DECODE_FINISH(bl);
22562274
calc_pg_masks();
22572275
calc_grade_table();
@@ -2355,6 +2373,13 @@ void pg_pool_t::generate_test_instances(list<pg_pool_t*>& o)
23552373
a.fast_read = false;
23562374
a.application_metadata = {{"rbd", {{"key", "value"}}}};
23572375
o.push_back(new pg_pool_t(a));
2376+
2377+
// test stretch CRUSH buckets
2378+
a.peering_crush_bucket_count = 10;
2379+
a.peering_crush_bucket_barrier = 11;
2380+
a.peering_crush_mandatory_member = 12;
2381+
a.peering_crush_bucket_target = 13;
2382+
o.push_back(new pg_pool_t(a));
23582383
}
23592384

23602385
ostream& operator<<(ostream& out, const pg_pool_t& p)

src/osd/osd_types.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,6 +1567,18 @@ struct pg_pool_t {
15671567
bool is_stretch_pool() const {
15681568
return peering_crush_bucket_count != 0;
15691569
}
1570+
1571+
std::optional<std::tuple<uint32_t,uint32_t,uint32_t,uint32_t>> maybe_peering_crush_data() const {
1572+
if (!is_stretch_pool()) {
1573+
return std::nullopt;
1574+
} else {
1575+
return std::make_optional(std::tuple<uint32_t,uint32_t,uint32_t,uint32_t>(peering_crush_bucket_count,
1576+
peering_crush_bucket_target ,
1577+
peering_crush_bucket_barrier,
1578+
peering_crush_mandatory_member
1579+
));
1580+
}
1581+
}
15701582

15711583
bool stretch_set_can_peer(const std::set<int>& want, const OSDMap& osdmap,
15721584
std::ostream *out) const;

src/test/osd/types.cc

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,111 @@
2929

3030
using namespace std;
3131

32+
void compare_pg_pool_t(const pg_pool_t l, const pg_pool_t r)
33+
{
34+
ASSERT_EQ(l.type, r.type);
35+
ASSERT_EQ(l.size, r.size);
36+
ASSERT_EQ(l.crush_rule, r.crush_rule);
37+
ASSERT_EQ(l.object_hash, r.object_hash);
38+
ASSERT_EQ(l.last_change, r.last_change);
39+
ASSERT_EQ(l.snap_seq, r.snap_seq);
40+
ASSERT_EQ(l.snap_epoch, r.snap_epoch);
41+
//ASSERT_EQ(l.snaps, r.snaps);
42+
ASSERT_EQ(l.removed_snaps, r.removed_snaps);
43+
ASSERT_EQ(l.auid, r.auid);
44+
ASSERT_EQ(l.flags, r.flags);
45+
ASSERT_EQ(l.min_size, r.min_size);
46+
ASSERT_EQ(l.quota_max_bytes, r.quota_max_bytes);
47+
ASSERT_EQ(l.quota_max_objects, r.quota_max_objects);
48+
ASSERT_EQ(l.tiers, r.tiers);
49+
ASSERT_EQ(l.tier_of, r.tier_of);
50+
ASSERT_EQ(l.read_tier, r.read_tier);
51+
ASSERT_EQ(l.write_tier, r.write_tier);
52+
ASSERT_EQ(l.properties, r.properties);
53+
//ASSERT_EQ(l.hit_set_params, r.hit_set_params);
54+
//ASSERT_EQ(l.hit_set_period, r.hit_set_period);
55+
//ASSERT_EQ(l.hit_set_count, r.hit_set_count);
56+
ASSERT_EQ(l.stripe_width, r.stripe_width);
57+
ASSERT_EQ(l.target_max_bytes, r.target_max_bytes);
58+
ASSERT_EQ(l.target_max_objects, r.target_max_objects);
59+
ASSERT_EQ(l.cache_target_dirty_ratio_micro, r.cache_target_dirty_ratio_micro);
60+
ASSERT_EQ(l.cache_target_full_ratio_micro, r.cache_target_full_ratio_micro);
61+
ASSERT_EQ(l.cache_min_flush_age, r.cache_min_flush_age);
62+
ASSERT_EQ(l.cache_min_evict_age, r.cache_min_evict_age);
63+
ASSERT_EQ(l.erasure_code_profile, r.erasure_code_profile);
64+
ASSERT_EQ(l.last_force_op_resend_preluminous, r.last_force_op_resend_preluminous);
65+
ASSERT_EQ(l.min_read_recency_for_promote, r.min_read_recency_for_promote);
66+
ASSERT_EQ(l.expected_num_objects, r.expected_num_objects);
67+
ASSERT_EQ(l.cache_target_dirty_high_ratio_micro, r.cache_target_dirty_high_ratio_micro);
68+
ASSERT_EQ(l.min_write_recency_for_promote, r.min_write_recency_for_promote);
69+
ASSERT_EQ(l.use_gmt_hitset, r.use_gmt_hitset);
70+
ASSERT_EQ(l.fast_read, r.fast_read);
71+
ASSERT_EQ(l.hit_set_grade_decay_rate, r.hit_set_grade_decay_rate);
72+
ASSERT_EQ(l.hit_set_search_last_n, r.hit_set_search_last_n);
73+
//ASSERT_EQ(l.opts, r.opts);
74+
ASSERT_EQ(l.last_force_op_resend_prenautilus, r.last_force_op_resend_prenautilus);
75+
ASSERT_EQ(l.application_metadata, r.application_metadata);
76+
ASSERT_EQ(l.create_time, r.create_time);
77+
ASSERT_EQ(l.get_pg_num_target(), r.get_pg_num_target());
78+
ASSERT_EQ(l.get_pgp_num_target(), r.get_pgp_num_target());
79+
ASSERT_EQ(l.get_pg_num_pending(), r.get_pg_num_pending());
80+
ASSERT_EQ(l.last_force_op_resend, r.last_force_op_resend);
81+
ASSERT_EQ(l.pg_autoscale_mode, r.pg_autoscale_mode);
82+
ASSERT_EQ(l.last_pg_merge_meta.source_pgid, r.last_pg_merge_meta.source_pgid);
83+
ASSERT_EQ(l.peering_crush_bucket_count, r.peering_crush_bucket_count);
84+
ASSERT_EQ(l.peering_crush_bucket_target, r.peering_crush_bucket_target);
85+
ASSERT_EQ(l.peering_crush_bucket_barrier, r.peering_crush_bucket_barrier);
86+
ASSERT_EQ(l.peering_crush_mandatory_member, r.peering_crush_mandatory_member);
87+
ASSERT_EQ(l.peering_crush_bucket_count , r.peering_crush_bucket_count);
88+
ASSERT_EQ(l.peering_crush_bucket_target , r.peering_crush_bucket_target);
89+
ASSERT_EQ(l.peering_crush_bucket_barrier , r.peering_crush_bucket_barrier);
90+
ASSERT_EQ(l.peering_crush_mandatory_member , r.peering_crush_mandatory_member);
91+
}
92+
93+
TEST(pg_pool_t, encodeDecode)
94+
{
95+
uint64_t features = CEPH_FEATURE_CRUSH_TUNABLES5 |
96+
CEPH_FEATURE_INCARNATION_2 |
97+
CEPH_FEATURE_PGPOOL3 |
98+
CEPH_FEATURE_OSDENC |
99+
CEPH_FEATURE_OSD_POOLRESEND |
100+
CEPH_FEATURE_NEW_OSDOP_ENCODING |
101+
CEPH_FEATUREMASK_SERVER_LUMINOUS |
102+
CEPH_FEATUREMASK_SERVER_MIMIC |
103+
CEPH_FEATUREMASK_SERVER_NAUTILUS;
104+
{
105+
pg_pool_t p;
106+
std::list<pg_pool_t*> pools;
107+
108+
p.generate_test_instances(pools);
109+
for(auto p1 : pools){
110+
bufferlist bl;
111+
p1->encode(bl, features);
112+
bl.hexdump(std::cout);
113+
auto pbl = bl.cbegin();
114+
pg_pool_t p2;
115+
p2.decode(pbl);
116+
compare_pg_pool_t(*p1, p2);
117+
}
118+
}
119+
120+
{
121+
// test reef
122+
pg_pool_t p;
123+
std::list<pg_pool_t*> pools;
124+
p.generate_test_instances(pools);
125+
for(auto p1 : pools){
126+
bufferlist bl;
127+
p1->encode(bl, features|CEPH_FEATUREMASK_SERVER_REEF);
128+
bl.hexdump(std::cout);
129+
auto pbl = bl.cbegin();
130+
pg_pool_t p2;
131+
p2.decode(pbl);
132+
compare_pg_pool_t(*p1, p2);
133+
}
134+
}
135+
}
136+
32137
TEST(hobject, prefixes0)
33138
{
34139
uint32_t mask = 0xE947FA20;

0 commit comments

Comments
 (0)