From: Alex Ainscow Date: Wed, 12 Feb 2025 10:23:59 +0000 (+0000) Subject: osd: Make casting to/from shard_id_t require explicit casts. X-Git-Tag: v20.3.0~320^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0d0f38fb5cfc7f1062097e0f4032632ac07f447d;p=ceph.git osd: Make casting to/from shard_id_t require explicit casts. This also required putting in many explicit casts. I avoided large amount of refactoring to the new shard for now, although I expect some may follow. The main aim here is that the new EC code is strict about using the correct shard_id_t and that confusion between shards, raw shards, OSDs, etc.. flag up as errors. Signed-off-by: Alex Ainscow --- diff --git a/src/common/hobject.cc b/src/common/hobject.cc index 53aaa996075c..648045f73f01 100644 --- a/src/common/hobject.cc +++ b/src/common/hobject.cc @@ -491,7 +491,7 @@ void ghobject_t::dump(Formatter *f) const if (generation != NO_GEN) f->dump_int("generation", generation); if (shard_id != shard_id_t::NO_SHARD) - f->dump_int("shard_id", shard_id); + f->dump_int("shard_id", int(shard_id)); f->dump_int("max", (int)max); } @@ -548,14 +548,16 @@ bool ghobject_t::parse(const string& s) // look for shard# prefix const char *start = s.c_str(); const char *p; - int sh = shard_id_t::NO_SHARD; + shard_id_t sh = shard_id_t::NO_SHARD; for (p = start; *p && isxdigit(*p); ++p) ; if (!*p && *p != '#') return false; if (p > start) { - int r = sscanf(s.c_str(), "%x", &sh); + unsigned int sh_i; + int r = sscanf(s.c_str(), "%x", &sh_i); if (r < 1) return false; + sh = shard_id_t(sh_i); start = p + 1; } else { ++start; diff --git a/src/common/scrub_types.cc b/src/common/scrub_types.cc index 4b4d191e09c3..60ae43f0d528 100644 --- a/src/common/scrub_types.cc +++ b/src/common/scrub_types.cc @@ -139,7 +139,8 @@ inconsistent_obj_wrapper::set_auth_missing(const hobject_t& hoid, else if (shard_map[pg_map.first].has_shallow_errors()) ++shallow_errors; union_shards.errors |= shard_map[pg_map.first].errors; - shards.emplace(osd_shard_t{pg_map.first.osd, pg_map.first.shard}, shard_map[pg_map.first]); + shards.emplace(osd_shard_t{pg_map.first.osd, + static_cast(pg_map.first.shard)}, shard_map[pg_map.first]); } } diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index 761d5ef50a92..870be14b6c7b 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -465,7 +465,7 @@ static ghobject_t test_ops_get_object_name( auto shard_id = cmd_getval_or(cmdmap, "shardid", - shard_id_t::NO_SHARD); + static_cast(shard_id_t::NO_SHARD)); return ghobject_t{ hobject_t{ diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h index b40f7a061a8a..b58a895ff233 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h @@ -430,7 +430,7 @@ class key_hobj_t { * common interfaces as a full_key_t */ shard_t shard() const { - return ghobj.shard_id; + return static_cast(ghobj.shard_id); } pool_t pool() const { return ghobj.hobj.pool; diff --git a/src/crimson/osd/scrub/scrub_validator.cc b/src/crimson/osd/scrub/scrub_validator.cc index 9b38d2a89eca..2274a2df14df 100644 --- a/src/crimson/osd/scrub/scrub_validator.cc +++ b/src/crimson/osd/scrub/scrub_validator.cc @@ -306,7 +306,7 @@ object_evaluation_t evaluate_object( [](auto &cand) { return cand.has_errors(); })) { for (auto &eval : shards) { iow.shards.emplace( - librados::osd_shard_t{eval.source.osd, eval.source.shard}, + librados::osd_shard_t{eval.source.osd, static_cast(eval.source.shard)}, eval.shard_info); iow.union_shards.errors |= eval.shard_info.errors; } diff --git a/src/include/types.h b/src/include/types.h index d818e7426a0f..c438395b5d9b 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -519,9 +519,12 @@ struct shard_id_t { int8_t id; shard_id_t() : id(0) {} - constexpr explicit shard_id_t(int8_t _id) : id(_id) {} + explicit constexpr shard_id_t(int8_t _id) : id(_id) {} - constexpr operator int8_t() const { return id; } + explicit constexpr operator int8_t() const { return id; } + explicit constexpr operator int64_t() const { return id; } + explicit constexpr operator int() const { return id; } + explicit constexpr operator unsigned() const { return id; } const static shard_id_t NO_SHARD; @@ -540,8 +543,26 @@ struct shard_id_t { ls.push_back(new shard_id_t(1)); ls.push_back(new shard_id_t(2)); } - bool operator==(const shard_id_t&) const = default; - auto operator<=>(const shard_id_t&) const = default; + shard_id_t& operator++() { ++id; return *this; } + friend constexpr std::strong_ordering operator<=>(const shard_id_t &lhs, + const shard_id_t &rhs) { + return lhs.id <=> rhs.id; + } + + friend constexpr std::strong_ordering operator<=>(int lhs, + const shard_id_t &rhs) { + return lhs <=> rhs.id; + } + friend constexpr std::strong_ordering operator<=>(const shard_id_t &lhs, + int rhs) { + return lhs.id <=> rhs; + } + + shard_id_t& operator=(int other) { id = other; return *this; } + bool operator==(const shard_id_t &other) const { return id == other.id; } + + shard_id_t operator+(int other) const { return shard_id_t(id + other); } + shard_id_t operator-(int other) const { return shard_id_t(id - other); } }; WRITE_CLASS_ENCODER(shard_id_t) std::ostream &operator<<(std::ostream &lhs, const shard_id_t &rhs); diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 803c78f0b80f..e290bb383555 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -374,13 +374,13 @@ void ECBackend::RecoveryBackend::handle_recovery_read_complete( for (set::iterator i = op.missing_on_shards.begin(); i != op.missing_on_shards.end(); ++i) { - target[*i] = &(op.returned_data[*i]); + target[static_cast(*i)] = &(op.returned_data[static_cast(*i)]); } map from; for(map::iterator i = to_read.get<2>().begin(); i != to_read.get<2>().end(); ++i) { - from[i->first.shard] = std::move(i->second); + from[static_cast(i->first.shard)] = std::move(i->second); } dout(10) << __func__ << ": " << from << dendl; int r; @@ -635,12 +635,12 @@ void ECBackend::RecoveryBackend::continue_recovery_op( for (set::iterator mi = op.missing_on.begin(); mi != op.missing_on.end(); ++mi) { - ceph_assert(op.returned_data.count(mi->shard)); + ceph_assert(op.returned_data.count(static_cast(mi->shard))); m->pushes[*mi].push_back(PushOp()); PushOp &pop = m->pushes[*mi].back(); pop.soid = op.hoid; pop.version = op.v; - pop.data = op.returned_data[mi->shard]; + pop.data = op.returned_data[static_cast(mi->shard)]; dout(10) << __func__ << ": before_progress=" << op.recovery_progress << ", after_progress=" << after_progress << ", pop.data.length()=" << pop.data.length() @@ -1124,11 +1124,11 @@ void ECBackend::handle_sub_read( dout(20) << __func__ << ": Checking hash of " << i->first << dendl; bufferhash h(-1); h << bl; - if (h.digest() != hinfo->get_chunk_hash(shard)) { + if (h.digest() != hinfo->get_chunk_hash(static_cast(shard))) { get_parent()->clog_error() << "Bad hash for " << i->first << " digest 0x" - << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(shard) << dec; + << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(static_cast(shard)) << dec; dout(5) << __func__ << ": Bad hash for " << i->first << " digest 0x" - << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(shard) << dec << dendl; + << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(static_cast(shard)) << dec << dendl; r = -EIO; goto error; } @@ -1305,7 +1305,7 @@ void ECBackend::handle_sub_read_reply( iter->second.returned.front().get<2>().begin(); j != iter->second.returned.front().get<2>().end(); ++j) { - have.insert(j->first.shard); + have.insert(static_cast(j->first.shard)); dout(20) << __func__ << " have shard=" << j->first.shard << dendl; } map>> dummy_minimum; @@ -1800,11 +1800,11 @@ int ECBackend::be_deep_scrub( return 0; } - if (hinfo->get_chunk_hash(get_parent()->whoami_shard().shard) != + if (hinfo->get_chunk_hash(static_cast(get_parent()->whoami_shard().shard)) != pos.data_hash.digest()) { dout(0) << "_scan_list " << poid << " got incorrect hash on read 0x" << std::hex << pos.data_hash.digest() << " != expected 0x" - << hinfo->get_chunk_hash(get_parent()->whoami_shard().shard) + << hinfo->get_chunk_hash(static_cast(get_parent()->whoami_shard().shard)) << std::dec << dendl; o.ec_hash_mismatch = true; return 0; diff --git a/src/osd/ECBackend.h b/src/osd/ECBackend.h index 5c61d839b4b5..b23214fceaaa 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -366,7 +366,7 @@ public: for (std::set::const_iterator i = _have.begin(); i != _have.end(); ++i) { - have.insert(i->shard); + have.insert(static_cast(i->shard)); } std::map>> min; return ec_impl->minimum_to_decode(want, have, &min) == 0; diff --git a/src/osd/ECBackendL.cc b/src/osd/ECBackendL.cc index 310d8509a8e2..bc299874a72a 100644 --- a/src/osd/ECBackendL.cc +++ b/src/osd/ECBackendL.cc @@ -376,13 +376,15 @@ void ECBackendL::RecoveryBackend::handle_recovery_read_complete( for (set::iterator i = op.missing_on_shards.begin(); i != op.missing_on_shards.end(); ++i) { - target[*i] = &(op.returned_data[*i]); + int s = static_cast(*i); + target[s] = &(op.returned_data[s]); } map from; for(map::iterator i = to_read.get<2>().begin(); i != to_read.get<2>().end(); ++i) { - from[i->first.shard] = std::move(i->second); + int s = static_cast(i->first.shard); + from[s] = std::move(i->second); } dout(10) << __func__ << ": " << from << dendl; int r; @@ -637,12 +639,12 @@ void ECBackendL::RecoveryBackend::continue_recovery_op( for (set::iterator mi = op.missing_on.begin(); mi != op.missing_on.end(); ++mi) { - ceph_assert(op.returned_data.count(mi->shard)); + ceph_assert(op.returned_data.count(static_cast(mi->shard))); m->pushes[*mi].push_back(PushOp()); PushOp &pop = m->pushes[*mi].back(); pop.soid = op.hoid; pop.version = op.v; - pop.data = op.returned_data[mi->shard]; + pop.data = op.returned_data[static_cast(mi->shard)]; dout(10) << __func__ << ": before_progress=" << op.recovery_progress << ", after_progress=" << after_progress << ", pop.data.length()=" << pop.data.length() @@ -1126,11 +1128,12 @@ void ECBackendL::handle_sub_read( dout(20) << __func__ << ": Checking hash of " << i->first << dendl; bufferhash h(-1); h << bl; - if (h.digest() != hinfo->get_chunk_hash(shard)) { + int s = static_cast(shard); + if (h.digest() != hinfo->get_chunk_hash(s)) { get_parent()->clog_error() << "Bad hash for " << i->first << " digest 0x" - << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(shard) << dec; + << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(s) << dec; dout(5) << __func__ << ": Bad hash for " << i->first << " digest 0x" - << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(shard) << dec << dendl; + << hex << h.digest() << " expected 0x" << hinfo->get_chunk_hash(s) << dec << dendl; r = -EIO; goto error; } @@ -1307,7 +1310,7 @@ void ECBackendL::handle_sub_read_reply( iter->second.returned.front().get<2>().begin(); j != iter->second.returned.front().get<2>().end(); ++j) { - have.insert(j->first.shard); + have.insert(static_cast(j->first.shard)); dout(20) << __func__ << " have shard=" << j->first.shard << dendl; } map>> dummy_minimum; @@ -1802,11 +1805,11 @@ int ECBackendL::be_deep_scrub( return 0; } - if (hinfo->get_chunk_hash(get_parent()->whoami_shard().shard) != - pos.data_hash.digest()) { + int s = static_cast(get_parent()->whoami_shard().shard); + if (hinfo->get_chunk_hash(s) != pos.data_hash.digest()) { dout(0) << "_scan_list " << poid << " got incorrect hash on read 0x" << std::hex << pos.data_hash.digest() << " != expected 0x" - << hinfo->get_chunk_hash(get_parent()->whoami_shard().shard) + << hinfo->get_chunk_hash(s) << std::dec << dendl; o.ec_hash_mismatch = true; return 0; diff --git a/src/osd/ECBackendL.h b/src/osd/ECBackendL.h index 5dad7f14af3c..0cf0d823c4c6 100644 --- a/src/osd/ECBackendL.h +++ b/src/osd/ECBackendL.h @@ -366,7 +366,7 @@ public: for (std::set::const_iterator i = _have.begin(); i != _have.end(); ++i) { - have.insert(i->shard); + have.insert(static_cast(i->shard)); } std::map>> min; return ec_impl->minimum_to_decode(want, have, &min) == 0; diff --git a/src/osd/ECCommon.cc b/src/osd/ECCommon.cc index 3f6eac760601..91f9b61a750e 100644 --- a/src/osd/ECCommon.cc +++ b/src/osd/ECCommon.cc @@ -229,8 +229,8 @@ void ECCommon::ReadPipeline::get_all_avail_shards( continue; } if (!missing.is_missing(hoid)) { - ceph_assert(!have.count(i->shard)); - have.insert(i->shard); + ceph_assert(!have.count(static_cast(i->shard))); + have.insert(static_cast(i->shard)); ceph_assert(!shards.count(i->shard)); shards.insert(make_pair(i->shard, *i)); } @@ -243,7 +243,7 @@ void ECCommon::ReadPipeline::get_all_avail_shards( ++i) { if (error_shards.find(*i) != error_shards.end()) continue; - if (have.count(i->shard)) { + if (have.count(static_cast(i->shard))) { ceph_assert(shards.count(i->shard)); continue; } @@ -253,7 +253,7 @@ void ECCommon::ReadPipeline::get_all_avail_shards( const pg_missing_t &missing = get_parent()->get_shard_missing(*i); if (hoid < info.last_backfill && !missing.is_missing(hoid)) { - have.insert(i->shard); + have.insert(static_cast(i->shard)); shards.insert(make_pair(i->shard, *i)); } } @@ -271,7 +271,7 @@ void ECCommon::ReadPipeline::get_all_avail_shards( } if (error_shards.find(*i) != error_shards.end()) continue; - have.insert(i->shard); + have.insert(static_cast(i->shard)); shards.insert(make_pair(i->shard, *i)); } } @@ -534,7 +534,7 @@ struct ClientReadCompleter : ECCommon::ReadCompleter { res.returned.front().get<2>().begin(); j != res.returned.front().get<2>().end(); ++j) { - to_decode[j->first.shard] = std::move(j->second); + to_decode[static_cast(j->first.shard)] = std::move(j->second); } dout(20) << __func__ << " going to decode: " << " wanted_to_read=" << wanted_to_read @@ -668,7 +668,7 @@ int ECCommon::ReadPipeline::send_all_remaining_reads( set already_read; const set& ots = rop.obj_to_source[hoid]; for (set::iterator i = ots.begin(); i != ots.end(); ++i) - already_read.insert(i->shard); + already_read.insert(static_cast(i->shard)); dout(10) << __func__ << " have/error shards=" << already_read << dendl; map>> shards; int r = get_remaining_shards(hoid, already_read, rop.want_to_read[hoid], diff --git a/src/osd/ECCommonL.cc b/src/osd/ECCommonL.cc index 0e91b011ee6a..7bf517381ca4 100644 --- a/src/osd/ECCommonL.cc +++ b/src/osd/ECCommonL.cc @@ -230,8 +230,8 @@ void ECCommonL::ReadPipeline::get_all_avail_shards( continue; } if (!missing.is_missing(hoid)) { - ceph_assert(!have.count(i->shard)); - have.insert(i->shard); + ceph_assert(!have.count(static_cast(i->shard))); + have.insert(static_cast(i->shard)); ceph_assert(!shards.count(i->shard)); shards.insert(make_pair(i->shard, *i)); } @@ -244,7 +244,7 @@ void ECCommonL::ReadPipeline::get_all_avail_shards( ++i) { if (error_shards.find(*i) != error_shards.end()) continue; - if (have.count(i->shard)) { + if (have.count(static_cast(i->shard))) { ceph_assert(shards.count(i->shard)); continue; } @@ -254,7 +254,7 @@ void ECCommonL::ReadPipeline::get_all_avail_shards( const pg_missing_t &missing = get_parent()->get_shard_missing(*i); if (hoid < info.last_backfill && !missing.is_missing(hoid)) { - have.insert(i->shard); + have.insert(static_cast(i->shard)); shards.insert(make_pair(i->shard, *i)); } } @@ -272,7 +272,7 @@ void ECCommonL::ReadPipeline::get_all_avail_shards( } if (error_shards.find(*i) != error_shards.end()) continue; - have.insert(i->shard); + have.insert(static_cast(i->shard)); shards.insert(make_pair(i->shard, *i)); } } @@ -535,7 +535,7 @@ struct ClientReadCompleter : ECCommonL::ReadCompleter { res.returned.front().get<2>().begin(); j != res.returned.front().get<2>().end(); ++j) { - to_decode[j->first.shard] = std::move(j->second); + to_decode[static_cast(j->first.shard)] = std::move(j->second); } dout(20) << __func__ << " going to decode: " << " wanted_to_read=" << wanted_to_read @@ -669,7 +669,7 @@ int ECCommonL::ReadPipeline::send_all_remaining_reads( set already_read; const set& ots = rop.obj_to_source[hoid]; for (set::iterator i = ots.begin(); i != ots.end(); ++i) - already_read.insert(i->shard); + already_read.insert(static_cast(i->shard)); dout(10) << __func__ << " have/error shards=" << already_read << dendl; map>> shards; int r = get_remaining_shards(hoid, already_read, rop.want_to_read[hoid], diff --git a/src/osd/ECTransaction.cc b/src/osd/ECTransaction.cc index 59eed567e810..7cfe995a4b92 100644 --- a/src/osd/ECTransaction.cc +++ b/src/osd/ECTransaction.cc @@ -73,8 +73,8 @@ static void encode_and_write( } for (auto &&i : *transactions) { - ceph_assert(buffers.count(i.first)); - bufferlist &enc_bl = buffers[i.first]; + ceph_assert(buffers.count(static_cast(i.first))); + bufferlist &enc_bl = buffers[static_cast(i.first)]; if (offset >= before_size) { i.second.set_alloc_hint( coll_t(spg_t(pgid, i.first)), diff --git a/src/osd/ECTransactionL.cc b/src/osd/ECTransactionL.cc index 78929096cd92..57d5c8316fc9 100644 --- a/src/osd/ECTransactionL.cc +++ b/src/osd/ECTransactionL.cc @@ -74,8 +74,8 @@ static void encode_and_write( } for (auto &&i : *transactions) { - ceph_assert(buffers.count(i.first)); - bufferlist &enc_bl = buffers[i.first]; + ceph_assert(buffers.count(static_cast(i.first))); + bufferlist &enc_bl = buffers[static_cast(i.first)]; if (offset >= before_size) { i.second.set_alloc_hint( coll_t(spg_t(pgid, i.first)), diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 649aeb56feb9..d75278f4af4a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6567,10 +6567,12 @@ void TestOpsSocketHook::test_ops(OSDService *service, ObjectStore *store, return; } - int64_t shardid = cmd_getval_or(cmdmap, "shardid", shard_id_t::NO_SHARD); + int64_t shardid64 = cmd_getval_or(cmdmap, "shardid", static_cast(shard_id_t::NO_SHARD)); + shard_id_t shardid = shard_id_t(static_cast(shardid64)); + hobject_t obj(object_t(objname), string(""), CEPH_NOSNAP, rawpg.ps(), pool, nspace); - ghobject_t gobj(obj, ghobject_t::NO_GEN, shard_id_t(uint8_t(shardid))); - spg_t pgid(curmap->raw_pg_to_pg(rawpg), shard_id_t(shardid)); + ghobject_t gobj(obj, ghobject_t::NO_GEN, shardid); + spg_t pgid(curmap->raw_pg_to_pg(rawpg), shardid); if (curmap->pg_is_ec(rawpg)) { if ((command != "injectdataerr") && (command != "injectmdataerr") && diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 86950979b9a8..93c0a2a49108 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2996,8 +2996,8 @@ int OSDMap::calc_pg_role(pg_shard_t who, const vector& acting) } } } else { - if (who.shard < nrep && acting[who.shard] == who.osd) { - return who.shard; + if (who.shard < nrep && acting[static_cast(who.shard)] == who.osd) { + return static_cast(who.shard); } } return -1; diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index 98704b681b9b..acec66e1f35a 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -208,7 +208,8 @@ void PGBackend::rollback( PGBackend *pg) : hoid(hoid), pg(pg) {} void append(uint64_t old_size) override { ObjectStore::Transaction temp; - const uint64_t shard_size = pg->object_size_to_shard_size(old_size, pg->get_parent()->whoami_shard().shard); + int s = static_cast(pg->get_parent()->whoami_shard().shard); + const uint64_t shard_size = pg->object_size_to_shard_size(old_size, s); pg->rollback_append(hoid, shard_size, &temp); temp.append(t); temp.swap(t); diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 9f111285cbc3..fcd4ee806335 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -1628,7 +1628,7 @@ void PeeringState::calc_ec_acting( for (auto j = all_info_by_shard[shard_id_t(i)].begin(); j != all_info_by_shard[shard_id_t(i)].end(); ++j) { - ceph_assert(j->shard == i); + ceph_assert(static_cast(j->shard) == i); if (!all_info.find(*j)->second.is_incomplete() && all_info.find(*j)->second.last_update >= auth_log_shard->second.log_tail) { @@ -5998,7 +5998,7 @@ PeeringState::Active::Active(my_context ctx) p != ps->acting_recovery_backfill.end(); ++p) { if (p->shard != ps->pg_whoami.shard) { - ps->blocked_by.insert(p->shard); + ps->blocked_by.insert(static_cast(p->shard)); } } pl->publish_stats_to_osd(); @@ -6174,7 +6174,7 @@ boost::statechart::result PeeringState::Active::react(const MInfoRec& infoevt) ps->peer_activated.insert(infoevt.from).second) { psdout(10) << " peer osd." << infoevt.from << " activated and committed" << dendl; - ps->blocked_by.erase(infoevt.from.shard); + ps->blocked_by.erase(static_cast(infoevt.from.shard)); pl->publish_stats_to_osd(); if (ps->peer_activated.size() == ps->acting_recovery_backfill.size()) { all_activated_and_committed(); diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index 518baa4d7042..8e83f57fa9bb 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -2242,7 +2242,7 @@ public: } static bool has_shard(bool ec, const std::vector& v, pg_shard_t osd) { if (ec) { - return v.size() > (unsigned)osd.shard && v[osd.shard] == osd.osd; + return v.size() > (unsigned)osd.shard && v[static_cast(osd.shard)] == osd.osd; } else { return std::find(v.begin(), v.end(), osd.osd) != v.end(); } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 8dde420b8d95..606604790e81 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3735,8 +3735,8 @@ void pg_notify_t::decode(ceph::buffer::list::const_iterator &bl) void pg_notify_t::dump(Formatter *f) const { - f->dump_int("from", from); - f->dump_int("to", to); + f->dump_int("from", static_cast(from)); + f->dump_int("to", static_cast(to)); f->dump_unsigned("query_epoch", query_epoch); f->dump_unsigned("epoch_sent", epoch_sent); { @@ -4476,8 +4476,8 @@ void pg_query_t::decode(ceph::buffer::list::const_iterator &bl) { void pg_query_t::dump(Formatter *f) const { - f->dump_int("from", from); - f->dump_int("to", to); + f->dump_int("from", static_cast(from)); + f->dump_int("to", static_cast(to)); f->dump_string("type", get_type_name()); f->dump_stream("since") << since; f->dump_stream("epoch_sent") << epoch_sent; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 485fddead7ac..0450924ff0f9 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -52,6 +52,7 @@ #include "compressor/Compressor.h" #include "osd_perf_counters.h" #include "pg_features.h" +#include "ECTypes.h" #define CEPH_OSD_ONDISK_MAGIC "ceph osd volume v026" @@ -194,7 +195,7 @@ struct pg_shard_t { void dump(ceph::Formatter *f) const { f->dump_unsigned("osd", osd); if (shard != shard_id_t::NO_SHARD) { - f->dump_unsigned("shard", shard); + f->dump_unsigned("shard", static_cast(shard)); } } static void generate_test_instances(std::list& o) { @@ -608,7 +609,7 @@ struct spg_t { } void dump(ceph::Formatter *f) const { f->dump_stream("pgid") << pgid; - f->dump_unsigned("shard", shard); + f->dump_unsigned("shard", static_cast(shard)); } static void generate_test_instances(std::list& o) { o.push_back(new spg_t); @@ -636,7 +637,9 @@ namespace std { size_t operator()( const spg_t& x ) const { static hash H; - return H(hash()(x.pgid) ^ x.shard); + // Historically a "shard" was an int8_t, hence the unexpected cast in + // this XOR. + return H(hash()(x.pgid) ^ static_cast(x.shard)); } }; } // namespace std diff --git a/src/osd/osd_types_fmt.h b/src/osd/osd_types_fmt.h index 100ce6e4646b..115cf06c5199 100644 --- a/src/osd/osd_types_fmt.h +++ b/src/osd/osd_types_fmt.h @@ -132,7 +132,7 @@ struct formatter { template auto format(const spg_t& spg, FormatContext& ctx) const { - if (shard_id_t::NO_SHARD == spg.shard.id) { + if (shard_id_t::NO_SHARD == spg.shard) { return fmt::format_to(ctx.out(), "{}", spg.pgid); } else { return fmt::format_to(ctx.out(), "{}s{}", spg.pgid, spg.shard.id); diff --git a/src/test/crimson/test_crimson_scrub.cc b/src/test/crimson/test_crimson_scrub.cc index 22b417ffd154..1cd76988130c 100644 --- a/src/test/crimson/test_crimson_scrub.cc +++ b/src/test/crimson/test_crimson_scrub.cc @@ -854,7 +854,7 @@ TEST_P(TestSingleError, SingleError) { bool found_selected_oi = false; for (const auto &shard : shards) { auto siter = obj_error.shards.find( - librados::osd_shard_t{shard.osd, shard.shard} + librados::osd_shard_t{shard.osd, static_cast(shard.shard)} ); if (siter == obj_error.shards.end()) { EXPECT_NE(siter, obj_error.shards.end()); diff --git a/src/tools/rados/rados.cc b/src/tools/rados/rados.cc index fb7255684093..caab36ea9c06 100644 --- a/src/tools/rados/rados.cc +++ b/src/tools/rados/rados.cc @@ -1712,7 +1712,7 @@ static void dump_inconsistent(const inconsistent_obj_t& inc, f.dump_int("osd", osd_shard.osd); f.dump_bool("primary", shard_info.second.primary); auto shard = osd_shard.shard; - if (shard != shard_id_t::NO_SHARD) + if (shard != static_cast(shard_id_t::NO_SHARD)) f.dump_unsigned("shard", shard); dump_shard(shard_info.second, inc, f); f.close_section();