From: Sage Weil Date: Fri, 10 Jul 2015 15:35:23 +0000 (-0400) Subject: Merge branch 'wip-temp' X-Git-Tag: v9.0.3~52 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b30610c5bc63e7c16c7278c691c23d871eb02a96;p=ceph.git Merge branch 'wip-temp' Conflicts: src/osd/ReplicatedPG.cc src/test/osd/RadosModel.h Reviewed-by: Samuel Just Reviewed-by: David Zafman --- b30610c5bc63e7c16c7278c691c23d871eb02a96 diff --cc src/osd/ECBackend.cc index b97361e79c7d,07d0708ed45b..f51a3d2ca0e7 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@@ -243,22 -242,26 +242,28 @@@ void ECBackend::handle_recovery_push PushOp &op, RecoveryMessages *m) { + assert(m->t); + bool oneshot = op.before_progress.first && op.after_progress.data_complete; - coll_t tcoll = oneshot ? coll : get_temp_coll(m->t); + ghobject_t tobj; + if (oneshot) { + tobj = ghobject_t(op.soid, ghobject_t::NO_GEN, + get_parent()->whoami_shard().shard); + } else { + tobj = ghobject_t(get_parent()->get_temp_recovery_object(op.version, + op.soid.snap), + ghobject_t::NO_GEN, + get_parent()->whoami_shard().shard); + if (op.before_progress.first) { + dout(10) << __func__ << ": Adding oid " + << tobj.hobj << " in the temp collection" << dendl; + add_temp_obj(tobj.hobj); + } + } + if (op.before_progress.first) { - get_parent()->on_local_recover_start( - op.soid, - m->t); - m->t->remove( - get_temp_coll(m->t), - ghobject_t( - op.soid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard)); - m->t->touch( - tcoll, - ghobject_t( - op.soid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard)); + m->t->remove(coll, tobj); + m->t->touch(coll, tobj); } if (!op.data_included.empty()) { diff --cc src/osd/ReplicatedPG.cc index 8fdbe3f95aaa,9bddf49d664d..7ad5d7ca4714 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@@ -4722,9 -4720,9 +4720,9 @@@ int ReplicatedPG::do_osd_ops(OpContext tracepoint(osd, do_osd_op_pre_omapgetkeys, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return); set out_set; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator( - coll, soid + coll, ghobject_t(soid) ); assert(iter); iter->upper_bound(start_after); @@@ -4759,9 -4757,9 +4757,9 @@@ tracepoint(osd, do_osd_op_pre_omapgetvals, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return, filter_prefix.c_str()); map out_set; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator( - coll, soid + coll, ghobject_t(soid) ); if (!iter) { result = -ENOENT; @@@ -4811,8 -4809,8 +4809,8 @@@ } tracepoint(osd, do_osd_op_pre_omapgetvalsbykeys, soid.oid.name.c_str(), soid.snap.val, list_entries(keys_to_get).c_str()); map out; - if (!pool.info.require_rollback()) { + if (pool.info.supports_omap()) { - osd->store->omap_get_values(coll, soid, keys_to_get, &out); + osd->store->omap_get_values(coll, ghobject_t(soid), keys_to_get, &out); } // else return empty omap entries ::encode(out, osd_op.outdata); ctx->delta_stats.num_rd_kb += SHIFT_ROUND_UP(osd_op.outdata.length(), 10); diff --cc src/test/osd/RadosModel.h index 504e903aeb8c,2596cd9ea259..ed4bdb86e150 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@@ -998,14 -998,14 +999,16 @@@ public ReadOp(int n, RadosTestContext *context, const string &oid, + bool balance_reads, TestOpStat *stat = 0) : TestOp(n, context, stat), - completion(NULL), + completions(3), oid(oid), snap(0), + balance_reads(balance_reads), - retval(0), + results(3), + retvals(3), + waiting_on(0), attrretval(0) {} @@@ -1079,23 -1076,11 +1082,29 @@@ op.omap_get_header(&header, 0); } op.getxattrs(&xattrs, 0); - assert(!context->io_ctx.aio_operate(context->prefix+oid, completions[0], &op, 0)); ++ + unsigned flags = 0; + if (balance_reads) + flags |= librados::OPERATION_BALANCE_READS; - assert(!context->io_ctx.aio_operate(context->prefix+oid, completion, &op, ++ ++ assert(!context->io_ctx.aio_operate(context->prefix+oid, completions[0], &op, + flags, NULL)); + waiting_on++; + + // send 2 pipelined reads on the same object/snap. This can help testing + // OSD's read behavior in some scenarios + for (uint32_t i = 1; i < 3; ++i) { + librados::ObjectReadOperation pipeline_op; + + pipeline_op.read(0, + !old_value.has_contents() ? 0 : + old_value.most_recent_gen()->get_length(old_value.most_recent()), + &results[i], + &retvals[i]); + assert(!context->io_ctx.aio_operate(context->prefix+oid, completions[i], &pipeline_op, 0)); + waiting_on++; + } + if (snap >= 0) { context->io_ctx.snap_set_read(0); }