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 */
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();
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<TestOp*, TestOp::CallbackInfo*> *cb_arg =
new pair<TestOp*, TestOp::CallbackInfo*>(this,
* 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*/
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 "
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);
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());
}
}