diff options
author | Sage Weil <sage@inktank.com> | 2013-02-09 00:04:29 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-09 09:40:54 -0800 |
commit | 1f80a0b576c0af1931f743ad988b6293cbf2d6d9 (patch) | |
tree | 962ccea2b34356468d20d14ce88d1e49d276fd7a | |
parent | 073f58ede2e473af91f76d01679631c169274af7 (diff) | |
download | ceph-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.cc | 8 |
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; |