void PG::read_state(ObjectStore *store)
{
- int r = read_info(store, pg_id, coll, info, past_intervals,
- info_struct_v);
+ PastIntervals past_intervals_from_disk;
+ pg_info_t info_from_disk;
+ int r = read_info(
+ store,
+ pg_id,
+ coll,
+ info_from_disk,
+ past_intervals_from_disk,
+ info_struct_v);
ceph_assert(r >= 0);
if (info_struct_v < compat_struct_v) {
ceph_abort_msg("PG too old to upgrade");
}
- last_written_info = info;
-
- ostringstream oss;
- pg_log.read_log_and_missing(
- store,
- ch,
- pgmeta_oid,
- info,
- oss,
- cct->_conf->osd_ignore_stale_divergent_priors,
- cct->_conf->osd_debug_verify_missing_on_start);
- if (oss.tellp())
- osd->clog->error() << oss.str();
-
- // log any weirdness
- recovery_state.log_weirdness();
+ recovery_state.last_written_info = info;
+
+ recovery_state.init_from_disk_state(
+ std::move(info_from_disk),
+ std::move(past_intervals_from_disk),
+ [this, store] (PGLog &pglog) {
+ ostringstream oss;
+ pglog.read_log_and_missing(
+ store,
+ ch,
+ pgmeta_oid,
+ info,
+ oss,
+ cct->_conf->osd_ignore_stale_divergent_priors,
+ cct->_conf->osd_debug_verify_missing_on_start);
+
+ if (oss.tellp())
+ osd->clog->error() << oss.str();
+ });
if (info_struct_v < latest_struct_v) {
upgrade(store);
bool backfill,
ObjectStore::Transaction *t);
+ template <typename F>
+ void init_from_disk_state(
+ pg_info_t &&info_from_disk,
+ PastIntervals &&past_intervals_from_disk,
+ F &&pg_log_init) {
+ info = std::move(info_from_disk);
+ last_written_info = info;
+ past_intervals = std::move(past_intervals_from_disk);
+ pg_log_init(pg_log);
+ log_weirdness();
+ }
+
+
void start_split_stats(
const set<spg_t>& childpgs, vector<object_stat_sum_t> *out);
void finish_split_stats(