]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/librados/testcase_cxx.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "testcase_cxx.h"
7 #include <fmt/format.h>
9 #include "test_shared.h"
10 #include "crimson_utils.h"
11 #include "include/scope_guard.h"
13 using namespace librados
;
18 static bool seeded
= false;
22 std::cout
<< "seed " << seed
<< std::endl
;
27 } // anonymous namespace
29 std::string
RadosTestPPNS::pool_name
;
30 Rados
RadosTestPPNS::s_cluster
;
32 void RadosTestPPNS::SetUpTestCase()
34 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
35 pool_name
= get_temp_pool_name(pool_prefix
);
36 ASSERT_EQ("", create_one_pool_pp(pool_name
, s_cluster
));
39 void RadosTestPPNS::TearDownTestCase()
41 ASSERT_EQ(0, destroy_one_pool_pp(pool_name
, s_cluster
));
44 void RadosTestPPNS::SetUp()
46 ASSERT_EQ(0, cluster
.ioctx_create(pool_name
.c_str(), ioctx
));
48 ASSERT_EQ(0, ioctx
.pool_requires_alignment2(&req
));
52 void RadosTestPPNS::TearDown()
55 cleanup_all_objects(ioctx
);
59 void RadosTestPPNS::cleanup_all_objects(librados::IoCtx ioctx
)
61 // remove all objects to avoid polluting other tests
62 ioctx
.snap_set_read(librados::SNAP_HEAD
);
63 ioctx
.set_namespace(all_nspaces
);
64 for (NObjectIterator it
= ioctx
.nobjects_begin();
65 it
!= ioctx
.nobjects_end(); ++it
) {
66 ioctx
.locator_set_key(it
->get_locator());
67 ioctx
.set_namespace(it
->get_nspace());
68 ASSERT_EQ(0, ioctx
.remove(it
->get_oid()));
72 std::string
RadosTestParamPPNS::pool_name
;
73 std::string
RadosTestParamPPNS::cache_pool_name
;
74 Rados
RadosTestParamPPNS::s_cluster
;
76 void RadosTestParamPPNS::SetUpTestCase()
78 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
79 pool_name
= get_temp_pool_name(pool_prefix
);
80 ASSERT_EQ("", create_one_pool_pp(pool_name
, s_cluster
));
83 void RadosTestParamPPNS::TearDownTestCase()
85 if (cache_pool_name
.length()) {
88 ASSERT_EQ(0, s_cluster
.mon_command(
89 "{\"prefix\": \"osd tier remove-overlay\", \"pool\": \"" + pool_name
+
92 ASSERT_EQ(0, s_cluster
.mon_command(
93 "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name
+
94 "\", \"tierpool\": \"" + cache_pool_name
+ "\"}",
96 ASSERT_EQ(0, s_cluster
.mon_command(
97 "{\"prefix\": \"osd pool delete\", \"pool\": \"" + cache_pool_name
+
98 "\", \"pool2\": \"" + cache_pool_name
+ "\", \"yes_i_really_really_mean_it\": true}",
100 cache_pool_name
= "";
102 ASSERT_EQ(0, destroy_one_pool_pp(pool_name
, s_cluster
));
105 void RadosTestParamPPNS::SetUp()
107 if (!is_crimson_cluster() && strcmp(GetParam(), "cache") == 0 &&
108 cache_pool_name
.empty()) {
109 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
110 cache_pool_name
= get_temp_pool_name();
112 ASSERT_EQ(0, cluster
.mon_command(
113 "{\"prefix\": \"osd pool create\", \"pool\": \"" + cache_pool_name
+
114 "\", \"pg_num\": 4}",
116 ASSERT_EQ(0, cluster
.mon_command(
117 "{\"prefix\": \"osd tier add\", \"pool\": \"" + pool_name
+
118 "\", \"tierpool\": \"" + cache_pool_name
+
119 "\", \"force_nonempty\": \"--force-nonempty\" }",
121 ASSERT_EQ(0, cluster
.mon_command(
122 "{\"prefix\": \"osd tier set-overlay\", \"pool\": \"" + pool_name
+
123 "\", \"overlaypool\": \"" + cache_pool_name
+ "\"}",
125 ASSERT_EQ(0, cluster
.mon_command(
126 "{\"prefix\": \"osd tier cache-mode\", \"pool\": \"" + cache_pool_name
+
127 "\", \"mode\": \"writeback\"}",
129 cluster
.wait_for_latest_osdmap();
132 ASSERT_EQ(0, cluster
.ioctx_create(pool_name
.c_str(), ioctx
));
134 ASSERT_EQ(0, ioctx
.pool_requires_alignment2(&req
));
138 void RadosTestParamPPNS::TearDown()
141 cleanup_all_objects(ioctx
);
145 void RadosTestParamPPNS::cleanup_all_objects(librados::IoCtx ioctx
)
147 // remove all objects to avoid polluting other tests
148 ioctx
.snap_set_read(librados::SNAP_HEAD
);
149 ioctx
.set_namespace(all_nspaces
);
150 for (NObjectIterator it
= ioctx
.nobjects_begin();
151 it
!= ioctx
.nobjects_end(); ++it
) {
152 ioctx
.locator_set_key(it
->get_locator());
153 ioctx
.set_namespace(it
->get_nspace());
154 ASSERT_EQ(0, ioctx
.remove(it
->get_oid()));
158 std::string
RadosTestECPPNS::pool_name
;
159 Rados
RadosTestECPPNS::s_cluster
;
161 void RadosTestECPPNS::SetUpTestCase()
163 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
164 pool_name
= get_temp_pool_name(pool_prefix
);
165 ASSERT_EQ("", create_one_ec_pool_pp(pool_name
, s_cluster
));
168 void RadosTestECPPNS::TearDownTestCase()
170 ASSERT_EQ(0, destroy_one_ec_pool_pp(pool_name
, s_cluster
));
173 void RadosTestECPPNS::SetUp()
175 ASSERT_EQ(0, cluster
.ioctx_create(pool_name
.c_str(), ioctx
));
177 ASSERT_EQ(0, ioctx
.pool_requires_alignment2(&req
));
179 ASSERT_EQ(0, ioctx
.pool_required_alignment2(&alignment
));
180 ASSERT_NE(0U, alignment
);
183 void RadosTestECPPNS::TearDown()
186 cleanup_all_objects(ioctx
);
190 std::string
RadosTestPP::pool_name
;
191 Rados
RadosTestPP::s_cluster
;
193 void RadosTestPP::SetUpTestCase()
197 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
198 pool_name
= get_temp_pool_name(pool_prefix
);
199 ASSERT_EQ("", create_one_pool_pp(pool_name
, s_cluster
));
202 void RadosTestPP::TearDownTestCase()
204 ASSERT_EQ(0, destroy_one_pool_pp(pool_name
, s_cluster
));
207 void RadosTestPP::SetUp()
209 ASSERT_EQ(0, cluster
.ioctx_create(pool_name
.c_str(), ioctx
));
210 nspace
= get_temp_pool_name();
211 ioctx
.set_namespace(nspace
);
213 ASSERT_EQ(0, ioctx
.pool_requires_alignment2(&req
));
217 void RadosTestPP::TearDown()
220 cleanup_default_namespace(ioctx
);
221 cleanup_namespace(ioctx
, nspace
);
226 void RadosTestPP::cleanup_default_namespace(librados::IoCtx ioctx
)
228 // remove all objects from the default namespace to avoid polluting
230 cleanup_namespace(ioctx
, "");
233 void RadosTestPP::cleanup_namespace(librados::IoCtx ioctx
, std::string ns
)
235 ioctx
.snap_set_read(librados::SNAP_HEAD
);
236 ioctx
.set_namespace(ns
);
240 for (NObjectIterator it
= ioctx
.nobjects_begin();
241 it
!= ioctx
.nobjects_end(); ++it
) {
242 ioctx
.locator_set_key(it
->get_locator());
243 ObjectWriteOperation op
;
245 librados::AioCompletion
*completion
= s_cluster
.aio_create_completion();
246 auto sg
= make_scope_guard([&] { completion
->release(); });
247 ASSERT_EQ(0, ioctx
.aio_operate(it
->get_oid(), completion
, &op
,
248 librados::OPERATION_IGNORE_CACHE
));
249 completion
->wait_for_complete();
250 if (completion
->get_return_value() == -ENOENT
) {
252 std::cout
<< " got ENOENT removing " << it
->get_oid()
253 << " in ns " << ns
<< std::endl
;
255 ASSERT_EQ(0, completion
->get_return_value());
261 std::cout
<< " got ENOENT on " << got_enoent
262 << " objects, waiting a bit for snap"
263 << " trimming before retrying " << tries
<< " more times..."
268 std::cout
<< "failed to clean up; probably need to scrub purged_snaps."
273 std::string
RadosTestParamPP::pool_name
;
274 std::string
RadosTestParamPP::cache_pool_name
;
275 Rados
RadosTestParamPP::s_cluster
;
277 void RadosTestParamPP::SetUpTestCase()
279 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
280 pool_name
= get_temp_pool_name(pool_prefix
);
281 ASSERT_EQ("", create_one_pool_pp(pool_name
, s_cluster
));
284 void RadosTestParamPP::TearDownTestCase()
286 if (cache_pool_name
.length()) {
289 ASSERT_EQ(0, s_cluster
.mon_command(
290 "{\"prefix\": \"osd tier remove-overlay\", \"pool\": \"" + pool_name
+
293 ASSERT_EQ(0, s_cluster
.mon_command(
294 "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name
+
295 "\", \"tierpool\": \"" + cache_pool_name
+ "\"}",
297 ASSERT_EQ(0, s_cluster
.mon_command(
298 "{\"prefix\": \"osd pool delete\", \"pool\": \"" + cache_pool_name
+
299 "\", \"pool2\": \"" + cache_pool_name
+ "\", \"yes_i_really_really_mean_it\": true}",
301 cache_pool_name
= "";
303 ASSERT_EQ(0, destroy_one_pool_pp(pool_name
, s_cluster
));
306 void RadosTestParamPP::SetUp()
308 if (!is_crimson_cluster() && strcmp(GetParam(), "cache") == 0 &&
309 cache_pool_name
.empty()) {
310 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
311 cache_pool_name
= get_temp_pool_name();
313 ASSERT_EQ(0, cluster
.mon_command(
314 "{\"prefix\": \"osd pool create\", \"pool\": \"" + cache_pool_name
+
315 "\", \"pg_num\": 4}",
317 ASSERT_EQ(0, cluster
.mon_command(
318 "{\"prefix\": \"osd tier add\", \"pool\": \"" + pool_name
+
319 "\", \"tierpool\": \"" + cache_pool_name
+
320 "\", \"force_nonempty\": \"--force-nonempty\" }",
322 ASSERT_EQ(0, cluster
.mon_command(
323 "{\"prefix\": \"osd tier set-overlay\", \"pool\": \"" + pool_name
+
324 "\", \"overlaypool\": \"" + cache_pool_name
+ "\"}",
326 ASSERT_EQ(0, cluster
.mon_command(
327 "{\"prefix\": \"osd tier cache-mode\", \"pool\": \"" + cache_pool_name
+
328 "\", \"mode\": \"writeback\"}",
330 cluster
.wait_for_latest_osdmap();
333 ASSERT_EQ(0, cluster
.ioctx_create(pool_name
.c_str(), ioctx
));
334 nspace
= get_temp_pool_name();
335 ioctx
.set_namespace(nspace
);
337 ASSERT_EQ(0, ioctx
.pool_requires_alignment2(&req
));
341 void RadosTestParamPP::TearDown()
344 cleanup_default_namespace(ioctx
);
345 cleanup_namespace(ioctx
, nspace
);
350 void RadosTestParamPP::cleanup_default_namespace(librados::IoCtx ioctx
)
352 // remove all objects from the default namespace to avoid polluting
354 cleanup_namespace(ioctx
, "");
357 void RadosTestParamPP::cleanup_namespace(librados::IoCtx ioctx
, std::string ns
)
359 ioctx
.snap_set_read(librados::SNAP_HEAD
);
360 ioctx
.set_namespace(ns
);
361 for (NObjectIterator it
= ioctx
.nobjects_begin();
362 it
!= ioctx
.nobjects_end(); ++it
) {
363 ioctx
.locator_set_key(it
->get_locator());
364 ASSERT_EQ(0, ioctx
.remove(it
->get_oid()));
368 std::string
RadosTestECPP::pool_name
;
369 Rados
RadosTestECPP::s_cluster
;
371 void RadosTestECPP::SetUpTestCase()
374 auto pool_prefix
= fmt::format("{}_", ::testing::UnitTest::GetInstance()->current_test_case()->name());
375 pool_name
= get_temp_pool_name(pool_prefix
);
376 ASSERT_EQ("", create_one_ec_pool_pp(pool_name
, s_cluster
));
379 void RadosTestECPP::TearDownTestCase()
382 ASSERT_EQ(0, destroy_one_ec_pool_pp(pool_name
, s_cluster
));
385 void RadosTestECPP::SetUp()
388 ASSERT_EQ(0, cluster
.ioctx_create(pool_name
.c_str(), ioctx
));
389 nspace
= get_temp_pool_name();
390 ioctx
.set_namespace(nspace
);
392 ASSERT_EQ(0, ioctx
.pool_requires_alignment2(&req
));
394 ASSERT_EQ(0, ioctx
.pool_required_alignment2(&alignment
));
395 ASSERT_NE(0U, alignment
);
398 void RadosTestECPP::TearDown()
402 cleanup_default_namespace(ioctx
);
403 cleanup_namespace(ioctx
, nspace
);