From: myoungwon oh Date: Thu, 28 May 2020 14:25:33 +0000 (-0400) Subject: cls/cas: replace set with mutiset to store duplicated hobject_t X-Git-Tag: v16.1.0~1738^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d2737fd41a146e8efe3162cdc39845226bd5a756;p=ceph.git cls/cas: replace set with mutiset to store duplicated hobject_t Signed-off-by: Myoungwon Oh --- diff --git a/src/cls/cas/cls_cas_internal.h b/src/cls/cas/cls_cas_internal.h index 7fa4b96286ec..1fdb94926659 100644 --- a/src/cls/cas/cls_cas_internal.h +++ b/src/cls/cas/cls_cas_internal.h @@ -104,7 +104,7 @@ WRITE_CLASS_ENCODER(chunk_refs_t) // these are internal and should generally not be used directly struct chunk_refs_by_object_t : public chunk_refs_t::refs_t { - std::set by_object; + std::multiset by_object; uint8_t get_type() const { return chunk_refs_t::TYPE_BY_OBJECT; @@ -116,9 +116,6 @@ struct chunk_refs_by_object_t : public chunk_refs_t::refs_t { return by_object.size(); } bool get(const hobject_t& o) override { - if (by_object.count(o)) { - return false; - } by_object.insert(o); return true; } diff --git a/src/test/librados/tier_cxx.cc b/src/test/librados/tier_cxx.cc index 585575a3710f..a7d969911f32 100644 --- a/src/test/librados/tier_cxx.cc +++ b/src/test/librados/tier_cxx.cc @@ -3737,7 +3737,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestSnapRefcount) { // check chunk's refcount { - bufferlist in, out; + bufferlist t; SHA1 sha1_gen; int size = strlen("hi"); unsigned char fingerprint[CEPH_CRYPTO_SHA1_DIGESTSIZE + 1]; @@ -3745,15 +3745,15 @@ TEST_F(LibRadosTwoPoolsPP, ManifestSnapRefcount) { sha1_gen.Update((const unsigned char *)"hi", size); sha1_gen.Final(fingerprint); buf_to_hex(fingerprint, CEPH_CRYPTO_SHA1_DIGESTSIZE, p_str); - cache_ioctx.exec(p_str, "cas", "chunk_read", in, out); - cls_chunk_refcount_read_ret read_ret; + cache_ioctx.getxattr(p_str, CHUNK_REFCOUNT_ATTR, t); + chunk_refs_t refs; try { - auto iter = out.cbegin(); - decode(read_ret, iter); + auto iter = t.cbegin(); + decode(refs, iter); } catch (buffer::error& err) { ASSERT_TRUE(0); } - ASSERT_EQ(1u, read_ret.refs.size()); + ASSERT_EQ(1u, refs.count()); } // remove snap @@ -3763,7 +3763,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestSnapRefcount) { // check chunk's refcount { - bufferlist in, out; + bufferlist t; SHA1 sha1_gen; int size = strlen("hi"); unsigned char fingerprint[CEPH_CRYPTO_SHA1_DIGESTSIZE + 1]; @@ -3771,15 +3771,15 @@ TEST_F(LibRadosTwoPoolsPP, ManifestSnapRefcount) { sha1_gen.Update((const unsigned char *)"hi", size); sha1_gen.Final(fingerprint); buf_to_hex(fingerprint, CEPH_CRYPTO_SHA1_DIGESTSIZE, p_str); - cache_ioctx.exec(p_str, "cas", "chunk_read", in, out); - cls_chunk_refcount_read_ret read_ret; + cache_ioctx.getxattr(p_str, CHUNK_REFCOUNT_ATTR, t); + chunk_refs_t refs; try { - auto iter = out.cbegin(); - decode(read_ret, iter); + auto iter = t.cbegin(); + decode(refs, iter); } catch (buffer::error& err) { ASSERT_TRUE(0); } - ASSERT_EQ(1u, read_ret.refs.size()); + ASSERT_EQ(1u, refs.count()); } } @@ -3952,7 +3952,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestFlushSnap) { // check chunk's refcount { - bufferlist in, out; + bufferlist t; SHA1 sha1_gen; int size = strlen("er"); unsigned char fingerprint[CEPH_CRYPTO_SHA1_DIGESTSIZE + 1]; @@ -3960,20 +3960,20 @@ TEST_F(LibRadosTwoPoolsPP, ManifestFlushSnap) { sha1_gen.Update((const unsigned char *)"er", size); sha1_gen.Final(fingerprint); buf_to_hex(fingerprint, CEPH_CRYPTO_SHA1_DIGESTSIZE, p_str); - cache_ioctx.exec(p_str, "cas", "chunk_read", in, out); - cls_chunk_refcount_read_ret read_ret; + cache_ioctx.getxattr(p_str, CHUNK_REFCOUNT_ATTR, t); + chunk_refs_t refs; try { - auto iter = out.cbegin(); - decode(read_ret, iter); + auto iter = t.cbegin(); + decode(refs, iter); } catch (buffer::error& err) { ASSERT_TRUE(0); } - ASSERT_EQ(1u, read_ret.refs.size()); + ASSERT_EQ(1u, refs.count()); } // check chunk's refcount { - bufferlist in, out; + bufferlist t; SHA1 sha1_gen; int size = strlen("bb"); unsigned char fingerprint[CEPH_CRYPTO_SHA1_DIGESTSIZE + 1]; @@ -3981,20 +3981,20 @@ TEST_F(LibRadosTwoPoolsPP, ManifestFlushSnap) { sha1_gen.Update((const unsigned char *)"bb", size); sha1_gen.Final(fingerprint); buf_to_hex(fingerprint, CEPH_CRYPTO_SHA1_DIGESTSIZE, p_str); - cache_ioctx.exec(p_str, "cas", "chunk_read", in, out); - cls_chunk_refcount_read_ret read_ret; + cache_ioctx.getxattr(p_str, CHUNK_REFCOUNT_ATTR, t); + chunk_refs_t refs; try { - auto iter = out.cbegin(); - decode(read_ret, iter); + auto iter = t.cbegin(); + decode(refs, iter); } catch (buffer::error& err) { ASSERT_TRUE(0); } - ASSERT_EQ(1u, read_ret.refs.size()); + ASSERT_EQ(1u, refs.count()); } // check chunk's refcount { - bufferlist in, out; + bufferlist t; SHA1 sha1_gen; int size = strlen("cc"); unsigned char fingerprint[CEPH_CRYPTO_SHA1_DIGESTSIZE + 1]; @@ -4002,15 +4002,15 @@ TEST_F(LibRadosTwoPoolsPP, ManifestFlushSnap) { sha1_gen.Update((const unsigned char *)"cc", size); sha1_gen.Final(fingerprint); buf_to_hex(fingerprint, CEPH_CRYPTO_SHA1_DIGESTSIZE, p_str); - cache_ioctx.exec(p_str, "cas", "chunk_read", in, out); - cls_chunk_refcount_read_ret read_ret; + cache_ioctx.getxattr(p_str, CHUNK_REFCOUNT_ATTR, t); + chunk_refs_t refs; try { - auto iter = out.cbegin(); - decode(read_ret, iter); + auto iter = t.cbegin(); + decode(refs, iter); } catch (buffer::error& err) { ASSERT_TRUE(0); } - ASSERT_EQ(1u, read_ret.refs.size()); + ASSERT_EQ(1u, refs.count()); } ioctx.snap_set_read(librados::SNAP_HEAD);