return;
}
- uint8_t v = 32;
+ uint8_t v = 33;
// NOTE: any new encoding dependencies must be reflected by
// SIGNIFICANT_FEATURES
if (!HAVE_SIGNIFICANT_FEATURE(features, SERVER_TENTACLE)) {
if (v >= 32) {
encode(nonprimary_shards, bl);
}
+ if (v >= 33) {
+ encode(shard_mapping, bl);
+ }
ENCODE_FINISH(bl);
}
} else {
nonprimary_shards.clear();
}
+
+ if (struct_v >= 33) {
+ decode(shard_mapping, bl);
+ } else {
+ shard_mapping.clear();
+ }
DECODE_FINISH(bl);
calc_pg_masks();
calc_grade_table();
private:
std::vector<uint32_t> grade_table;
+ std::vector<shard_id_t> shard_mapping; // Used by EC direct reads.
public:
uint32_t get_grade(unsigned i) const {
return !nonprimary_shards.empty() && nonprimary_shards.contains(shard);
}
+ void set_shard_mapping(std::vector<shard_id_t> && mapping) {
+ shard_mapping = mapping;
+ }
+
+ shard_id_t get_shard(raw_shard_id_t raw) const {
+ if (shard_mapping.size() == 0) {
+ return shard_id_t((int)raw);
+ }
+ return shard_mapping[(int)raw];
+ }
+
void encode(ceph::buffer::list& bl, uint64_t features) const;
void decode(ceph::buffer::list::const_iterator& bl);