From 7bafc73f8a2af9caa78a3d520a2b3ca4701c8be1 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Tue, 6 Jun 2017 00:17:31 +0800 Subject: [PATCH] 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 --- src/osd/PrimaryLogPG.cc | 4 ++++ src/osdc/Objecter.cc | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 3f5adc1f33d09..efe034ef4eb46 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 6e4d24259cd02..78a39f0b0f43a 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; -- 2.39.5