]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Implement collection_rename interface in KeyValueStore
authorHaomai Wang <haomaiwang@gmail.com>
Fri, 21 Feb 2014 13:36:48 +0000 (21:36 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Sat, 22 Feb 2014 13:05:00 +0000 (21:05 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/os/KeyValueStore.cc

index 65f1fd1d8262700fe8bd6624a936b8d9d8218fe9..7096cc9349b2bf244fdd3c7d91239d77897f8353 100644 (file)
@@ -2518,7 +2518,57 @@ int KeyValueStore::_collection_rename(const coll_t &cid, const coll_t &ncid,
 {
   dout(10) << __func__ << " origin cid " << cid << " new cid " << ncid
            << dendl;
-  return -EOPNOTSUPP;
+
+  StripObjectMap::StripObjectHeader *header;
+
+  r = t.lookup_cached_header(get_coll_for_coll(),
+                             make_ghobject_for_coll(ncid),
+                             &header, false);
+  if (r == 0) {
+    dout(2) << __func__ << ": " << ncid << " DNE" << dendl;
+    return -EEXIST;
+  }
+
+  int r = t.lookup_cached_header(get_coll_for_coll(),
+                                 make_ghobject_for_coll(cid),
+                                 &header, false);
+  if (r < 0) {
+    dout(2) << __func__ << ": " << cid << " DNE" << dendl;
+    return 0;
+  }
+
+  vector<ghobject_t> objects;
+  ghobject_t next, current;
+  int move_size = 0;
+  while (1) {
+    collection_list_partial(cid, current, get_ideal_list_min(),
+                            get_ideal_list_max(), 0, &objects, &next);
+
+    dout(20) << __func__ << cid << "objects size: " << objects.size()
+             << dendl;
+
+    if (objects.empty())
+      break;
+
+    for (vector<ghobject_t>::iterator i = objects.begin();
+        i != objects.end(); ++i) {
+      if (i->match(bits, rem)) {
+        if (_collection_move_rename(cid, *i, ncid, *i, t) < 0) {
+          return -1;
+        }
+        move_size++;
+      }
+    }
+
+    objects.clear();
+    current = next;
+  }
+
+  t.rename_buffer(*header, get_coll_for_coll(), make_ghobject_for_coll(ncid));
+
+  dout(10) << __func__ << " origin cid " << cid << " new cid " << ncid
+           << dendl;
+  return 0;
 }
 
 int KeyValueStore::list_collections(vector<coll_t>& ls)