From 370bb96773575c4b2b9cd1b341c52673d117cdc6 Mon Sep 17 00:00:00 2001 From: Matt Benjamin Date: Wed, 10 Dec 2014 12:31:12 -0500 Subject: [PATCH] Add unittests for safe sharing and make_shareable() Checks the following assertions: 1. a bufferlist shared with buffer::list::share yields shared raw memory 2. a bufferlist copied with buffer::list::list(const list&) yields shared raw memory 3. an unshareable bufferlist (bufferlist with unshareable segments) copied with buffer::list::list(const list&) yields unshared raw memory 4. an unshareable bufferlist claimed with CLAIM_ALLOW_NONSHAREABLE yields shared raw memory Signed-off-by: Matt Benjamin --- src/test/bufferlist.cc | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/bufferlist.cc b/src/test/bufferlist.cc index 73c03c5bd531..1e11e6f1d28d 100644 --- a/src/test/bufferlist.cc +++ b/src/test/bufferlist.cc @@ -2261,6 +2261,48 @@ TEST(BufferList, TestDirectAppend) { ASSERT_EQ(memcmp(bl.c_str(), correct, curpos), 0); } +TEST(BufferList, TestCloneNonShareable) { + bufferlist bl; + std::string str = "sharetest"; + bl.append(str.c_str(), 9); + bufferlist bl_share; + bl_share.share(bl); + bufferlist bl_noshare; + buffer::ptr unraw = buffer::create_unshareable(10); + unraw.copy_in(0, 9, str.c_str()); + bl_noshare.append(unraw); + bufferlist bl_copied_share = bl_share; + bufferlist bl_copied_noshare = bl_noshare; + + // assert shared bufferlist has same buffers + bufferlist::iterator iter_bl = bl.begin(); + bufferlist::iterator iter_bl_share = bl_share.begin(); + // ok, this considers ptr::off, but it's still a true assertion (and below) + ASSERT_TRUE(iter_bl.get_current_ptr().c_str() == + iter_bl_share.get_current_ptr().c_str()); + + // assert copy of shareable bufferlist has same buffers + iter_bl = bl.begin(); + bufferlist::iterator iter_bl_copied_share = bl_copied_share.begin(); + ASSERT_TRUE(iter_bl.get_current_ptr().c_str() == + iter_bl_copied_share.get_current_ptr().c_str()); + + // assert copy of non-shareable bufferlist has different buffers + bufferlist::iterator iter_bl_copied_noshare = bl_copied_noshare.begin(); + ASSERT_FALSE(iter_bl.get_current_ptr().c_str() == + iter_bl_copied_noshare.get_current_ptr().c_str()); + + // assert that claim with CLAIM_ALLOW_NONSHAREABLE overrides safe-sharing + bufferlist bl_claim_noshare_override; + void* addr = bl_noshare.begin().get_current_ptr().c_str(); + bl_claim_noshare_override.claim(bl_noshare, + buffer::list::CLAIM_ALLOW_NONSHAREABLE); + bufferlist::iterator iter_bl_noshare_override = + bl_claim_noshare_override.begin(); + ASSERT_TRUE(addr /* the original first segment of bl_noshare() */ == + iter_bl_noshare_override.get_current_ptr().c_str()); +} + TEST(BufferList, TestCopyAll) { const static size_t BIG_SZ = 10737414; ceph::shared_ptr big( -- 2.47.3