return hobj.is_internal_pg_local();
}
+ /**
+ * SNAPMAPPER_OID, make_snapmapper, is_snapmapper
+ *
+ * Used exclusively by crimson at this time.
+ *
+ * Unlike classic, crimson uses a snap mapper object for each pg.
+ * The snapmapper object provides an index for efficient trimming of clones as
+ * snapshots are removed.
+ *
+ * As with the pgmeta object, we pin the hash to the pg hash.
+ */
+ static constexpr std::string_view SNAPMAPPER_OID = "snapmapper";
+ static ghobject_t make_snapmapper(
+ int64_t pool, uint32_t hash, shard_id_t shard) {
+ hobject_t h(object_t(SNAPMAPPER_OID), std::string(),
+ CEPH_NOSNAP, hash, pool,
+ std::string(hobject_t::INTERNAL_PG_LOCAL_NS));
+ return ghobject_t(h, NO_GEN, shard);
+ }
+
bool match(uint32_t bits, uint32_t match) const {
return hobj.match_hash(hobj.hash, bits, match);
}
}
}
-static inline bool is_snapmapper_oid(const hobject_t &obj) {
- return obj.oid.name == SNAPMAPPER_OID;
-}
-
static PG::interruptible_future<ceph::bufferlist> do_pgnls_common(
const hobject_t& pg_start,
const hobject_t& pg_end,
[&backend, filter, nspace](auto&& ret)
-> PG::interruptible_future<std::tuple<std::vector<hobject_t>, hobject_t>> {
auto& [objects, next] = ret;
- auto is_snapmapper = [](const hobject_t &obj) {
- if (is_snapmapper_oid(obj)) {
- return false;
- } else {
- return true;
- }
- };
auto in_my_namespace = [&nspace](const hobject_t& obj) {
using crimson::common::local_conf;
if (obj.get_namespace() == local_conf()->osd_hit_set_namespace) {
}
};
- auto range = objects | boost::adaptors::filtered(is_snapmapper)
- | boost::adaptors::filtered(in_my_namespace)
+ auto range = objects | boost::adaptors::filtered(in_my_namespace)
| boost::adaptors::transformed(to_pglsed);
logger().debug("do_pgnls_common: finishing the 1st stage of pgls");
return seastar::when_all_succeed(std::begin(range),
PG::interruptor::map_reduce(std::move(objects),
[&backend, filter, nspace](const hobject_t& obj)
-> PG::interruptible_future<hobject_t>{
- if (is_snapmapper_oid(obj)) {
- return seastar::make_ready_future<hobject_t>();
- }
if (obj.get_namespace() == nspace) {
if (filter) {
return pgls_filter(*filter, backend, obj);
osdriver(
&shard_services.get_store(),
coll_ref,
- make_snapmapper_oid()),
+ pgid.make_snapmapper_oid()),
snap_mapper(
this->shard_services.get_cct(),
&osdriver,
new_acting_primary, history, pi, t);
assert(coll_ref);
return shard_services.get_store().exists(
- get_collection_ref(), make_snapmapper_oid()
+ get_collection_ref(), pgid.make_snapmapper_oid()
).safe_then([&t, this](bool existed) {
if (!existed) {
- t.touch(coll_ref->get_cid(), make_snapmapper_oid());
+ t.touch(coll_ref->get_cid(), pgid.make_snapmapper_oid());
}
},
::crimson::ct_error::assert_all{"unexpected eio"}
#include "crimson/osd/object_context_loader.h"
#include "crimson/osd/scrub/pg_scrubber.h"
-#define SNAPMAPPER_OID "snapmapper"
-
class MQuery;
class OSDMap;
class PGBackend;
private:
OSDriver osdriver;
SnapMapper snap_mapper;
- ghobject_t make_snapmapper_oid() const {
- return ghobject_t(hobject_t(
- sobject_t(
- object_t(SNAPMAPPER_OID),
- 0),
- std::string(),
- pgid.ps(),
- pgid.pool(),
- std::string()));
- }
public:
// PeeringListener
void publish_stats_to_osd() final;
return ghobject_t::make_pgmeta(pgid.pool(), pgid.ps(), shard);
}
+ ghobject_t make_snapmapper_oid() const {
+ return ghobject_t::make_snapmapper(pgid.pool(), pgid.ps(), shard);
+ }
+
void encode(ceph::buffer::list &bl) const {
ENCODE_START(1, 1, bl);
encode(pgid, bl);