]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_filestore_dump: use "remove" marker instead of collection rename
authorSage Weil <sage@redhat.com>
Sat, 19 Jul 2014 19:03:49 +0000 (12:03 -0700)
committerSage Weil <sage@redhat.com>
Mon, 27 Oct 2014 23:59:29 +0000 (16:59 -0700)
Instead of renaming the collection to FORREMOVAL, just mark it with an
attr.

Signed-off-by: Sage Weil <sage@redhat.com>
src/tools/ceph_objectstore_tool.cc

index 71d63369f102c3fed0205a19c8f23011a1ae5d5a..02126d6d3b5b14fd967444daad4ffdd8a2b7c041 100644 (file)
@@ -495,7 +495,7 @@ out:
 }
 
 //Based on part of OSD::load_pgs()
-int finish_remove_pgs(ObjectStore *store, uint64_t *next_removal_seq)
+int finish_remove_pgs(ObjectStore *store)
 {
   vector<coll_t> ls;
   int r = store->list_collections(ls);
@@ -522,11 +522,12 @@ int finish_remove_pgs(ObjectStore *store, uint64_t *next_removal_seq)
     }
 
     uint64_t seq;
-    if (it->is_removal(&seq, &pgid)) {
-      if (seq >= *next_removal_seq)
-       *next_removal_seq = seq + 1;
-      cout << "finish_remove_pgs removing " << *it << ", seq is "
-              << seq << " pgid is " << pgid << std::endl;
+    coll_t coll(pgid);
+    char val;
+    if (it->is_removal(&seq, &pgid) ||
+       store->collection_getattr(coll, "remove", &val, 1) == 1) {
+      cout << "finish_remove_pgs removing " << *it
+          << " pgid is " << pgid << std::endl;
       remove_coll(store, *it);
       continue;
     }
@@ -536,17 +537,15 @@ int finish_remove_pgs(ObjectStore *store, uint64_t *next_removal_seq)
   return 0;
 }
 
-int initiate_new_remove_pg(ObjectStore *store, spg_t r_pgid,
-    uint64_t *next_removal_seq)
+int initiate_new_remove_pg(ObjectStore *store, spg_t r_pgid)
 {
   ObjectStore::Transaction *rmt = new ObjectStore::Transaction;
 
   if (store->collection_exists(coll_t(r_pgid))) {
-      coll_t to_remove = coll_t::make_removal_coll((*next_removal_seq)++, r_pgid);
-      cout << "collection rename " << coll_t(r_pgid)
-          << " to " << to_remove
-        << std::endl;
-      rmt->collection_rename(coll_t(r_pgid), to_remove);
+    cout << " marking collection for removal" << std::endl;
+    bufferlist one;
+    one.append('1');
+    rmt->collection_setattr(coll_t(r_pgid), "remove", one);
   } else {
     delete rmt;
     return ENOENT;
@@ -1199,9 +1198,6 @@ int get_pg_metadata(ObjectStore *store, coll_t coll, bufferlist &bl)
   cout << std::endl;
 #endif
 
-  coll_t newcoll(ms.info.pgid);
-  t->collection_rename(coll, newcoll);
-
   int ret = write_pg(*t, ms.map_epoch, ms.info, ms.log, ms.struct_ver, ms.past_intervals);
   if (ret) return ret;
 
@@ -1335,8 +1331,7 @@ int do_import(ObjectStore *store, OSDSuperblock& sb)
   pg_info_t info;
   PGLog::IndexedLog log;
 
-  uint64_t next_removal_seq = 0;       //My local seq
-  finish_remove_pgs(store, &next_removal_seq);
+  finish_remove_pgs(store);
 
   int ret = sh.read_super();
   if (ret)
@@ -1385,11 +1380,11 @@ int do_import(ObjectStore *store, OSDSuperblock& sb)
     return 1;
   }
 
-  //Switch to collection which will be removed automatically if
-  //this program is interupted.
-  coll_t rmcoll = coll_t::make_removal_coll(next_removal_seq, pgid);
+  // mark this coll for removal until we are done
+  bufferlist one;
+  one.append('1');
   ObjectStore::Transaction *t = new ObjectStore::Transaction;
-  t->create_collection(rmcoll);
+  t->collection_setattr(coll, "remove", one);
   store->apply_transaction(*t);
   delete t;
 
@@ -1409,11 +1404,11 @@ int do_import(ObjectStore *store, OSDSuperblock& sb)
     }
     switch(type) {
     case TYPE_OBJECT_BEGIN:
-      ret = get_object(store, rmcoll, ebl);
+      ret = get_object(store, coll, ebl);
       if (ret) return ret;
       break;
     case TYPE_PG_METADATA:
-      ret = get_pg_metadata(store, rmcoll, ebl);
+      ret = get_pg_metadata(store, coll, ebl);
       if (ret) return ret;
       found_metadata = true;
       break;
@@ -1430,6 +1425,13 @@ int do_import(ObjectStore *store, OSDSuperblock& sb)
     return EFAULT;
   }
 
+  // done, clear removal flag
+  cout << "done, clearing remove flag" << std::endl;
+  t = new ObjectStore::Transaction;
+  t->collection_rmattr(coll, "remove");
+  store->apply_transaction(*t);
+  delete t;
+
   return 0;
 }
 
@@ -2138,15 +2140,14 @@ int main(int argc, char **argv)
   biginfo_oid = OSD::make_pg_biginfo_oid(pgid);
 
   if (op == "remove") {
-    uint64_t next_removal_seq = 0;     //My local seq
-    finish_remove_pgs(fs, &next_removal_seq);
-    int r = initiate_new_remove_pg(fs, pgid, &next_removal_seq);
+    finish_remove_pgs(fs);
+    int r = initiate_new_remove_pg(fs, pgid);
     if (r) {
       cerr << "PG '" << pgid << "' not found" << std::endl;
       ret = 1;
       goto out;
     }
-    finish_remove_pgs(fs, &next_removal_seq);
+    finish_remove_pgs(fs);
     cout << "Remove successful" << std::endl;
     goto out;
   }