From 7ccf41298841ff6094a5f8344074fd7af49aa2dc Mon Sep 17 00:00:00 2001 From: David Zafman Date: Fri, 28 Mar 2014 14:05:00 -0700 Subject: [PATCH] test: Add EC testing to ceph_test_rados_api_list Fixes: #7437 Signed-off-by: David Zafman --- src/test/librados/list.cc | 292 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) diff --git a/src/test/librados/list.cc b/src/test/librados/list.cc index c530b60b6e064..2e400d5724961 100644 --- a/src/test/librados/list.cc +++ b/src/test/librados/list.cc @@ -14,6 +14,8 @@ using namespace librados; typedef RadosTest LibRadosList; typedef RadosTestPP LibRadosListPP; +typedef RadosTestEC LibRadosListEC; +typedef RadosTestECPP LibRadosListECPP; TEST_F(LibRadosList, ListObjects) { char buf[128]; @@ -339,3 +341,293 @@ TEST_F(LibRadosListPP, ListObjectsStartPP) { ++p; } } + +TEST_F(LibRadosListEC, ListObjects) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo", buf, sizeof(buf), 0)); + rados_list_ctx_t ctx; + ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); + const char *entry; + bool foundit = false; + while (rados_objects_list_next(ctx, &entry, NULL) != -ENOENT) { + foundit = true; + ASSERT_EQ(std::string(entry), "foo"); + } + ASSERT_TRUE(foundit); + rados_objects_list_close(ctx); +} + +TEST_F(LibRadosListECPP, ListObjectsPP) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0)); + ObjectIterator iter(ioctx.objects_begin()); + bool foundit = false; + while (iter != ioctx.objects_end()) { + foundit = true; + ASSERT_EQ((*iter).first, "foo"); + ++iter; + } + ASSERT_TRUE(foundit); +} + +TEST_F(LibRadosListECPP, ListObjectsTwicePP) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0)); + ObjectIterator iter(ioctx.objects_begin()); + bool foundit = false; + while (iter != ioctx.objects_end()) { + foundit = true; + ASSERT_EQ((*iter).first, "foo"); + ++iter; + } + ASSERT_TRUE(foundit); + ++iter; + ASSERT_TRUE(iter == ioctx.objects_end()); + foundit = false; + iter.seek(0); + while (iter != ioctx.objects_end()) { + foundit = true; + ASSERT_EQ((*iter).first, "foo"); + ++iter; + } + ASSERT_TRUE(foundit); +} + +TEST_F(LibRadosListECPP, ListObjectsCopyIterPP) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0)); + + // make sure this is still valid after the original iterators are gone + ObjectIterator iter3; + { + ObjectIterator iter(ioctx.objects_begin()); + ObjectIterator iter2(iter); + iter3 = iter2; + ASSERT_EQ((*iter).first, "foo"); + ++iter; + ASSERT_TRUE(iter == ioctx.objects_end()); + ++iter; + ASSERT_TRUE(iter == ioctx.objects_end()); + + ASSERT_EQ(iter2->first, "foo"); + ASSERT_EQ(iter3->first, "foo"); + ++iter2; + ASSERT_TRUE(iter2 == ioctx.objects_end()); + } + + ASSERT_EQ(iter3->first, "foo"); + iter3 = iter3; + ASSERT_EQ(iter3->first, "foo"); + ++iter3; + ASSERT_TRUE(iter3 == ioctx.objects_end()); +} + +TEST_F(LibRadosListECPP, ListObjectsEndIter) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0)); + + ObjectIterator iter(ioctx.objects_begin()); + ObjectIterator iter_end(ioctx.objects_end()); + ObjectIterator iter_end2 = ioctx.objects_end(); + ASSERT_TRUE(iter_end == iter_end2); + ASSERT_TRUE(iter_end == ioctx.objects_end()); + ASSERT_TRUE(iter_end2 == ioctx.objects_end()); + + ASSERT_EQ(iter->first, "foo"); + ++iter; + ASSERT_TRUE(iter == ioctx.objects_end()); + ASSERT_TRUE(iter == iter_end); + ASSERT_TRUE(iter == iter_end2); + ObjectIterator iter2 = iter; + ASSERT_TRUE(iter2 == ioctx.objects_end()); + ASSERT_TRUE(iter2 == iter_end); + ASSERT_TRUE(iter2 == iter_end2); +} + +TEST_F(LibRadosListEC, ListObjectsNS) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + // Create :foo1, :foo2, :foo3, n1:foo1, ns1:foo4, ns1:foo5, ns2:foo6, n2:foo7 + rados_ioctx_set_namespace(ioctx, ""); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo1", buf, sizeof(buf), 0)); + rados_ioctx_set_namespace(ioctx, "ns1"); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo1", buf, sizeof(buf), 0)); + rados_ioctx_set_namespace(ioctx, ""); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo2", buf, sizeof(buf), 0)); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo3", buf, sizeof(buf), 0)); + rados_ioctx_set_namespace(ioctx, "ns1"); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo4", buf, sizeof(buf), 0)); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo5", buf, sizeof(buf), 0)); + rados_ioctx_set_namespace(ioctx, "ns2"); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo6", buf, sizeof(buf), 0)); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, "foo7", buf, sizeof(buf), 0)); + + std::set def, ns1, ns2; + def.insert(std::string("foo1")); + def.insert(std::string("foo2")); + def.insert(std::string("foo3")); + ns1.insert(std::string("foo1")); + ns1.insert(std::string("foo4")); + ns1.insert(std::string("foo5")); + ns2.insert(std::string("foo6")); + ns2.insert(std::string("foo7")); + + rados_list_ctx_t ctx; + // Check default namespace "" + rados_ioctx_set_namespace(ioctx, ""); + ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); + check_list(def, ctx); + rados_objects_list_close(ctx); + + // Check default namespace "ns1" + rados_ioctx_set_namespace(ioctx, "ns1"); + ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); + check_list(ns1, ctx); + rados_objects_list_close(ctx); + + // Check default namespace "ns2" + rados_ioctx_set_namespace(ioctx, "ns2"); + ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); + check_list(ns2, ctx); + rados_objects_list_close(ctx); +} + +TEST_F(LibRadosListECPP, ListObjectsPPNS) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + // Create :foo1, :foo2, :foo3, n1:foo1, ns1:foo4, ns1:foo5, ns2:foo6, n2:foo7 + ioctx.set_namespace(""); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo1", bl1, sizeof(buf), 0)); + ioctx.set_namespace("ns1"); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo1", bl1, sizeof(buf), 0)); + ioctx.set_namespace(""); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo2", bl1, sizeof(buf), 0)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo3", bl1, sizeof(buf), 0)); + ioctx.set_namespace("ns1"); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo4", bl1, sizeof(buf), 0)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo5", bl1, sizeof(buf), 0)); + ioctx.set_namespace("ns2"); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo6", bl1, sizeof(buf), 0)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo7", bl1, sizeof(buf), 0)); + + std::set def, ns1, ns2; + def.insert(std::string("foo1")); + def.insert(std::string("foo2")); + def.insert(std::string("foo3")); + ns1.insert(std::string("foo1")); + ns1.insert(std::string("foo4")); + ns1.insert(std::string("foo5")); + ns2.insert(std::string("foo6")); + ns2.insert(std::string("foo7")); + + ioctx.set_namespace(""); + check_listpp(def, ioctx); + + ioctx.set_namespace("ns1"); + check_listpp(ns1, ioctx); + + ioctx.set_namespace("ns2"); + check_listpp(ns2, ioctx); +} + +TEST_F(LibRadosListECPP, ListObjectsManyPP) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl; + bl.append(buf, sizeof(buf)); + + for (int i=0; i<256; ++i) { + ASSERT_EQ((int)sizeof(buf), ioctx.write(stringify(i), bl, bl.length(), 0)); + } + + librados::ObjectIterator it = ioctx.objects_begin(); + std::set saw_obj; + std::set saw_pg; + for (; it != ioctx.objects_end(); ++it) { + std::cout << it->first + << " " << it.get_pg_hash_position() << std::endl; + saw_obj.insert(it->first); + saw_pg.insert(it.get_pg_hash_position()); + } + std::cout << "saw " << saw_pg.size() << " pgs " << std::endl; + + // make sure they are 0..n + for (unsigned i = 0; i < saw_pg.size(); ++i) + ASSERT_TRUE(saw_pg.count(i)); +} + +TEST_F(LibRadosListEC, ListObjectsStart) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + + for (int i=0; i<16; ++i) { + string n = stringify(i); + ASSERT_EQ((int)sizeof(buf), rados_write(ioctx, n.c_str(), buf, sizeof(buf), 0)); + } + + rados_list_ctx_t ctx; + ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); + std::map > pg_to_obj; + const char *entry; + while (rados_objects_list_next(ctx, &entry, NULL) == 0) { + uint32_t pos = rados_objects_list_get_pg_hash_position(ctx); + std::cout << entry << " " << pos << std::endl; + pg_to_obj[pos].insert(entry); + } + rados_objects_list_close(ctx); + + std::map >::reverse_iterator p = + pg_to_obj.rbegin(); + ASSERT_EQ(0, rados_objects_list_open(ioctx, &ctx)); + while (p != pg_to_obj.rend()) { + ASSERT_EQ((uint32_t)p->first, rados_objects_list_seek(ctx, p->first)); + ASSERT_EQ(0, rados_objects_list_next(ctx, &entry, NULL)); + std::cout << "have " << entry << " expect one of " << p->second << std::endl; + ASSERT_TRUE(p->second.count(entry)); + ++p; + } + rados_objects_list_close(ctx); +} + +TEST_F(LibRadosListECPP, ListObjectsStartPP) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl; + bl.append(buf, sizeof(buf)); + + for (int i=0; i<16; ++i) { + ASSERT_EQ((int)sizeof(buf), ioctx.write(stringify(i), bl, bl.length(), 0)); + } + + librados::ObjectIterator it = ioctx.objects_begin(); + std::map > pg_to_obj; + for (; it != ioctx.objects_end(); ++it) { + std::cout << it->first << " " << it.get_pg_hash_position() << std::endl; + pg_to_obj[it.get_pg_hash_position()].insert(it->first); + } + + std::map >::reverse_iterator p = + pg_to_obj.rbegin(); + it = ioctx.objects_begin(p->first); + while (p != pg_to_obj.rend()) { + ASSERT_EQ((uint32_t)p->first, it.seek(p->first)); + std::cout << "have " << it->first << " expect one of " << p->second << std::endl; + ASSERT_TRUE(p->second.count(it->first)); + ++p; + } +} -- 2.39.5