From: Sage Weil Date: Sat, 19 Jul 2014 19:03:49 +0000 (-0700) Subject: ceph_filestore_dump: use "remove" marker instead of collection rename X-Git-Tag: v0.90~106^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a80f2f6a35d9b6df312a5a7cbdefca62f158831d;p=ceph.git ceph_filestore_dump: use "remove" marker instead of collection rename Instead of renaming the collection to FORREMOVAL, just mark it with an attr. Signed-off-by: Sage Weil --- diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index 71d63369f102..02126d6d3b5b 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -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 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; }