From 86ffc0bc1ac583c491132bef1e410fd1f36a9b55 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Fri, 28 Jun 2019 18:59:51 +0900 Subject: [PATCH] src/test: add tier-flush test Signed-off-by: Myoungwon Oh --- src/test/librados/tier_cxx.cc | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/src/test/librados/tier_cxx.cc b/src/test/librados/tier_cxx.cc index 0f5c4ef2d8e..2417501489d 100644 --- a/src/test/librados/tier_cxx.cc +++ b/src/test/librados/tier_cxx.cc @@ -3519,6 +3519,94 @@ TEST_F(LibRadosTwoPoolsPP, ManifestDedupRefRead) { cluster.wait_for_latest_osdmap(); } +TEST_F(LibRadosTwoPoolsPP, ManifestFlushRead) { + // skip test if not yet octopus + if (_get_required_osd_release(cluster) < "octopus") { + cout << "cluster is not yet octopus, skipping test" << std::endl; + return; + } + + // create object + { + bufferlist bl; + bl.append("base chunk"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, ioctx.operate("foo-chunk", &op)); + } + { + bufferlist bl; + bl.append("CHUNKS"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, cache_ioctx.operate("bar-chunk", &op)); + } + + // configure tier + bufferlist inbl; + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier add\", \"pool\": \"" + pool_name + + "\", \"tierpool\": \"" + cache_pool_name + + "\", \"force_nonempty\": \"--force-nonempty\" }", + inbl, NULL, NULL)); + + // wait for maps to settle + cluster.wait_for_latest_osdmap(); + + // set-chunk + { + ObjectWriteOperation op; + op.set_chunk(0, 2, cache_ioctx, "bar-chunk", 0); + 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(); + } + // set-chunk + { + ObjectWriteOperation op; + op.set_chunk(2, 2, cache_ioctx, "bar-chunk", 2); + 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(); + } + // make chunked object dirty + { + bufferlist bl; + bl.append("DD"); + ObjectWriteOperation op; + op.write(0, bl); + ASSERT_EQ(0, ioctx.operate("foo-chunk", &op)); + } + // flush + { + ObjectWriteOperation op; + op.tier_flush(); + 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(); + } + // read and verify the chunked object + { + bufferlist bl; + ASSERT_EQ(1, cache_ioctx.read("bar-chunk", bl, 1, 0)); + ASSERT_EQ('D', bl[0]); + } + + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name + + "\", \"tierpool\": \"" + cache_pool_name + "\"}", + inbl, NULL, NULL)); + + // wait for maps to settle before next test + cluster.wait_for_latest_osdmap(); +} + class LibRadosTwoPoolsECPP : public RadosTestECPP { public: -- 2.39.5