]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/MemStore: handle collection_move_rename within the same collection
authorSage Weil <sage@redhat.com>
Fri, 18 Jul 2014 23:24:07 +0000 (16:24 -0700)
committerSage Weil <sage@redhat.com>
Sat, 19 Jul 2014 20:56:07 +0000 (13:56 -0700)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/MemStore.cc

index cdef5b51d9c77b4ffc40b99051d169dc1734edad..c1af61733353733123fb71d15ea46d6bc7f82ab6 100644 (file)
@@ -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,