]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: use OSDMap helper to tell if ops are misdirected 2760/head
authorSamuel Just <sam.just@inktank.com>
Wed, 5 Nov 2014 20:12:14 +0000 (12:12 -0800)
committerSage Weil <sage@redhat.com>
Thu, 13 Nov 2014 01:14:53 +0000 (17:14 -0800)
calc_pg_role doesn't actually take into account primary affinity.

Fixes: #9835
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/OSD.cc

index dce5a7268709683f9be829d34b4a0b840336de75..0da860bd952255974b030a3459c9b0d5ee612cab 100644 (file)
@@ -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<int> 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;