@@ -465,6 +465,53 @@ TEST_F(LibRadosSnapshotsSelfManagedPP, OrderSnap) {
465465 comp4->release ();
466466}
467467
468+ TEST_F (LibRadosSnapshotsSelfManagedPP, WriteRollback) {
469+ // https://tracker.ceph.com/issues/59114
470+ GTEST_SKIP ();
471+ uint64_t snapid = 5 ;
472+
473+ // buf1
474+ char buf[bufsize];
475+ memset (buf, 0xcc , sizeof (buf));
476+ bufferlist bl;
477+ bl.append (buf, sizeof (buf));
478+
479+ // buf2
480+ char buf2[sizeof (buf)];
481+ memset (buf2, 0xdd , sizeof (buf2));
482+ bufferlist bl2;
483+ bl2.append (buf2, sizeof (buf2));
484+
485+ // First write
486+ ObjectWriteOperation op_write1;
487+ op_write1.write (0 , bl);
488+ // Operate
489+ librados::AioCompletion *comp_write = cluster.aio_create_completion ();
490+ ASSERT_EQ (0 , ioctx.aio_operate (" foo" , comp_write, &op_write1, 0 ));
491+ ASSERT_EQ (0 , comp_write->wait_for_complete ());
492+ ASSERT_EQ (0 , comp_write->get_return_value ());
493+ comp_write->release ();
494+
495+ // Take Snapshot
496+ ASSERT_EQ (0 , ioctx.selfmanaged_snap_create (&snapid));
497+
498+ // Rollback + Second write in the same op
499+ ObjectWriteOperation op_write2_snap_rollback;
500+ op_write2_snap_rollback.write (0 , bl2);
501+ op_write2_snap_rollback.selfmanaged_snap_rollback (snapid);
502+ // Operate
503+ librados::AioCompletion *comp_write2 = cluster.aio_create_completion ();
504+ ASSERT_EQ (0 , ioctx.aio_operate (" foo" , comp_write2, &op_write2_snap_rollback, 0 ));
505+ ASSERT_EQ (0 , comp_write2->wait_for_complete ());
506+ ASSERT_EQ (0 , comp_write2->get_return_value ());
507+ comp_write2->release ();
508+
509+ // Resolved should be first write
510+ bufferlist bl3;
511+ EXPECT_EQ ((int )sizeof (buf), ioctx.read (" foo" , bl3, sizeof (buf), 0 ));
512+ EXPECT_EQ (0 , memcmp (buf, bl3.c_str (), sizeof (buf)));
513+ }
514+
468515TEST_F (LibRadosSnapshotsSelfManagedPP, ReusePurgedSnap) {
469516 SKIP_IF_CRIMSON ();
470517 std::vector<uint64_t > my_snaps;
0 commit comments