From: myoungwon oh Date: Wed, 24 Jan 2018 08:54:46 +0000 (+0900) Subject: src/test/osd/RadosModel: modify SetRedirect to support two pool X-Git-Tag: v13.0.2~430^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=14fab80911180cc0c9d7f45d128d2926cd4761e2;p=ceph.git src/test/osd/RadosModel: modify SetRedirect to support two pool Signed-off-by: Myoungwon Oh --- diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index 7daebec8352..94909cb986a 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -2434,16 +2434,22 @@ public: context->oid_redirect_in_use.insert(oid_tgt); context->oid_redirect_not_in_use.erase(oid_tgt); + if (tgt_pool_name.empty()) ceph_abort(); + context->find_object(oid, &src_value); if(!context->redirect_objs[oid].empty()) { - /* update target's user_version */ - rd_op.stat(NULL, NULL, NULL); + /* copy_from oid --> oid_tgt */ comp = context->rados.aio_create_completion(); - context->io_ctx.aio_operate(context->prefix+oid_tgt, comp, &rd_op, - librados::OPERATION_ORDER_READS_WRITES, - NULL); + string src = context->prefix+oid; + op.copy_from(src.c_str(), context->io_ctx, src_value.version); + context->low_tier_io_ctx.aio_operate(context->prefix+oid_tgt, comp, &op, + librados::OPERATION_ORDER_READS_WRITES); comp->wait_for_safe(); - context->update_object_version(oid_tgt, comp->get_version64()); + if ((r = comp->get_return_value())) { + cerr << "Error: oid " << oid << " copy_from " << oid_tgt << " returned error code " + << r << std::endl; + ceph_abort(); + } comp->release(); /* unset redirect target */ @@ -2465,23 +2471,6 @@ public: context->oid_redirect_not_in_use.insert(context->redirect_objs[oid]); context->oid_redirect_in_use.erase(context->redirect_objs[oid]); - - /* copy_from oid_tgt --> oid */ - comp = context->rados.aio_create_completion(); - context->find_object(oid_tgt, &tgt_value); - string src = context->prefix+oid_tgt; - op.copy_from(src.c_str(), context->io_ctx, tgt_value.version); - context->io_ctx.aio_operate(context->prefix+oid, comp, &op, - librados::OPERATION_ORDER_READS_WRITES); - comp->wait_for_safe(); - if ((r = comp->get_return_value())) { - cerr << "Error: oid " << oid << " copy_from " << oid_tgt << " returned error code " - << r << std::endl; - ceph_abort(); - } - context->update_object_full(oid, tgt_value); - context->update_object_version(oid, comp->get_version64()); - comp->release(); } comp = context->rados.aio_create_completion(); @@ -2499,15 +2488,27 @@ public: context->update_object_version(oid, comp->get_version64()); comp->release(); + comp = context->rados.aio_create_completion(); + rd_op.stat(NULL, NULL, NULL); + context->low_tier_io_ctx.aio_operate(context->prefix+oid_tgt, comp, &rd_op, + librados::OPERATION_ORDER_READS_WRITES | + librados::OPERATION_IGNORE_REDIRECT, + NULL); + comp->wait_for_safe(); + if ((r = comp->get_return_value())) { + cerr << "Error: oid " << oid_tgt << " stat returned error code " + << r << std::endl; + ceph_abort(); + } + uint64_t tgt_version = comp->get_version64(); + comp->release(); + + context->find_object(oid, &src_value); - context->find_object(oid_tgt, &tgt_value); - - if (!src_value.deleted() && !tgt_value.deleted()) - context->update_object_full(oid, tgt_value); if (src_value.version != 0 && !src_value.deleted()) op.assert_version(src_value.version); - op.set_redirect(context->prefix+oid_tgt, context->io_ctx, tgt_value.version); + op.set_redirect(context->prefix+oid_tgt, context->low_tier_io_ctx, tgt_version); pair *cb_arg = new pair(this, diff --git a/src/test/osd/TestRados.cc b/src/test/osd/TestRados.cc index d9838fbf2d7..2ef3309f71a 100644 --- a/src/test/osd/TestRados.cc +++ b/src/test/osd/TestRados.cc @@ -120,7 +120,12 @@ public: * 2. initialize target objects (using write op) * 3. wait for set-* completion */ - int copy_manifest_end = m_objects*2; + int copy_manifest_end = 0; + if (m_set_chunk) { + copy_manifest_end = m_objects*2; + } else { + copy_manifest_end = m_objects*3; + } int make_manifest_end = copy_manifest_end; if (m_set_chunk) { /* make 10 chunks per an object*/ @@ -146,13 +151,18 @@ public: return true; } else if (m_op <= copy_manifest_end) { stringstream oid, oid2; - int _oid = m_op-m_objects; + //int _oid = m_op-m_objects; + int _oid = m_op % m_objects + 1; oid << _oid; if ((_oid) % 2) { oid << " " << string(300, 'o'); } - oid2 << _oid << " " << context.low_tier_pool_name; - if ((_oid) % 2) { + int _oid2 = m_op - m_objects + 1; + if (_oid2 > copy_manifest_end - m_objects) { + _oid2 -= (copy_manifest_end - m_objects); + } + oid2 << _oid2 << " " << context.low_tier_pool_name; + if ((_oid2) % 2) { oid2 << " " << string(300, 'm'); } cout << m_op << ": " << "copy oid " << oid.str() << " target oid " @@ -171,6 +181,13 @@ public: if ((_oid) % 2) { oid2 << " " << string(300, 'm'); } + if (context.oid_in_use.count(oid.str())) { + /* previous copy is not finished */ + op = NULL; + m_op--; + cout << m_op << " retry set_redirect !" << std::endl; + return true; + } cout << m_op << ": " << "set_redirect oid " << oid.str() << " target oid " << oid2.str() << std::endl; op = new SetRedirectOp(m_op, &context, oid.str(), oid2.str(), context.pool_name); @@ -237,6 +254,7 @@ public: if (t_op % 2) { oid << " " << string(300, 'm'); } + cout << " redirect_not_in_use: " << oid.str() << std::endl; context.oid_redirect_not_in_use.insert(oid.str()); } }