From: Xuehan Xu Date: Mon, 5 Jun 2017 16:17:31 +0000 (+0800) Subject: redirect balanced reads to acting primary when necessary X-Git-Tag: ses5-milestone8~1^2~14^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7bafc73f8a2af9caa78a3d520a2b3ca4701c8be1;p=ceph.git redirect balanced reads to acting primary when necessary Redirect balanced read requests to acting primary when the targeting object hasn't been recovered on replica OSDs. Fixes: http://tracker.ceph.com/issues/17968 Signed-off-by: Xuehan Xu --- diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 3f5adc1f33d0..efe034ef4eb4 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1989,6 +1989,10 @@ void PrimaryLogPG::do_op(OpRequestRef& op) // missing object? if (is_unreadable_object(head)) { + if (!is_primary()) { + osd->reply_op_error(op, -EAGAIN); + return; + } if (can_backoff && (g_conf->osd_backoff_on_degraded || (g_conf->osd_backoff_on_unfound && missing_loc.is_unfound(head)))) { diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 6e4d24259cd0..78a39f0b0f43 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -3412,6 +3412,22 @@ void Objecter::handle_osd_op_reply(MOSDOpReply *m) if (rc == -EAGAIN) { ldout(cct, 7) << " got -EAGAIN, resubmitting" << dendl; + if ((op->target.flags & CEPH_OSD_FLAG_BALANCE_READS) + && (op->target.acting_primary != op->target.osd)) { + if (op->onfinish) + num_in_flight--; + _session_op_remove(s, op); + sl.unlock(); + put_session(s); + + op->tid = 0; + op->target.flags &= ~CEPH_OSD_FLAG_BALANCE_READS; + op->target.pgid = pg_t(); + _op_submit(op, sul, NULL); + m->put(); + return; + } + // new tid s->ops.erase(op->tid); op->tid = ++last_tid;