summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2014-03-15 17:58:35 -0700
committerSamuel Just <sam.just@inktank.com>2014-03-15 17:58:37 -0700
commit04de781765dd5ac0e28dd1a43cfe85020c0854f8 (patch)
tree54d4e6d7953cdb3e8eaf5335783e924a99852359
parent4dd94a006237a67bc8db536dcf36a2c038c1dc48 (diff)
downloadceph-04de781765dd5ac0e28dd1a43cfe85020c0854f8.tar.gz
OSD::handle_pg_query: on dne pg, send lb=hobject_t() if deleting
We will set lb=hobject_t() if we resurrect the pg. In that case, we need to have sent that to the primary before hand. If we finish the removal before the pg is recreated, we'll just end up backfilling it, which is ok since the pg doesn't exist anyway. Fixes: #7740 Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/osd/OSD.cc5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 54e0febeeb1..60a54a620b9 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -6938,6 +6938,11 @@ void OSD::handle_pg_query(OpRequestRef op)
dout(10) << " pg " << pgid << " dne" << dendl;
pg_info_t empty(spg_t(pgid.pgid, it->second.to));
+ /* This is racy, but that should be ok: if we complete the deletion
+ * before the pg is recreated, we'll just start it off backfilling
+ * instead of just empty */
+ if (service.deleting_pgs.lookup(pgid))
+ empty.last_backfill = hobject_t();
if (it->second.type == pg_query_t::LOG ||
it->second.type == pg_query_t::FULLLOG) {
ConnectionRef con = service.get_con_osd_cluster(from, osdmap->get_epoch());