osdriver(
&shard_services.get_store(),
coll_ref,
- pgid.make_pgmeta_oid()),
+ make_snapmapper_oid()),
snap_mapper(
this->shard_services.get_cct(),
&osdriver,
}
-void PG::init(
+seastar::future<> PG::init(
int role,
const vector<int>& newup, int new_up_primary,
const vector<int>& newacting, int new_acting_primary,
peering_state.init(
role, newup, new_up_primary, newacting,
new_acting_primary, history, pi, t);
+ assert(coll_ref);
+ return shard_services.get_store().exists(
+ get_collection_ref(), make_snapmapper_oid()
+ ).safe_then([&t, this](bool existed) {
+ if (!existed) {
+ t.touch(coll_ref->get_cid(), make_snapmapper_oid());
+ }
+ },
+ ::crimson::ct_error::assert_all{"unexpected eio"}
+ );
}
seastar::future<> PG::read_state(crimson::os::FuturizedStore::Shard* store)
#include "crimson/osd/object_context_loader.h"
#include "crimson/osd/scrub/pg_scrubber.h"
+#define SNAPMAPPER_OID "snapmapper"
+
class MQuery;
class OSDMap;
class PGBackend;
}
/// initialize created PG
- void init(
+ seastar::future<> init(
int role,
const std::vector<int>& up,
int up_primary,
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;
void clear_publish_stats() final;
pg_stat_t get_stats() const;
+
private:
std::optional<pg_stat_t> pg_stats;
pg_shard_t(local_state.whoami, info->pgid.shard),
acting);
- PeeringCtx rctx;
+ std::unique_ptr<PeeringCtx> rctx = std::make_unique<PeeringCtx>();
create_pg_collection(
- rctx.transaction,
+ rctx->transaction,
info->pgid,
info->pgid.get_split_bits(pp->get_pg_num()));
init_pg_ondisk(
- rctx.transaction,
+ rctx->transaction,
info->pgid,
pp);
- pg->init(
+ return pg->init(
role,
up,
up_primary,
acting_primary,
info->history,
info->past_intervals,
- rctx.transaction);
-
- return start_operation<PGAdvanceMap>(
- pg, *this, get_map()->get_epoch(), std::move(rctx), true
- ).second.then([pg=pg] {
- return seastar::make_ready_future<Ref<PG>>(pg);
+ rctx->transaction
+ ).then([this, pg=pg, rctx=std::move(rctx)] {
+ return start_operation<PGAdvanceMap>(
+ pg, *this, get_map()->get_epoch(), std::move(*rctx), true
+ ).second.then([pg=pg] {
+ return seastar::make_ready_future<Ref<PG>>(pg);
+ });
});
});
});