C_SaferCond cond_ctx;
AsyncRequest<> *req = new UpdateRequest<>(
*ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
- OBJECT_EXISTS, {}, &cond_ctx);
+ OBJECT_EXISTS, {}, false, &cond_ctx);
{
RWLock::RLocker snap_locker(ictx->snap_lock);
RWLock::WLocker object_map_locker(ictx->object_map_lock);
C_SaferCond cond_ctx;
AsyncRequest<> *req = new UpdateRequest<>(
*ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
- OBJECT_EXISTS, {}, &cond_ctx);
+ OBJECT_EXISTS, {}, false, &cond_ctx);
{
RWLock::RLocker snap_locker(ictx->snap_lock);
RWLock::WLocker object_map_locker(ictx->object_map_lock);
C_SaferCond cond_ctx;
AsyncRequest<> *req = new UpdateRequest<>(
*ictx, &object_map, snap_id, 0, object_map.size(), OBJECT_NONEXISTENT,
- OBJECT_EXISTS, {}, &cond_ctx);
+ OBJECT_EXISTS, {}, false, &cond_ctx);
{
RWLock::RLocker snap_locker(ictx->snap_lock);
RWLock::WLocker object_map_locker(ictx->object_map_lock);
C_SaferCond cond_ctx;
AsyncRequest<> *req = new UpdateRequest<>(
*ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
- OBJECT_EXISTS, {}, &cond_ctx);
+ OBJECT_EXISTS, {}, false, &cond_ctx);
{
RWLock::RLocker snap_locker(ictx->snap_lock);
RWLock::WLocker object_map_locker(ictx->object_map_lock);
C_SaferCond cond_ctx;
AsyncRequest<> *req = new UpdateRequest<>(
*ictx, &object_map, snap_id, 0, object_map.size(), OBJECT_EXISTS_CLEAN,
- boost::optional<uint8_t>(), {}, &cond_ctx);
+ boost::optional<uint8_t>(), {}, false, &cond_ctx);
{
RWLock::RLocker snap_locker(ictx->snap_lock);
RWLock::WLocker object_map_locker(ictx->object_map_lock);
C_SaferCond cond_ctx;
AsyncRequest<> *req = new UpdateRequest<>(
*ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
- OBJECT_EXISTS, {}, &cond_ctx);
+ OBJECT_EXISTS, {}, false, &cond_ctx);
{
RWLock::RLocker snap_locker(ictx->snap_lock);
RWLock::WLocker object_map_locker(ictx->object_map_lock);
ASSERT_EQ(0, cond_ctx.wait());
}
+TEST_F(TestMockObjectMapUpdateRequest, IgnoreMissingObjectMap) {
+ REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP);
+
+ librbd::ImageCtx *ictx;
+ ASSERT_EQ(0, open_image(m_image_name, &ictx));
+ ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
+
+ expect_update(ictx, CEPH_NOSNAP, 0, 1, OBJECT_NONEXISTENT, OBJECT_EXISTS,
+ -ENOENT);
+
+ ceph::BitVector<2> object_map;
+ object_map.resize(1);
+
+ C_SaferCond cond_ctx;
+ AsyncRequest<> *req = new UpdateRequest<>(
+ *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
+ OBJECT_EXISTS, {}, true, &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());
+
+ expect_unlock_exclusive_lock(*ictx);
+}
+
} // namespace object_map
} // namespace librbd