comp4->release();
}
+TEST_F(LibRadosSnapshotsSelfManagedPP, WriteRollback) {
+ // https://tracker.ceph.com/issues/59114
+ GTEST_SKIP();
+ uint64_t snapid = 5;
+
+ // buf1
+ char buf[bufsize];
+ memset(buf, 0xcc, sizeof(buf));
+ bufferlist bl;
+ bl.append(buf, sizeof(buf));
+
+ // buf2
+ char buf2[sizeof(buf)];
+ memset(buf2, 0xdd, sizeof(buf2));
+ bufferlist bl2;
+ bl2.append(buf2, sizeof(buf2));
+
+ // First write
+ ObjectWriteOperation op_write1;
+ op_write1.write(0, bl);
+ // Operate
+ librados::AioCompletion *comp_write = cluster.aio_create_completion();
+ ASSERT_EQ(0, ioctx.aio_operate("foo", comp_write, &op_write1, 0));
+ ASSERT_EQ(0, comp_write->wait_for_complete());
+ ASSERT_EQ(0, comp_write->get_return_value());
+ comp_write->release();
+
+ // Take Snapshot
+ ASSERT_EQ(0, ioctx.selfmanaged_snap_create(&snapid));
+
+ // Rollback + Second write in the same op
+ ObjectWriteOperation op_write2_snap_rollback;
+ op_write2_snap_rollback.write(0, bl2);
+ op_write2_snap_rollback.selfmanaged_snap_rollback(snapid);
+ // Operate
+ librados::AioCompletion *comp_write2 = cluster.aio_create_completion();
+ ASSERT_EQ(0, ioctx.aio_operate("foo", comp_write2, &op_write2_snap_rollback, 0));
+ ASSERT_EQ(0, comp_write2->wait_for_complete());
+ ASSERT_EQ(0, comp_write2->get_return_value());
+ comp_write2->release();
+
+ // Resolved should be first write
+ bufferlist bl3;
+ EXPECT_EQ((int)sizeof(buf), ioctx.read("foo", bl3, sizeof(buf), 0));
+ EXPECT_EQ(0, memcmp(buf, bl3.c_str(), sizeof(buf)));
+}
+
TEST_F(LibRadosSnapshotsSelfManagedPP, ReusePurgedSnap) {
- SKIP_IF_CRIMSON();
std::vector<uint64_t> my_snaps;
my_snaps.push_back(-2);
ASSERT_EQ(0, ioctx.selfmanaged_snap_create(&my_snaps.back()));