diff options
author | Loic Dachary <loic@dachary.org> | 2013-08-15 20:15:03 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-08-22 02:10:58 +0200 |
commit | 1688fb48428afe59b3c5bdb1cd6c716c80580f47 (patch) | |
tree | ba1729aa60f3c6843c041fcd1cb995117a563074 | |
parent | e1be37a37574b67f57cb653f4dab8880798cc089 (diff) | |
download | ceph-1688fb48428afe59b3c5bdb1cd6c716c80580f47.tar.gz |
ReplicatedPG: add Mutex to protect snapset_contexts
snapset_contexts_locks is added and locked in each function where
snapset_contexts or the SnapSetContext::ref data member needs to be
accessed or modified.
http://tracker.ceph.com/issues/5510 refs #5510
Signed-off-by: Loic Dachary <loic@dachary.org>
-rw-r--r-- | src/osd/ReplicatedPG.cc | 12 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.h | 6 |
2 files changed, 14 insertions, 4 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 29fc5f8d6cb..9af47403ab5 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -613,7 +613,9 @@ void ReplicatedPG::calc_trim_to() ReplicatedPG::ReplicatedPG(OSDService *o, OSDMapRef curmap, const PGPool &_pool, pg_t p, const hobject_t& oid, const hobject_t& ioid) : - PG(o, curmap, _pool, p, oid, ioid), temp_created(false), + PG(o, curmap, _pool, p, oid, ioid), + snapset_contexts_lock("ReplicatedPG::snapset_contexts"), + temp_created(false), temp_coll(coll_t::make_temp_coll(p)), snap_trimmer_machine(this) { snap_trimmer_machine.initiate(); @@ -4794,9 +4796,10 @@ void ReplicatedPG::add_object_context_to_pg_stat(ObjectContext *obc, pg_stat_t * SnapSetContext *ReplicatedPG::create_snapset_context(const object_t& oid) { + Mutex::Locker l(snapset_contexts_lock); SnapSetContext *ssc = new SnapSetContext(oid); dout(10) << "create_snapset_context " << ssc << " " << ssc->oid << dendl; - register_snapset_context(ssc); + _register_snapset_context(ssc); ssc->ref++; return ssc; } @@ -4807,6 +4810,7 @@ SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid, bool can_create, const string& nspace) { + Mutex::Locker l(snapset_contexts_lock); SnapSetContext *ssc; map<object_t, SnapSetContext*>::iterator p = snapset_contexts.find(oid); if (p != snapset_contexts.end()) { @@ -4825,7 +4829,7 @@ SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid, return NULL; } ssc = new SnapSetContext(oid); - register_snapset_context(ssc); + _register_snapset_context(ssc); if (r >= 0) { bufferlist::iterator bvp = bv.begin(); ssc->snapset.decode(bvp); @@ -4840,9 +4844,9 @@ SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid, void ReplicatedPG::put_snapset_context(SnapSetContext *ssc) { + Mutex::Locker l(snapset_contexts_lock); dout(10) << "put_snapset_context " << ssc->oid << " " << ssc->ref << " -> " << (ssc->ref-1) << dendl; - --ssc->ref; if (ssc->ref == 0) { if (ssc->registered) diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index af14871fe27..884da991f70 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -278,6 +278,7 @@ protected: // projected object info map<hobject_t, ObjectContext*> object_contexts; map<object_t, SnapSetContext*> snapset_contexts; + Mutex snapset_contexts_lock; // debug order that client ops are applied map<hobject_t, map<client_t, tid_t> > debug_op_order; @@ -327,6 +328,11 @@ protected: SnapSetContext *get_snapset_context(const object_t& oid, const string &key, ps_t seed, bool can_create, const string &nspace); void register_snapset_context(SnapSetContext *ssc) { + Mutex::Locker l(snapset_contexts_lock); + _register_snapset_context(ssc); + } + void _register_snapset_context(SnapSetContext *ssc) { + assert(snapset_contexts_lock.is_locked()); if (!ssc->registered) { assert(snapset_contexts.count(ssc->oid) == 0); ssc->registered = true; |