Skip to content

Commit

Permalink
test: add test case to verify idempotent op
Browse files Browse the repository at this point in the history
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
  • Loading branch information
myoungwon committed Jul 20, 2021
1 parent d2ff8a4 commit 67efb7a
Showing 1 changed file with 101 additions and 0 deletions.
101 changes: 101 additions & 0 deletions src/test/librados/tier_cxx.cc
Expand Up @@ -6179,6 +6179,107 @@ TEST_F(LibRadosTwoPoolsPP, ManifestEvictRollback) {
is_intended_refcount_state(ioctx, "foo", cache_ioctx, "chunk2", 1);
}

TEST_F(LibRadosTwoPoolsPP, ManifestIdempotentCount) {
// skip test if not yet octopus
if (_get_required_osd_release(cluster) < "pacific") {
cout << "cluster is not yet pacific, skipping test" << std::endl;
return;
}

// create object
{
bufferlist bl;
bl.append("there hiHI");
ObjectWriteOperation op;
op.write_full(bl);
ASSERT_EQ(0, cache_ioctx.operate("chunk1", &op));
}
{
bufferlist bl;
bl.append("there hiHI");
ObjectWriteOperation op;
op.write_full(bl);
ASSERT_EQ(0, cache_ioctx.operate("chunk4", &op));
}

// wait for maps to settle
cluster.wait_for_latest_osdmap();

{
hobject_t ref;
ref.oid.name = "boo";
auto op = new librados::ObjectWriteOperation();
cls_cas_chunk_get_ref(*op, ref, 3);
ASSERT_EQ(0, cache_ioctx.operate("chunk4", op));
}
{
hobject_t ref;
ref.oid.name = "boo";
auto op = new librados::ObjectWriteOperation();
cls_cas_chunk_get_ref(*op, ref, 3);
ASSERT_EQ(0, cache_ioctx.operate("chunk4", op));
}

{
bufferlist t;
cache_ioctx.getxattr("chunk4", CHUNK_REFCOUNT_ATTR, t);
chunk_refs_t refs;
try {
auto iter = t.cbegin();
decode(refs, iter);
} catch (buffer::error& err) {
ASSERT_TRUE(0);
}
ASSERT_EQ(3u, refs.count());
}
{
hobject_t ref;
ref.oid.name = "boo";
bufferlist bl;
auto op = new librados::ObjectWriteOperation();
cls_cas_chunk_create_or_get_ref(*op, ref, bl, false, 3);
ASSERT_EQ(0, cache_ioctx.operate("chunk4", op));
}
{
bufferlist t;
cache_ioctx.getxattr("chunk4", CHUNK_REFCOUNT_ATTR, t);
chunk_refs_t refs;
try {
auto iter = t.cbegin();
decode(refs, iter);
} catch (buffer::error& err) {
ASSERT_TRUE(0);
}
ASSERT_EQ(3u, refs.count());
}
{
hobject_t ref;
ref.oid.name = "boo";
auto op = new librados::ObjectWriteOperation();
cls_cas_chunk_put_ref(*op, ref, 2);
ASSERT_EQ(0, cache_ioctx.operate("chunk4", op));
}
{
hobject_t ref;
ref.oid.name = "boo";
auto op = new librados::ObjectWriteOperation();
cls_cas_chunk_put_ref(*op, ref, 2);
ASSERT_EQ(0, cache_ioctx.operate("chunk4", op));
}
{
bufferlist t;
cache_ioctx.getxattr("chunk4", CHUNK_REFCOUNT_ATTR, t);
chunk_refs_t refs;
try {
auto iter = t.cbegin();
decode(refs, iter);
} catch (buffer::error& err) {
ASSERT_TRUE(0);
}
ASSERT_EQ(2u, refs.count());
}
}

class LibRadosTwoPoolsECPP : public RadosTestECPP
{
public:
Expand Down

0 comments on commit 67efb7a

Please sign in to comment.