From: Samuel Just Date: Wed, 5 Nov 2014 20:12:14 +0000 (-0800) Subject: osd: use OSDMap helper to tell if ops are misdirected X-Git-Tag: v0.80.8~26^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F2760%2Fhead;p=ceph.git osd: use OSDMap helper to tell if ops are misdirected calc_pg_role doesn't actually take into account primary affinity. Fixes: #9835 Signed-off-by: Samuel Just --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index dce5a726870..0da860bd952 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -5879,11 +5879,7 @@ void OSD::advance_map(ObjectStore::Transaction& t, C_Contexts *tfin) while (p != waiting_for_pg.end()) { spg_t pgid = p->first; - vector acting; - int nrep = osdmap->pg_to_acting_osds(pgid.pgid, acting); - int role = osdmap->calc_pg_role(whoami, acting, nrep); - const pg_pool_t *pi = osdmap->get_pg_pool(pgid.pool()); - if (role == 0 || (role > 0 && !pi->is_erasure())) { + if (osdmap->osd_is_valid_op_target(pgid.pgid, whoami)) { ++p; // still me } else { dout(10) << " discarding waiting ops for " << pgid << dendl; @@ -7571,9 +7567,7 @@ void OSD::handle_op(OpRequestRef op) if (!pg) { dout(7) << "hit non-existent pg " << pgid << dendl; - const pg_pool_t *pi = osdmap->get_pg_pool(pgid.pool()); - int role = osdmap->get_pg_acting_role(pgid.pgid, whoami); - if (role == 0 || (role > 0 && !pi->is_erasure())) { + if (osdmap->osd_is_valid_op_target(pgid.pgid, whoami)) { dout(7) << "we are valid target for op, waiting" << dendl; waiting_for_pg[pgid].push_back(op); op->mark_delayed("waiting for pg to exist locally"); @@ -7587,7 +7581,7 @@ void OSD::handle_op(OpRequestRef op) } OSDMapRef send_map = get_map(m->get_map_epoch()); - if (send_map->get_pg_acting_role(pgid.pgid, whoami) >= 0) { + if (send_map->osd_is_valid_op_target(pgid.pgid, whoami)) { dout(7) << "dropping request; client will resend when they get new map" << dendl; } else if (!send_map->have_pg_pool(pgid.pool())) { dout(7) << "dropping request; pool did not exist" << dendl;