return 0;
}
+ utime_t start = ceph_clock_now(g_ceph_context);
// set up the sequencer
OpSequencer *osr;
- if (!posr)
- posr = &default_osr;
+ assert(posr);
if (posr->p) {
osr = static_cast<OpSequencer *>(posr->p.get());
- dout(5) << "queue_transactions existing " << *osr << "/" << osr->parent << dendl; //<< " w/ q " << osr->q << dendl;
+ dout(5) << "queue_transactions existing " << osr << " " << *osr << dendl;
} else {
- osr = new OpSequencer;
+ osr = new OpSequencer(next_osr_id.inc());
+ osr->set_cct(g_ceph_context);
osr->parent = posr;
posr->p = osr;
- dout(5) << "queue_transactions new " << *osr << "/" << osr->parent << dendl;
+ dout(5) << "queue_transactions new " << osr << " " << *osr << dendl;
}
// used to include osr information in tracepoints during transaction apply
ctx->src_obc.swap(src_obc);
execute_ctx(ctx);
+ utime_t prepare_latency = ceph_clock_now(cct);
+ prepare_latency -= op->get_dequeued_time();
+ osd->logger->tinc(l_osd_op_prepare_lat, prepare_latency);
+ if (op->may_read() && op->may_write()) {
+ osd->logger->tinc(l_osd_op_rw_prepare_lat, prepare_latency);
+ } else if (op->may_read()) {
+ osd->logger->tinc(l_osd_op_r_prepare_lat, prepare_latency);
+ } else if (op->may_write() || op->may_cache()) {
+ osd->logger->tinc(l_osd_op_w_prepare_lat, prepare_latency);
+ }
}
-bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
- bool write_ordered,
- ObjectContextRef obc,
- int r, const hobject_t& missing_oid,
- bool must_promote,
- bool in_hit_set)
-{
+ReplicatedPG::cache_result_t ReplicatedPG::maybe_handle_cache_detail(
+ OpRequestRef op,
+ bool write_ordered,
+ ObjectContextRef obc,
+ int r, hobject_t missing_oid,
+ bool must_promote,
+ bool in_hit_set,
+ ObjectContextRef *promote_obc)
+{
+ if (op &&
+ op->get_req() &&
+ op->get_req()->get_type() == CEPH_MSG_OSD_OP &&
+ (static_cast<MOSDOp *>(op->get_req())->get_flags() &
+ CEPH_OSD_FLAG_IGNORE_CACHE)) {
+ dout(20) << __func__ << ": ignoring cache due to flag" << dendl;
+ return cache_result_t::NOOP;
+ }
// return quickly if caching is not enabled
if (pool.info.cache_mode == pg_pool_t::CACHEMODE_NONE)
- return false;
+ return cache_result_t::NOOP;
+
+ must_promote = must_promote || op->need_promote();
if (obc)
dout(25) << __func__ << " " << obc->obs.oi << " "