]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
src/test/osd/RadosModel: modify SetRedirect to support two pool
authormyoungwon oh <omwmw@sk.com>
Wed, 24 Jan 2018 08:54:46 +0000 (17:54 +0900)
committermyoungwon oh <omwmw@sk.com>
Wed, 24 Jan 2018 10:43:43 +0000 (19:43 +0900)
Signed-off-by: Myoungwon Oh <omwmw@sk.com>
src/test/osd/RadosModel.h
src/test/osd/TestRados.cc

index 7daebec83521f93e00073e90ba121e75508a7eee..94909cb986adb631106a66025ca4d1f573a930ca 100644 (file)
@@ -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<TestOp*, TestOp::CallbackInfo*> *cb_arg =
       new pair<TestOp*, TestOp::CallbackInfo*>(this,
index d9838fbf2d7f2208f7f3126b2be3b045dd0de84b..2ef3309f71a3bce5105309fc4429a44aa6066582 100644 (file)
@@ -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());
       }
     }