summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-02-09 00:04:29 -0800
committerSage Weil <sage@inktank.com>2013-02-09 09:40:54 -0800
commit1f80a0b576c0af1931f743ad988b6293cbf2d6d9 (patch)
tree962ccea2b34356468d20d14ce88d1e49d276fd7a
parent073f58ede2e473af91f76d01679631c169274af7 (diff)
downloadceph-1f80a0b576c0af1931f743ad988b6293cbf2d6d9.tar.gz
osd: fix load_pgs handling of pg dirs without a head
If there is a pgid that passes coll_t::is_pg() but there is no head, we will populate the pgs map but then fail later when we try to do read_state. This is a side-effect of 55f8579. Take explicit note of _head collections we see, and then warn when we find stray snap collections. Signed-off-by: Sage Weil <sage@inktank.com> Reviewed-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/osd/OSD.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 8d10734552a..a0c2cce0ecd 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -1518,6 +1518,7 @@ 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();
@@ -1556,6 +1557,7 @@ void OSD::load_pgs()
continue;
}
pgs[pgid];
+ head_pgs.insert(pgid);
}
for (map<pg_t, interval_set<snapid_t> >::iterator i = pgs.begin();
@@ -1563,6 +1565,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;