From a428973054f7b627ced792da62a0ff0f0a89f044 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 3 Apr 2019 17:45:26 -0700 Subject: [PATCH] osd/: clarify interface for introducing disk state to PeeringState Signed-off-by: sjust@redhat.com --- src/osd/PG.cc | 46 +++++++++++++++++++++++++----------------- src/osd/PeeringState.h | 13 ++++++++++++ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 31053eb5e84..768097c6028 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1325,8 +1325,15 @@ int PG::read_info( 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) { @@ -1335,22 +1342,25 @@ void PG::read_state(ObjectStore *store) 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); diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index 8c1adbe6db9..a2c8de0c001 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -1463,6 +1463,19 @@ public: bool backfill, ObjectStore::Transaction *t); + template + 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& childpgs, vector *out); void finish_split_stats( -- 2.39.5