summaryrefslogtreecommitdiff
path: root/src/osd/OSD.cc
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-05-09 12:20:24 -0700
committerSamuel Just <sam.just@inktank.com>2013-05-09 12:20:24 -0700
commit69b64826b762f713d88072a5c3a3e54fa1e0995b (patch)
treed9a9b282ae9eceefcae9909d3bc8bc3d814690b2 /src/osd/OSD.cc
parentfd63f8aa30c0cad0ad2cc382971d3f6842ae53cd (diff)
downloadceph-69b64826b762f713d88072a5c3a3e54fa1e0995b.tar.gz
OSD: don't rename pg collections, handle PGs in RemoveWQ
Signed-off-by: Samuel Just <sam.just@inktank.com>
Diffstat (limited to 'src/osd/OSD.cc')
-rw-r--r--src/osd/OSD.cc71
1 files changed, 38 insertions, 33 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 073ca080f70..bf630ec0ee3 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -2780,27 +2780,20 @@ void TestOpsSocketHook::test_ops(OSDService *service, ObjectStore *store,
}
// =========================================
-void OSD::RemoveWQ::_process(boost::tuple<coll_t, SequencerRef, DeletingStateRef> *item)
-{
- OSDriver driver(
- store,
- coll_t(),
- make_snapmapper_oid());
- SnapMapper mapper(&driver, 0, 0, 0);
- coll_t &coll = item->get<0>();
- ObjectStore::Sequencer *osr = item->get<1>().get();
- if (osr)
- osr->flush();
+void remove_dir(
+ ObjectStore *store, SnapMapper *mapper,
+ OSDriver *osdriver,
+ ObjectStore::Sequencer *osr,
+ coll_t coll, DeletingStateRef dstate) {
vector<hobject_t> olist;
store->collection_list(coll, olist);
- //*_dout << "OSD::RemoveWQ::_process removing coll " << coll << std::endl;
int64_t num = 0;
ObjectStore::Transaction *t = new ObjectStore::Transaction;
for (vector<hobject_t>::iterator i = olist.begin();
i != olist.end();
++i, ++num) {
- OSDriver::OSTransaction _t(driver.get_transaction(t));
- int r = mapper.remove_oid(*i, &_t);
+ OSDriver::OSTransaction _t(osdriver->get_transaction(t));
+ int r = mapper->remove_oid(*i, &_t);
if (r != 0 && r != -ENOENT) {
assert(0);
}
@@ -2812,10 +2805,37 @@ void OSD::RemoveWQ::_process(boost::tuple<coll_t, SequencerRef, DeletingStateRef
num = 0;
}
}
- t->remove_collection(coll);
store->apply_transaction(*t);
delete t;
- delete item;
+}
+
+void OSD::RemoveWQ::_process(pair<PGRef, DeletingStateRef> item)
+{
+ PGRef pg(item.first);
+ SnapMapper &mapper = pg->snap_mapper;
+ OSDriver &driver = pg->osdriver;
+ coll_t coll = coll_t(pg->info.pgid);
+ pg->osr->flush();
+
+ if (pg->have_temp_coll())
+ remove_dir(
+ store, &mapper, &driver, pg->osr.get(), pg->get_temp_coll(), item.second);
+ remove_dir(store, &mapper, &driver, pg->osr.get(), coll, item.second);
+
+ ObjectStore::Transaction *t = new ObjectStore::Transaction;
+ PG::clear_info_log(
+ pg->info.pgid,
+ OSD::make_infos_oid(),
+ pg->log_oid,
+ t);
+ if (pg->have_temp_coll())
+ t->remove_collection(pg->get_temp_coll());
+ t->remove_collection(coll);
+ store->queue_transaction(
+ pg->osr.get(),
+ t,
+ new ObjectStore::C_DeleteTransactionHolder<pair<PGRef, DeletingStateRef> >(
+ t, item));
}
// =========================================
@@ -5935,14 +5955,8 @@ void OSD::_remove_pg(PG *pg)
service.cancel_pending_splits_for_parent(pg->info.pgid);
- coll_t to_remove = get_next_removal_coll(pg->info.pgid);
- removals.push_back(to_remove);
- rmt->collection_rename(coll_t(pg->info.pgid), to_remove);
- if (pg->have_temp_coll()) {
- to_remove = get_next_removal_coll(pg->info.pgid);
- removals.push_back(to_remove);
- rmt->collection_rename(pg->get_temp_coll(), to_remove);
- }
+ DeletingStateRef deleting = service.deleting_pgs.lookup_or_create(pg->info.pgid);
+ remove_wq.queue(make_pair(PGRef(pg), deleting));
store->queue_transaction(
pg->osr.get(), rmt,
@@ -5951,15 +5965,6 @@ void OSD::_remove_pg(PG *pg)
new ContainerContext<
SequencerRef>(pg->osr));
- DeletingStateRef deleting = service.deleting_pgs.lookup_or_create(pg->info.pgid);
- for (vector<coll_t>::iterator i = removals.begin();
- i != removals.end();
- ++i) {
- remove_wq.queue(new boost::tuple<coll_t, SequencerRef, DeletingStateRef>(
- *i, pg->osr, deleting));
- }
-
-
// remove from map
pg_map.erase(pg->info.pgid);
pg->put("PGMap"); // since we've taken it out of map