From a2594a547260f0c0d3cfa9b2d5fbe4ed32ece1fb Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Jul 2014 16:24:07 -0700 Subject: [PATCH] osd/MemStore: handle collection_move_rename within the same collection Signed-off-by: Sage Weil --- src/os/MemStore.cc | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/os/MemStore.cc b/src/os/MemStore.cc index cdef5b51d9c77..c1af617333537 100644 --- a/src/os/MemStore.cc +++ b/src/os/MemStore.cc @@ -1375,19 +1375,37 @@ int MemStore::_collection_move_rename(coll_t oldcid, const ghobject_t& oldoid, CollectionRef oc = get_collection(oldcid); if (!oc) return -ENOENT; - RWLock::WLocker l1(MIN(c, oc)->lock); - RWLock::WLocker l2(MAX(c, oc)->lock); + // note: c and oc may be the same + if (&(*c) == &(*oc)) { + c->lock.get_write(); + } else if (&(*c) < &(*oc)) { + c->lock.get_write(); + oc->lock.get_write(); + } else if (&(*c) > &(*oc)) { + oc->lock.get_write(); + c->lock.get_write(); + } + + int r = -EEXIST; if (c->object_hash.count(oid)) - return -EEXIST; + goto out; + r = -ENOENT; if (oc->object_hash.count(oldoid) == 0) - return -ENOENT; - ObjectRef o = oc->object_hash[oldoid]; - c->object_map[oid] = o; - c->object_hash[oid] = o; - oc->object_map.erase(oldoid); - oc->object_hash.erase(oldoid); - return 0; + goto out; + { + ObjectRef o = oc->object_hash[oldoid]; + c->object_map[oid] = o; + c->object_hash[oid] = o; + oc->object_map.erase(oldoid); + oc->object_hash.erase(oldoid); + } + r = 0; + out: + c->lock.put_write(); + if (c != oc) + oc->lock.put_write(); + return r; } int MemStore::_collection_setattr(coll_t cid, const char *name, -- 2.39.5