std::move(ec_profile),
osdmap,
cluster_msgr}};
- return seastar::make_ready_future<Ref<PG>>(std::move(pg));
+ return pg->read_state(store.get()).then([pg] {
+ return seastar::make_ready_future<Ref<PG>>(std::move(pg));
+ });
});
}
#include "osd/OSDMap.h"
+#include "crimson/os/cyan_store.h"
+#include "crimson/osd/pg_meta.h"
+
PG::PG(spg_t pgid,
pg_shard_t pg_shard,
: pgid{pgid},
whoami{pg_shard},
pool{std::move(pool)},
+ info{pgid},
osdmap{osdmap},
msgr{msgr}
{
// TODO
}
+seastar::future<> PG::read_state(ceph::os::CyanStore* store)
+{
+ return PGMeta{store, pgid}.load().then(
+ [this](pg_info_t pg_info_, PastIntervals past_intervals_) {
+ last_written_info = std::move(pg_info_);
+ past_intervals = std::move(past_intervals_);
+ return seastar::now();
+ });
+}
+
epoch_t PG::get_osdmap_epoch() const
{
return osdmap->get_epoch();
{
return whoami;
}
+
+const pg_info_t& PG::get_info() const
+{
+ return info;
+}
+
+const PastIntervals& PG::get_past_intervals() const
+{
+ return past_intervals;
+}
class Messenger;
}
+namespace ceph::os {
+ class CyanStore;
+}
+
class PG : public boost::intrusive_ref_counter<
PG,
boost::thread_unsafe_counter>
ceph::net::Messenger* msgr);
epoch_t get_osdmap_epoch() const;
+ const pg_info_t& get_info() const;
+ const PastIntervals& get_past_intervals() const;
pg_shard_t get_whoami() const;
+ seastar::future<> read_state(ceph::os::CyanStore* store);
+
private:
const spg_t pgid;
pg_shard_t whoami;
pg_pool_t pool;
+ //< pg state
+ pg_info_t info;
+ //< last written info, for fast info persistence
+ pg_info_t last_written_info;
+ PastIntervals past_intervals;
+
cached_map_t osdmap;
ceph::net::Messenger* msgr = nullptr;
};