}
//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);
}
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;
}
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;
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;
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)
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;
}
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;
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;
}
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;
}