]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/test/librbd/object_map/test_mock_UpdateRequest.cc
update sources to 12.2.2
[ceph.git] / ceph / src / test / librbd / object_map / test_mock_UpdateRequest.cc
index 7f47be28176ef5a401b11ed39059453f63e86351..453e49cd6367e8bba7b3caa93dda2fa68e65fb0a 100644 (file)
@@ -18,12 +18,22 @@ namespace object_map {
 
 using ::testing::_;
 using ::testing::DoDefault;
+using ::testing::InSequence;
 using ::testing::Return;
 using ::testing::StrEq;
 
 class TestMockObjectMapUpdateRequest : public TestMockFixture {
 public:
-  void expect_update(librbd::ImageCtx *ictx, uint64_t snap_id, int r) {
+  void expect_update(librbd::ImageCtx *ictx, uint64_t snap_id,
+                     uint64_t start_object_no, uint64_t end_object_no,
+                     uint8_t new_state,
+                     const boost::optional<uint8_t>& current_state, int r) {
+    bufferlist bl;
+    ::encode(start_object_no, bl);
+    ::encode(end_object_no, bl);
+    ::encode(new_state, bl);
+    ::encode(current_state, bl);
+
     std::string oid(ObjectMap<>::object_map_name(ictx->id, snap_id));
     if (snap_id == CEPH_NOSNAP) {
       EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
@@ -33,11 +43,13 @@ public:
 
     if (r < 0) {
       EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
-                  exec(oid, _, StrEq("rbd"), StrEq("object_map_update"), _, _, _))
+                  exec(oid, _, StrEq("rbd"), StrEq("object_map_update"),
+                       ContentsEqual(bl), _, _))
                     .WillOnce(Return(r));
     } else {
       EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
-                  exec(oid, _, StrEq("rbd"), StrEq("object_map_update"), _, _, _))
+                  exec(oid, _, StrEq("rbd"), StrEq("object_map_update"),
+                       ContentsEqual(bl), _, _))
                     .WillOnce(DoDefault());
     }
   }
@@ -92,7 +104,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateHeadOnDisk) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
   ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
 
-  expect_update(ictx, CEPH_NOSNAP, 0);
+  expect_update(ictx, CEPH_NOSNAP, 0, 1, OBJECT_NONEXISTENT, OBJECT_EXISTS, 0);
 
   ceph::BitVector<2> object_map;
   object_map.resize(1);
@@ -122,7 +134,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateSnapOnDisk) {
                                "snap1"));
 
   uint64_t snap_id = ictx->snap_id;
-  expect_update(ictx, snap_id, 0);
+  expect_update(ictx, snap_id, 0, 1, OBJECT_NONEXISTENT, OBJECT_EXISTS, 0);
 
   ceph::BitVector<2> object_map;
   object_map.resize(1);
@@ -148,7 +160,8 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateOnDiskError) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
   ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
 
-  expect_update(ictx, CEPH_NOSNAP, -EINVAL);
+  expect_update(ictx, CEPH_NOSNAP, 0, 1, OBJECT_NONEXISTENT, OBJECT_EXISTS,
+                -EINVAL);
   expect_invalidate(ictx);
 
   ceph::BitVector<2> object_map;
@@ -178,7 +191,8 @@ TEST_F(TestMockObjectMapUpdateRequest, RebuildSnapOnDisk) {
   ASSERT_EQ(CEPH_NOSNAP, ictx->snap_id);
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
-  expect_update(ictx, snap_id, 0);
+  expect_update(ictx, snap_id, 0, 1, OBJECT_EXISTS_CLEAN,
+                boost::optional<uint8_t>(), 0);
   expect_unlock_exclusive_lock(*ictx);
 
   ceph::BitVector<2> object_map;
@@ -199,5 +213,40 @@ TEST_F(TestMockObjectMapUpdateRequest, RebuildSnapOnDisk) {
   ASSERT_NE(OBJECT_EXISTS_CLEAN, object_map[0]);
 }
 
+TEST_F(TestMockObjectMapUpdateRequest, BatchUpdate) {
+  REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  librbd::NoOpProgressContext no_progress;
+  ASSERT_EQ(0, ictx->operations->resize(712312 * ictx->get_object_size(), false,
+                                        no_progress));
+  ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
+
+  InSequence seq;
+  expect_update(ictx, CEPH_NOSNAP, 0, 262144, OBJECT_NONEXISTENT, OBJECT_EXISTS,
+                0);
+  expect_update(ictx, CEPH_NOSNAP, 262144, 524288, OBJECT_NONEXISTENT,
+                OBJECT_EXISTS, 0);
+  expect_update(ictx, CEPH_NOSNAP, 524288, 712312, OBJECT_NONEXISTENT,
+                OBJECT_EXISTS, 0);
+  expect_unlock_exclusive_lock(*ictx);
+
+  ceph::BitVector<2> object_map;
+  object_map.resize(712312);
+
+  C_SaferCond cond_ctx;
+  AsyncRequest<> *req = new UpdateRequest<>(
+    *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
+    OBJECT_EXISTS, {}, &cond_ctx);
+  {
+    RWLock::RLocker snap_locker(ictx->snap_lock);
+    RWLock::WLocker object_map_locker(ictx->object_map_lock);
+    req->send();
+  }
+  ASSERT_EQ(0, cond_ctx.wait());
+}
+
 } // namespace object_map
 } // namespace librbd