]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: fix load_pgs handling of pg dirs without a head
authorSage Weil <sage@inktank.com>
Sat, 9 Feb 2013 08:04:29 +0000 (00:04 -0800)
committerSamuel Just <sam.just@inktank.com>
Tue, 19 Mar 2013 17:43:18 +0000 (10:43 -0700)
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>
(cherry picked from commit 1f80a0b576c0af1931f743ad988b6293cbf2d6d9)

src/osd/OSD.cc

index 4e44207ddc5344a1b5d36fee03e58347b0caaa75..cd5cd8468711ed5967f72173d11f262717aaeef7 100644 (file)
@@ -1483,6 +1483,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();
@@ -1521,6 +1522,7 @@ void OSD::load_pgs()
       continue;
     }
     pgs[pgid];
+    head_pgs.insert(pgid);
   }
 
   for (map<pg_t, interval_set<snapid_t> >::iterator i = pgs.begin();
@@ -1528,6 +1530,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;