From ec4185d1980b48b01687a177248d0894f326dc37 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Wed, 24 May 2017 00:36:00 -0700 Subject: [PATCH] osd: repair the PG_DEBUG_REFS build Signed-off-by: Greg Farnum --- src/common/tracked_int_ptr.hpp | 19 ++++++++++------- src/osd/OSD.cc | 39 ++++++++++++++++++++++++++++++++-- src/osd/OSD.h | 30 +++----------------------- src/osd/PG.cc | 2 +- src/osd/Session.h | 5 +++++ 5 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/common/tracked_int_ptr.hpp b/src/common/tracked_int_ptr.hpp index dfc7493472457..5752906b18cdd 100644 --- a/src/common/tracked_int_ptr.hpp +++ b/src/common/tracked_int_ptr.hpp @@ -44,18 +44,14 @@ public: TrackedIntPtr o(rhs.ptr); swap(o); } - const T &operator*() const { + T &operator*() const { return *ptr; } - T &operator*() { - return *ptr; - } - const T *operator->() const { - return ptr; - } - T *operator->() { + T *operator->() const { return ptr; } + T *get() const { return ptr; } + operator bool() const { return ptr != NULL; } @@ -65,6 +61,13 @@ public: bool operator==(const TrackedIntPtr &lhs) const { return ptr == lhs.ptr; } + + void reset() { + if (ptr) + put_with_id(ptr, id); + ptr = nullptr; + id = 0; + } }; #endif diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 01b8bd85974bb..0c88a8714f438 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -295,6 +295,41 @@ OSDService::~OSDService() delete objecter; } + + +#ifdef PG_DEBUG_REFS +void OSDService::add_pgid(spg_t pgid, PG *pg){ + Mutex::Locker l(pgid_lock); + if (!pgid_tracker.count(pgid)) { + live_pgs[pgid] = pg; + } + pgid_tracker[pgid]++; +} +void OSDService::remove_pgid(spg_t pgid, PG *pg) +{ + Mutex::Locker l(pgid_lock); + assert(pgid_tracker.count(pgid)); + assert(pgid_tracker[pgid] > 0); + pgid_tracker[pgid]--; + if (pgid_tracker[pgid] == 0) { + pgid_tracker.erase(pgid); + live_pgs.erase(pgid); + } +} +void OSDService::dump_live_pgids() +{ + Mutex::Locker l(pgid_lock); + derr << "live pgids:" << dendl; + for (map::const_iterator i = pgid_tracker.cbegin(); + i != pgid_tracker.cend(); + ++i) { + derr << "\t" << *i << dendl; + live_pgs[i->first]->dump_live_ids(); + } +} +#endif + + void OSDService::_start_split(spg_t parent, const set &children) { for (set::const_iterator i = children.begin(); @@ -9077,7 +9112,7 @@ struct C_CompleteSplits : public Context { ++i) { osd->pg_map_lock.get_write(); (*i)->lock(); - PG *pg = (*i).get(); + PG *pg = i->get(); osd->add_newly_split_pg(pg, &rctx); if (!((*i)->deleting)) { set to_complete; @@ -9085,7 +9120,7 @@ struct C_CompleteSplits : public Context { osd->service.complete_split(to_complete); } osd->pg_map_lock.put_write(); - osd->dispatch_context_transaction(rctx, &**i); + osd->dispatch_context_transaction(rctx, pg); osd->wake_pg_waiters(*i); (*i)->unlock(); } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 3ea99d9037c5c..0b6cedd09f17f 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1248,33 +1248,9 @@ public: Mutex pgid_lock; map pgid_tracker; map live_pgs; - void add_pgid(spg_t pgid, PG *pg) { - Mutex::Locker l(pgid_lock); - if (!pgid_tracker.count(pgid)) { - live_pgs[pgid] = pg; - } - pgid_tracker[pgid]++; - } - void remove_pgid(spg_t pgid, PG *pg) { - Mutex::Locker l(pgid_lock); - assert(pgid_tracker.count(pgid)); - assert(pgid_tracker[pgid] > 0); - pgid_tracker[pgid]--; - if (pgid_tracker[pgid] == 0) { - pgid_tracker.erase(pgid); - live_pgs.erase(pgid); - } - } - void dump_live_pgids() { - Mutex::Locker l(pgid_lock); - derr << "live pgids:" << dendl; - for (map::const_iterator i = pgid_tracker.cbegin(); - i != pgid_tracker.cend(); - ++i) { - derr << "\t" << *i << dendl; - live_pgs[i->first]->dump_live_ids(); - } - } + void add_pgid(spg_t pgid, PG *pg); + void remove_pgid(spg_t pgid, PG *pg); + void dump_live_pgids(); #endif explicit OSDService(OSD *osd); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index fe248331e7c61..70c3a38071733 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -167,7 +167,7 @@ void PG::put(const char* tag) { Mutex::Locker l(_ref_id_lock); auto tag_counts_entry = _tag_counts.find(tag); - assert(_tag_counts_entry != _tag_counts.end()); + assert(tag_counts_entry != _tag_counts.end()); --tag_counts_entry->second; if (tag_counts_entry->second == 0) { _tag_counts.erase(tag_counts_entry); diff --git a/src/osd/Session.h b/src/osd/Session.h index 5abcb0da3d129..8e26a7262d212 100644 --- a/src/osd/Session.h +++ b/src/osd/Session.h @@ -27,7 +27,12 @@ typedef boost::intrusive_ptr SessionRef; struct Backoff; typedef boost::intrusive_ptr BackoffRef; class PG; +#ifdef PG_DEBUG_REFS +#include "common/tracked_int_ptr.hpp" +typedef TrackedIntPtr PGRef; +#else typedef boost::intrusive_ptr PGRef; +#endif /* * A Backoff represents one instance of either a PG or an OID -- 2.39.5