From 0dffddf34ee595a6cab1fc3d6a183d15f4aa7c71 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 7 Nov 2011 17:51:21 -0800 Subject: [PATCH] osd/: change type of osd::osdmap to a shared_ptr Signed-off-by: Samuel Just --- src/osd/OSD.cc | 36 ++++++++++++++---------------------- src/osd/OSD.h | 9 +++++---- src/osd/OSDMap.h | 3 +++ src/osd/PG.cc | 20 ++++++++++---------- src/osd/PG.h | 22 +++++++++++----------- src/osd/ReplicatedPG.cc | 4 ++-- src/osd/ReplicatedPG.h | 2 +- 7 files changed, 46 insertions(+), 50 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f899b40a3fb3f..7232d8f6f20c2 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -109,7 +109,7 @@ #undef dout_prefix #define dout_prefix _prefix(*_dout, whoami, osdmap) -static ostream& _prefix(std::ostream* _dout, int whoami, OSDMap *osdmap) { +static ostream& _prefix(std::ostream* _dout, int whoami, OSDMapRef osdmap) { return *_dout << "osd." << whoami << " " << (osdmap ? osdmap->get_epoch():0) << " "; } @@ -543,7 +543,6 @@ OSD::OSD(int id, Messenger *internal_messenger, Messenger *external_messenger, stat_lock("OSD::stat_lock"), finished_lock("OSD::finished_lock"), op_wq(this, g_conf->osd_op_thread_timeout, &op_tp), - osdmap(NULL), map_lock("OSD::map_lock"), peer_map_epoch_lock("OSD::peer_map_epoch_lock"), map_cache_lock("OSD::map_cache_lock"), @@ -574,8 +573,6 @@ OSD::OSD(int id, Messenger *internal_messenger, Messenger *external_messenger, map_in_progress_cond = new Cond(); - osdmap = 0; - pending_ops = 0; waiting_for_no_ops = false; } @@ -922,8 +919,6 @@ int OSD::shutdown() delete watch; clear_map_cache(); - osdmap = 0; - return r; } @@ -1313,7 +1308,7 @@ void OSD::calc_priors_during(pg_t pgid, epoch_t start, epoch_t end, set& ps dout(15) << "calc_priors_during " << pgid << " [" << start << "," << end << ")" << dendl; for (epoch_t e = start; e < end; e++) { - OSDMap *oldmap = get_map(e); + OSDMapRef oldmap = get_map(e); vector acting; oldmap->pg_to_acting_osds(pgid, acting); dout(20) << " " << pgid << " in epoch " << e << " was " << acting << dendl; @@ -1353,7 +1348,7 @@ void OSD::project_pg_history(pg_t pgid, PG::Info::History& h, epoch_t from, e > from; e--) { // verify during intermediate epoch (e-1) - OSDMap *oldmap = get_map(e-1); + OSDMapRef oldmap = get_map(e-1); vector up, acting; oldmap->pg_to_up_acting_osds(pgid, up, acting); @@ -3241,7 +3236,7 @@ void OSD::handle_osd_map(MOSDMap *m) OSDMap *o = new OSDMap; if (e > 1) { bufferlist obl; - OSDMap *prev = get_map(e - 1); + OSDMapRef prev = get_map(e - 1); prev->encode(obl); o->decode(obl); } @@ -3271,7 +3266,7 @@ void OSD::handle_osd_map(MOSDMap *m) // check for cluster snapshot string cluster_snap; for (epoch_t cur = start; cur <= last && cluster_snap.length() == 0; cur++) { - OSDMap *newmap = get_map(cur); + OSDMapRef newmap = get_map(cur); cluster_snap = newmap->get_cluster_snapshot(); } @@ -3312,7 +3307,7 @@ void OSD::handle_osd_map(MOSDMap *m) for (epoch_t cur = start; cur <= superblock.newest_map; cur++) { dout(10) << " advance to epoch " << cur << " (<= newest " << superblock.newest_map << ")" << dendl; - OSDMap *newmap = get_map(cur); + OSDMapRef newmap = get_map(cur); assert(newmap); // we just cached it above! // kill connections to newly down osds @@ -3559,7 +3554,7 @@ void OSD::advance_map(ObjectStore::Transaction& t) } // if we skipped a discontinuity and are the first epoch, we won't have a previous map. - OSDMap *lastmap = NULL; + OSDMapRef lastmap; if (osdmap->get_epoch() > superblock.oldest_map) lastmap = get_map(osdmap->get_epoch() - 1); @@ -3726,16 +3721,17 @@ bool OSD::get_inc_map_bl(epoch_t e, bufferlist& bl) return store->read(coll_t::META_COLL, get_inc_osdmap_pobject_name(e), 0, 0, bl) >= 0; } -void OSD::add_map(OSDMap *o) +OSDMapRef OSD::add_map(OSDMap *o) { Mutex::Locker l(map_cache_lock); epoch_t e = o->get_epoch(); if (map_cache.count(e) == 0) { dout(10) << "add_map " << e << " " << o << dendl; - map_cache[e] = o; + map_cache.insert(make_pair(e, OSDMapRef(o))); } else { dout(10) << "add_map " << e << " already have it" << dendl; } + return map_cache[e]; } void OSD::add_map_bl(epoch_t e, bufferlist& bl) @@ -3752,11 +3748,11 @@ void OSD::add_map_inc_bl(epoch_t e, bufferlist& bl) map_inc_bl[e] = bl; } -OSDMap *OSD::get_map(epoch_t epoch) +OSDMapRef OSD::get_map(epoch_t epoch) { { Mutex::Locker l(map_cache_lock); - map::iterator p = map_cache.find(epoch); + map::iterator p = map_cache.find(epoch); if (p != map_cache.end()) { dout(30) << "get_map " << epoch << " - cached " << p->second << dendl; return p->second; @@ -3772,8 +3768,7 @@ OSDMap *OSD::get_map(epoch_t epoch) } else { dout(20) << "get_map " << epoch << " - return initial " << map << dendl; } - add_map(map); - return map; + return add_map(map); } void OSD::trim_map_bl_cache(epoch_t oldest) @@ -3794,9 +3789,8 @@ void OSD::trim_map_cache(epoch_t oldest) (map_cache.begin()->first < oldest || (int)map_cache.size() > g_conf->osd_map_cache_max)) { epoch_t e = map_cache.begin()->first; - OSDMap *o = map_cache.begin()->second; + OSDMapRef o = map_cache.begin()->second; dout(10) << "trim_map_cache " << e << " " << o << dendl; - delete o; map_cache.erase(map_cache.begin()); } } @@ -3804,8 +3798,6 @@ void OSD::trim_map_cache(epoch_t oldest) void OSD::clear_map_cache() { while (!map_cache.empty()) { - OSDMap *o = map_cache.begin()->second; - delete o; map_cache.erase(map_cache.begin()); } } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 86efcc896182e..aaf760996012f 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -38,6 +38,7 @@ #include #include +#include using namespace std; #include @@ -376,7 +377,7 @@ private: protected: // -- osd map -- - OSDMap *osdmap; + OSDMapRef osdmap; utime_t had_map_since; RWLock map_lock; list waiting_for_osdmap; @@ -401,13 +402,13 @@ private: void activate_map(ObjectStore::Transaction& t, list& tfin); // osd map cache (past osd maps) - map map_cache; + map map_cache; map map_inc_bl; map map_bl; Mutex map_cache_lock; - OSDMap* get_map(epoch_t e); - void add_map(OSDMap *o); + OSDMapRef get_map(epoch_t e); + OSDMapRef add_map(OSDMap *o); void add_map_bl(epoch_t e, bufferlist& bl); void add_map_inc_bl(epoch_t e, bufferlist& bl); void trim_map_cache(epoch_t oldest); diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index a79d646c19e91..6c13faf438b17 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -36,6 +36,7 @@ #include #include #include +#include using namespace std; #include @@ -661,6 +662,8 @@ public: }; +typedef std::tr1::shared_ptr OSDMapRef; + inline ostream& operator<<(ostream& out, const OSDMap& m) { m.print_summary(out); return out; diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 0eee5b19109e2..0f1e603a669a0 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -957,11 +957,11 @@ void PG::generate_past_intervals() dout(10) << __func__ << " over epochs " << stop << "-" << last_epoch << dendl; - OSDMap *nextmap = osd->get_map(last_epoch); + OSDMapRef nextmap = osd->get_map(last_epoch); for (; last_epoch >= stop; last_epoch = first_epoch - 1) { - OSDMap *lastmap = nextmap; + OSDMapRef lastmap = nextmap; vector tup, tacting; lastmap->pg_to_up_acting_osds(get_pgid(), tup, tacting); @@ -1034,7 +1034,7 @@ void PG::trim_past_intervals() } -bool PG::adjust_need_up_thru(const OSDMap *osdmap) +bool PG::adjust_need_up_thru(const OSDMapRef osdmap) { epoch_t up_thru = osd->osdmap->get_up_thru(osd->whoami); if (need_up_thru && @@ -1049,7 +1049,7 @@ bool PG::adjust_need_up_thru(const OSDMap *osdmap) /* * Returns true unless there is a non-lost OSD in might_have_unfound. */ -bool PG::all_unfound_are_queried_or_lost(const OSDMap* osdmap) const +bool PG::all_unfound_are_queried_or_lost(const OSDMapRef osdmap) const { assert(is_primary()); @@ -3372,7 +3372,7 @@ void PG::fulfill_log(int from, const Query &query, epoch_t query_epoch) // true if all OSDs in prior intervals may have crashed, and we need to replay // false positives are okay, false negatives are not. -bool PG::may_need_replay(const OSDMap *osdmap) const +bool PG::may_need_replay(const OSDMapRef osdmap) const { bool crashed = false; @@ -3483,11 +3483,11 @@ void PG::set_last_peering_reset() { } /* Called before initializing peering during advance_map */ -void PG::start_peering_interval(const OSDMap *lastmap, +void PG::start_peering_interval(const OSDMapRef lastmap, const vector& newup, const vector& newacting) { - const OSDMap *osdmap = osd->osdmap; + const OSDMapRef osdmap = osd->osdmap; // -- there was a change! -- kick(); @@ -4017,7 +4017,7 @@ boost::statechart::result PG::RecoveryState::Primary::react(const AdvMap& advmap) { PG *pg = context< RecoveryMachine >().pg; - OSDMap *osdmap = advmap.osdmap; + OSDMapRef osdmap = advmap.osdmap; // Remove any downed osds from peer_info map::iterator p = pg->peer_info.begin(); @@ -4735,7 +4735,7 @@ void PG::RecoveryState::handle_query(int from, const PG::Query& q, end_handle(); } -void PG::RecoveryState::handle_advance_map(OSDMap *osdmap, OSDMap *lastmap, +void PG::RecoveryState::handle_advance_map(OSDMapRef osdmap, OSDMapRef lastmap, vector& newup, vector& newacting, RecoveryCtx *rctx) { @@ -4922,7 +4922,7 @@ PG::PriorSet::PriorSet(const OSDMap &osdmap, } // true if the given map affects the prior set -bool PG::PriorSet::affected_by_map(const OSDMap *osdmap, const PG *debug_pg) const +bool PG::PriorSet::affected_by_map(const OSDMapRef osdmap, const PG *debug_pg) const { for (set::iterator p = probe.begin(); p != probe.end(); diff --git a/src/osd/PG.h b/src/osd/PG.h index a2ef11d72f3fb..95e8e0e61d416 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -886,13 +886,13 @@ public: const Info &info, const PG *debug_pg=NULL); - bool affected_by_map(const OSDMap *osdmap, const PG *debug_pg=0) const; + bool affected_by_map(const OSDMapRef osdmap, const PG *debug_pg=0) const; }; friend std::ostream& operator<<(std::ostream& oss, const struct PriorSet &prior); - bool may_need_replay(const OSDMap *osdmap) const; + bool may_need_replay(const OSDMapRef osdmap) const; public: @@ -972,10 +972,10 @@ public: }; struct AdvMap : boost::statechart::event< AdvMap > { - OSDMap *osdmap; - OSDMap *lastmap; + OSDMapRef osdmap; + OSDMapRef lastmap; vector newup, newacting; - AdvMap(OSDMap *osdmap, OSDMap *lastmap, vector& newup, vector& newacting): + AdvMap(OSDMapRef osdmap, OSDMapRef lastmap, vector& newup, vector& newacting): osdmap(osdmap), lastmap(lastmap), newup(newup), newacting(newacting) {} }; @@ -1325,7 +1325,7 @@ public: void handle_query(int from, const PG::Query& q, epoch_t query_epoch, RecoveryCtx *ctx); - void handle_advance_map(OSDMap *osdmap, OSDMap *lastmap, + void handle_advance_map(OSDMapRef osdmap, OSDMapRef lastmap, vector& newup, vector& newacting, RecoveryCtx *ctx); void handle_activate_map(RecoveryCtx *ctx); @@ -1401,9 +1401,9 @@ public: void build_prior(std::auto_ptr &prior_set); void clear_prior(); - bool adjust_need_up_thru(const OSDMap *osdmap); + bool adjust_need_up_thru(const OSDMapRef osdmap); - bool all_unfound_are_queried_or_lost(const OSDMap* osdmap) const; + bool all_unfound_are_queried_or_lost(const OSDMapRef osdmap) const; virtual void mark_all_unfound_lost(int how) = 0; bool calc_min_last_complete_ondisk() { @@ -1488,7 +1488,7 @@ public: void clear_recovery_state(); virtual void _clear_recovery_state() = 0; void defer_recovery(); - virtual void check_recovery_op_pulls(const OSDMap *newmap) = 0; + virtual void check_recovery_op_pulls(const OSDMapRef newmap) = 0; void start_recovery_op(const hobject_t& soid); void finish_recovery_op(const hobject_t& soid, bool dequeue=false); @@ -1634,7 +1634,7 @@ public: /// share new pg log entries after a pg is active void share_pg_log(); - void start_peering_interval(const OSDMap *lastmap, + void start_peering_interval(const OSDMapRef lastmap, const vector& newup, const vector& newacting); void set_last_peering_reset(); @@ -1662,7 +1662,7 @@ public: RecoveryCtx *rctx) { recovery_state.handle_query(from, q, query_epoch, rctx); } - void handle_advance_map(OSDMap *osdmap, OSDMap *lastmap, + void handle_advance_map(OSDMapRef osdmap, OSDMapRef lastmap, vector& newup, vector& newacting, RecoveryCtx *rctx) { recovery_state.handle_advance_map(osdmap, lastmap, newup, newacting, rctx); diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 3ed552b5465df..a2d843d0e1e3d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -43,7 +43,7 @@ #define DOUT_PREFIX_ARGS this, osd->whoami, osd->osdmap #undef dout_prefix #define dout_prefix _prefix(_dout, this, osd->whoami, osd->osdmap) -static ostream& _prefix(std::ostream *_dout, PG *pg, int whoami, OSDMap *osdmap) { +static ostream& _prefix(std::ostream *_dout, PG *pg, int whoami, OSDMapRef osdmap) { return *_dout << "osd." << whoami << " " << (osdmap ? osdmap->get_epoch():0) << " " << *pg << " "; } @@ -4787,7 +4787,7 @@ void ReplicatedPG::_clear_recovery_state() pull_from_peer.clear(); } -void ReplicatedPG::check_recovery_op_pulls(const OSDMap *osdmap) +void ReplicatedPG::check_recovery_op_pulls(const OSDMapRef osdmap) { for (map >::iterator j = pull_from_peer.begin(); j != pull_from_peer.end(); diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 5cb5f98798f72..c51279247ccd1 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -580,7 +580,7 @@ protected: void send_push_op_blank(const hobject_t& soid, int peer); // Cancels/resets pulls from peer - void check_recovery_op_pulls(const OSDMap *map); + void check_recovery_op_pulls(const OSDMapRef map); int pull(const hobject_t& oid, eversion_t v); void send_pull_op(const hobject_t& soid, eversion_t v, bool first, const interval_set& data_subset, int fromosd); -- 2.39.5