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;
}
bool operator==(const TrackedIntPtr &lhs) const {
return ptr == lhs.ptr;
}
+
+ void reset() {
+ if (ptr)
+ put_with_id(ptr, id);
+ ptr = nullptr;
+ id = 0;
+ }
};
#endif
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<spg_t, int>::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<spg_t> &children)
{
for (set<spg_t>::const_iterator i = children.begin();
++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<spg_t> to_complete;
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();
}
Mutex pgid_lock;
map<spg_t, int> pgid_tracker;
map<spg_t, PG*> 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<spg_t, int>::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);
{
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);
struct Backoff;
typedef boost::intrusive_ptr<Backoff> BackoffRef;
class PG;
+#ifdef PG_DEBUG_REFS
+#include "common/tracked_int_ptr.hpp"
+typedef TrackedIntPtr<PG> PGRef;
+#else
typedef boost::intrusive_ptr<PG> PGRef;
+#endif
/*
* A Backoff represents one instance of either a PG or an OID