From 8bb66083e7e8c5ceb5c257b1d985f996c1da980c Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Tue, 15 May 2018 17:42:03 +0900 Subject: [PATCH] src/test: add a unit test for unset-manifest Signed-off-by: Myoungwon Oh --- src/test/librados/tier.cc | 132 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/src/test/librados/tier.cc b/src/test/librados/tier.cc index 77b256188fa..86e1e4b2404 100644 --- a/src/test/librados/tier.cc +++ b/src/test/librados/tier.cc @@ -3259,6 +3259,138 @@ TEST_F(LibRadosTwoPoolsPP, ManifestRefRead) { cluster.wait_for_latest_osdmap(); } +TEST_F(LibRadosTwoPoolsPP, ManifestUnset) { + // skip test if not yet nautilus + { + bufferlist inbl, outbl; + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd dump\"}", + inbl, &outbl, NULL)); + string s(outbl.c_str(), outbl.length()); + if (s.find("nautilus") == std::string::npos) { + cout << "cluster is not yet nautilus, skipping test" << std::endl; + return; + } + } + + // create object + { + bufferlist bl; + bl.append("hi there"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, ioctx.operate("foo", &op)); + } + { + bufferlist bl; + bl.append("base chunk"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, ioctx.operate("foo-chunk", &op)); + } + { + bufferlist bl; + bl.append("there"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, cache_ioctx.operate("bar", &op)); + } + { + bufferlist bl; + bl.append("CHUNK"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, cache_ioctx.operate("bar-chunk", &op)); + } + + // wait for maps to settle + cluster.wait_for_latest_osdmap(); + + // set-redirect + { + ObjectWriteOperation op; + op.set_redirect("bar", cache_ioctx, 0, CEPH_OSD_OP_FLAG_WITH_REFERENCE); + librados::AioCompletion *completion = cluster.aio_create_completion(); + ASSERT_EQ(0, ioctx.aio_operate("foo", completion, &op)); + completion->wait_for_safe(); + ASSERT_EQ(0, completion->get_return_value()); + completion->release(); + } + // set-chunk + { + ObjectWriteOperation op; + op.set_chunk(0, 2, cache_ioctx, "bar-chunk", 0, CEPH_OSD_OP_FLAG_WITH_REFERENCE); + librados::AioCompletion *completion = cluster.aio_create_completion(); + ASSERT_EQ(0, ioctx.aio_operate("foo-chunk", completion, &op)); + completion->wait_for_safe(); + ASSERT_EQ(0, completion->get_return_value()); + completion->release(); + } + // redirect's refcount + { + bufferlist in, out; + cache_ioctx.exec("bar", "refcount", "chunk_read", in, out); + cls_chunk_refcount_read_ret read_ret; + try { + auto iter = out.cbegin(); + decode(read_ret, iter); + } catch (buffer::error& err) { + ASSERT_TRUE(0); + } + ASSERT_EQ(1, read_ret.refs.size()); + } + // chunk's refcount + { + bufferlist in, out; + cache_ioctx.exec("bar-chunk", "refcount", "chunk_read", in, out); + cls_chunk_refcount_read_ret read_ret; + try { + auto iter = out.cbegin(); + decode(read_ret, iter); + } catch (buffer::error& err) { + ASSERT_TRUE(0); + } + ASSERT_EQ(1, read_ret.refs.size()); + } + + // unset-manifest for set-redirect + { + ObjectWriteOperation op; + op.unset_manifest(); + librados::AioCompletion *completion = cluster.aio_create_completion(); + ASSERT_EQ(0, ioctx.aio_operate("foo", completion, &op)); + completion->wait_for_safe(); + ASSERT_EQ(0, completion->get_return_value()); + completion->release(); + } + + // unset-manifest for set-chunk + { + ObjectWriteOperation op; + op.unset_manifest(); + librados::AioCompletion *completion = cluster.aio_create_completion(); + ASSERT_EQ(0, ioctx.aio_operate("foo-chunk", completion, &op)); + completion->wait_for_safe(); + ASSERT_EQ(0, completion->get_return_value()); + completion->release(); + } + // redirect's refcount + { + bufferlist in, out; + cache_ioctx.exec("bar", "refcount", "chunk_read", in, out); + ASSERT_EQ(0, out.length()); + } + // chunk's refcount + { + bufferlist in, out; + cache_ioctx.exec("bar-chunk", "refcount", "chunk_read", in, out); + ASSERT_EQ(0, out.length()); + } + + // wait for maps to settle before next test + cluster.wait_for_latest_osdmap(); +} + class LibRadosTwoPoolsECPP : public RadosTestECPP { public: -- 2.39.5