From: Sage Weil Date: Sat, 27 May 2017 02:50:14 +0000 (-0400) Subject: Merge branch 'wip-extensible_tier-redirect' of git://github.com/myoungwon/ceph into... X-Git-Tag: v12.1.0~57^2~9^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a4247dd5943b605994e012004fd860b4393f9f5c;p=ceph.git Merge branch 'wip-extensible_tier-redirect' of git://github.com/myoungwon/ceph into wip-redirect --- a4247dd5943b605994e012004fd860b4393f9f5c diff --cc src/osd/PrimaryLogPG.cc index c8fc5cb5b147,c462047a7f0f..e6d57cd09e5e --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@@ -2292,10 -2245,54 +2299,57 @@@ void PrimaryLogPG::do_op(OpRequestRef& } else if (op->may_write() || op->may_cache()) { osd->logger->tinc(l_osd_op_w_prepare_lat, prepare_latency); } + + // force recovery of the oldest missing object if too many logs + maybe_force_recovery(); } + PrimaryLogPG::cache_result_t PrimaryLogPG::maybe_handle_manifest_detail( + OpRequestRef op, + bool write_ordered, + ObjectContextRef obc) + { + if (static_cast(op->get_req())->get_flags() & + CEPH_OSD_FLAG_IGNORE_REDIRECT) { + dout(20) << __func__ << ": ignoring redirect due to flag" << dendl; + return cache_result_t::NOOP; + } + + if (obc) + dout(10) << __func__ << " " << obc->obs.oi << " " + << (obc->obs.exists ? "exists" : "DNE") + << dendl; + + // if it is write-ordered and blocked, stop now + if (obc.get() && obc->is_blocked() && write_ordered) { + // we're already doing something with this object + dout(20) << __func__ << " blocked on " << obc->obs.oi.soid << dendl; + return cache_result_t::NOOP; + } + + vector ops = static_cast(op->get_req())->ops; + for (vector::iterator p = ops.begin(); p != ops.end(); ++p) { + OSDOp& osd_op = *p; + ceph_osd_op& op = osd_op.op; + if (op.op == CEPH_OSD_OP_SET_REDIRECT) { + return cache_result_t::NOOP; + } + } + + switch (obc->obs.oi.manifest.type) { + case object_manifest_t::TYPE_REDIRECT: + if (op->may_write() || write_ordered) { + do_proxy_write(op, obc->obs.oi.soid, obc); + } else { + do_proxy_read(op, obc); + } + return cache_result_t::HANDLED_PROXY; + case object_manifest_t::TYPE_CHUNKED: + default: + assert(0 == "unrecognized manifest type"); + } + + return cache_result_t::NOOP; + } void PrimaryLogPG::record_write_error(OpRequestRef op, const hobject_t &soid, MOSDOpReply *orig_reply, int r)