summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-02-09 09:41:02 -0800
committerSage Weil <sage@inktank.com>2013-02-09 09:41:02 -0800
commit6d199e22fbe390bc2d6c4e1cd0c3fa319dc7a577 (patch)
tree6f49b0608b5014e1f56f9791d6d3705e577e4e93
parentead68b47f44deee4183aabf4418c258f77c19202 (diff)
parentb19b6dced85617d594c15631571202aab2f94ae8 (diff)
downloadceph-6d199e22fbe390bc2d6c4e1cd0c3fa319dc7a577.tar.gz
Merge branch 'next'
-rw-r--r--src/osd/OSD.cc65
1 files changed, 38 insertions, 27 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 669729f05ff..1785678ced4 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -1518,44 +1518,48 @@ void OSD::load_pgs()
derr << "failed to list pgs: " << cpp_strerror(-r) << dendl;
}
+ set<pg_t> head_pgs;
map<pg_t, interval_set<snapid_t> > pgs;
for (vector<coll_t>::iterator it = ls.begin();
it != ls.end();
it++) {
pg_t pgid;
snapid_t snap;
- if (!it->is_pg(pgid, snap)) {
- if (it->is_temp(pgid))
- clear_temp(store, *it);
- dout(10) << "load_pgs skipping non-pg " << *it << dendl;
- if (it->is_temp(pgid)) {
- clear_temp(store, *it);
- continue;
- }
- uint64_t seq;
- if (it->is_removal(&seq, &pgid)) {
- if (seq >= next_removal_seq)
- next_removal_seq = seq + 1;
- dout(10) << "queueing coll " << *it << " for removal, seq is "
- << seq << "pgid is " << pgid << dendl;
- boost::tuple<coll_t, SequencerRef, DeletingStateRef> *to_queue =
- new boost::tuple<coll_t, SequencerRef, DeletingStateRef>;
- to_queue->get<0>() = *it;
- to_queue->get<1>() = service.osr_registry.lookup_or_create(
- pgid, stringify(pgid));
- to_queue->get<2>() = service.deleting_pgs.lookup_or_create(pgid);
- remove_wq.queue(to_queue);
- continue;
+
+ if (it->is_temp(pgid)) {
+ dout(10) << "load_pgs " << *it << " clearing temp" << dendl;
+ clear_temp(store, *it);
+ continue;
+ }
+
+ if (it->is_pg(pgid, snap)) {
+ if (snap != CEPH_NOSNAP) {
+ dout(10) << "load_pgs skipping snapped dir " << *it
+ << " (pg " << pgid << " snap " << snap << ")" << dendl;
+ pgs[pgid].insert(snap);
+ } else {
+ pgs[pgid];
+ head_pgs.insert(pgid);
}
continue;
}
- if (snap != CEPH_NOSNAP) {
- dout(10) << "load_pgs skipping snapped dir " << *it
- << " (pg " << pgid << " snap " << snap << ")" << dendl;
- pgs[pgid].insert(snap);
+
+ uint64_t seq;
+ if (it->is_removal(&seq, &pgid)) {
+ if (seq >= next_removal_seq)
+ next_removal_seq = seq + 1;
+ dout(10) << "load_pgs queueing " << *it << " for removal, seq is "
+ << seq << " pgid is " << pgid << dendl;
+ boost::tuple<coll_t, SequencerRef, DeletingStateRef> *to_queue =
+ new boost::tuple<coll_t, SequencerRef, DeletingStateRef>;
+ to_queue->get<0>() = *it;
+ to_queue->get<1>() = service.osr_registry.lookup_or_create(pgid, stringify(pgid));
+ to_queue->get<2>() = service.deleting_pgs.lookup_or_create(pgid);
+ remove_wq.queue(to_queue);
continue;
}
- pgs[pgid];
+
+ dout(10) << "load_pgs ignoring unrecognized " << *it << dendl;
}
for (map<pg_t, interval_set<snapid_t> >::iterator i = pgs.begin();
@@ -1563,6 +1567,12 @@ void OSD::load_pgs()
++i) {
pg_t pgid(i->first);
+ if (!head_pgs.count(pgid)) {
+ dout(10) << __func__ << ": " << pgid << " has orphan snap collections " << i->second
+ << " with no head" << dendl;
+ continue;
+ }
+
if (!osdmap->have_pg_pool(pgid.pool())) {
dout(10) << __func__ << ": skipping PG " << pgid << " because we don't have pool "
<< pgid.pool() << dendl;
@@ -1575,6 +1585,7 @@ void OSD::load_pgs()
continue;
}
+ dout(10) << "pgid " << pgid << " coll " << coll_t(pgid) << dendl;
bufferlist bl;
epoch_t map_epoch = PG::peek_map_epoch(store, coll_t(pgid), &bl);