From: Greg Farnum Date: Mon, 10 Jul 2017 20:31:21 +0000 (-0700) Subject: osd: repair the PG_DEBUG_REFS build X-Git-Tag: v11.2.1~21^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4fa19ce669338bb2d4c3233c70da8a3829a468f6;p=ceph.git osd: repair the PG_DEBUG_REFS build Signed-off-by: Greg Farnum (cherry picked from commit ec4185d1980b48b01687a177248d0894f326dc37) Conflicts: src/osd/OSD.cc src/osd/Session.h --- diff --git a/src/common/tracked_int_ptr.hpp b/src/common/tracked_int_ptr.hpp index e0e423835e7..86f67ddb9ba 100644 --- a/src/common/tracked_int_ptr.hpp +++ b/src/common/tracked_int_ptr.hpp @@ -50,18 +50,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; } @@ -71,6 +67,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 038bfee2132..25f7307959c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -291,6 +291,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(); @@ -9102,7 +9137,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; @@ -9110,7 +9145,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); (*i)->unlock(); osd->wake_pg_waiters((*i)->info.pgid); } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index c09cd2d81f4..8fa969d3a3e 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1149,33 +1149,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 068d337fe58..e785d1bcbce 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -100,7 +100,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);