From: Sage Weil Date: Wed, 19 Feb 2014 05:02:15 +0000 (-0800) Subject: osd/ReplicatedPG: load older HitSets into memory X-Git-Tag: v0.78~156^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a40cd5075ccbd306ced0f99d9adfd1d75576a292;p=ceph.git osd/ReplicatedPG: load older HitSets into memory If our evict_mode is non-idle, load older HitSets into memory in the agent work thread. Signed-off-by: Sage Weil --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index f5b0f99641a5..da90daa6e82b 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -10462,6 +10462,8 @@ void ReplicatedPG::agent_work(int start_max) assert(is_primary()); assert(is_active()); + agent_load_hit_sets(); + const pg_pool_t *base_pool = get_osdmap()->get_pg_pool(pool.info.tier_of); assert(base_pool); @@ -10551,6 +10553,39 @@ void ReplicatedPG::agent_work(int start_max) unlock(); } +void ReplicatedPG::agent_load_hit_sets() +{ + if (agent_state->evict_mode == TierAgentState::EVICT_MODE_IDLE) { + agent_state->discard_hit_sets(); + return; + } + + if (agent_state->hit_set_map.size() < info.hit_set.history.size()) { + dout(10) << __func__ << dendl; + for (list::reverse_iterator p = + info.hit_set.history.rbegin(); + p != info.hit_set.history.rend(); ++p) { + if (agent_state->hit_set_map.count(p->begin.sec()) == 0) { + dout(10) << __func__ << " loading " << p->begin << "-" + << p->end << dendl; + if (!pool.info.is_replicated()) { + // FIXME: EC not supported here yet + derr << __func__ << " on non-replicated pool" << dendl; + break; + } + bufferlist bl; + hobject_t oid = get_hit_set_archive_object(p->begin, p->end); + int r = osd->store->read(coll, oid, 0, 0, bl); + assert(r >= 0); + HitSetRef hs(new HitSet); + bufferlist::iterator pbl = bl.begin(); + ::decode(*hs, pbl); + agent_state->add_hit_set(p->begin.sec(), hs); + } + } + } +} + struct C_AgentFlushStartStop : public Context { ReplicatedPGRef pg; hobject_t oid; diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index b6a80e2594c8..64d156800ba5 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -739,6 +739,8 @@ protected: bool agent_maybe_flush(ObjectContextRef& obc); ///< maybe flush bool agent_maybe_evict(ObjectContextRef& obc); ///< maybe evict + void agent_load_hit_sets(); ///< load HitSets, if needed + /// estimate object atime and temperature /// /// @param oid [in] object name diff --git a/src/osd/TierAgentState.h b/src/osd/TierAgentState.h index 5cb12c7e66fa..b5f7910f2099 100644 --- a/src/osd/TierAgentState.h +++ b/src/osd/TierAgentState.h @@ -90,6 +90,11 @@ struct TierAgentState { hit_set_map.erase(hit_set_map.begin()); } + /// discard all open hit sets + void discard_hit_sets() { + hit_set_map.clear(); + } + void dump(Formatter *f) const { f->dump_string("flush_mode", get_flush_mode_name()); f->dump_string("evict_mode", get_evict_mode_name());