From: myoungwon oh Date: Wed, 3 Feb 2021 13:34:49 +0000 (+0900) Subject: src/test: add TierEvictOp to ceph_test_rados X-Git-Tag: v17.1.0~2307^2~47 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=788fddc79604ba54b76641262553ceabd12ec797;p=ceph.git src/test: add TierEvictOp to ceph_test_rados Signed-off-by: Myoungwon Oh --- diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index 7f20d6ff07e..063bd1a8742 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -65,7 +65,8 @@ enum TestOpType { TEST_OP_CHUNK_READ, TEST_OP_TIER_PROMOTE, TEST_OP_TIER_FLUSH, - TEST_OP_SET_CHUNK + TEST_OP_SET_CHUNK, + TEST_OP_TIER_EVICT }; class TestWatchContext : public librados::WatchCtx2 { @@ -2747,6 +2748,72 @@ public: } }; +class TierEvictOp : public TestOp { +public: + librados::AioCompletion *completion; + librados::ObjectReadOperation op; + string oid; + std::shared_ptr in_use; + + TierEvictOp(int n, + RadosTestContext *context, + const string &oid, + TestOpStat *stat) + : TestOp(n, context, stat), + completion(NULL), + oid(oid) + {} + + void _begin() override + { + context->state_lock.lock(); + + pair *cb_arg = + new pair(this, + new TestOp::CallbackInfo(0)); + completion = context->rados.aio_create_completion((void *) cb_arg, + &write_callback); + context->state_lock.unlock(); + + op.cache_evict(); + int r = context->io_ctx.aio_operate(context->prefix+oid, completion, + &op, librados::OPERATION_IGNORE_CACHE, + NULL); + ceph_assert(!r); + } + + void _finish(CallbackInfo *info) override + { + std::lock_guard state_locker{context->state_lock}; + ceph_assert(!done); + ceph_assert(completion->is_complete()); + + int r = completion->get_return_value(); + cout << num << ": got " << cpp_strerror(r) << std::endl; + if (r == 0) { + // ok + } else if (r == -EINVAL) { + // probably this is not manifest object + } else if (r == -ENOENT) { + // may have raced with a remove? + } else { + ceph_abort_msg("shouldn't happen"); + } + context->kick(); + done = true; + } + + bool finished() override + { + return done; + } + + string getType() override + { + return "TierEvictOp"; + } +}; + class HitSetListOp : public TestOp { librados::AioCompletion *comp1, *comp2; uint32_t hash; diff --git a/src/test/osd/TestRados.cc b/src/test/osd/TestRados.cc index 53dca91d86c..d06bceafd82 100644 --- a/src/test/osd/TestRados.cc +++ b/src/test/osd/TestRados.cc @@ -459,6 +459,11 @@ private: return new SetChunkOp(m_op, &context, oid, rand_offset, rand_length, oid2, rand_offset, m_stats); } + case TEST_OP_TIER_EVICT: + oid = *(rand_choose(context.oid_not_in_use)); + cout << m_op << ": " << "tier_evict oid " << oid << std::endl; + return new TierEvictOp(m_op, &context, oid, m_stats); + default: cerr << m_op << ": Invalid op type " << type << std::endl; ceph_abort(); @@ -525,6 +530,7 @@ int main(int argc, char **argv) { TEST_OP_TIER_PROMOTE, "tier_promote", true }, { TEST_OP_TIER_FLUSH, "tier_flush", true }, { TEST_OP_SET_CHUNK, "set_chunk", true }, + { TEST_OP_TIER_EVICT, "tier_evict", true }, { TEST_OP_READ /* grr */, NULL }, };