CephContext *cct = m_image_ctx.cct;
uint64_t num_objects;
+ uint64_t size;
{
RWLock::RLocker l(m_image_ctx.snap_lock);
- uint64_t size = get_image_size();
+ size = get_image_size();
num_objects = Striper::get_num_objects(m_image_ctx.layout, size);
}
// should have been canceled prior to releasing lock
assert(!m_image_ctx.image_watcher->is_lock_supported() ||
m_image_ctx.image_watcher->is_lock_owner());
- m_image_ctx.object_map.aio_resize(num_objects, OBJECT_NONEXISTENT,
+ m_image_ctx.object_map.aio_resize(size, OBJECT_NONEXISTENT,
create_callback_context());
}
ASSERT_PASSED(validate_object_map, image2);
}
+TEST_F(TestLibRBD, RebuildNewObjectMap)
+{
+ REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
+
+ rados_ioctx_t ioctx;
+ rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+ std::string name = get_temp_image_name();
+ uint64_t size = 1 << 20;
+ int order = 18;
+ uint64_t features = RBD_FEATURE_EXCLUSIVE_LOCK;
+ ASSERT_EQ(0, create_image_full(ioctx, name.c_str(), size, &order,
+ false, features));
+
+ rbd_image_t image;
+ ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+ ASSERT_EQ(0, rbd_update_features(image, RBD_FEATURE_OBJECT_MAP, true));
+ ASSERT_EQ(0, rbd_rebuild_object_map(image, print_progress_percent, NULL));
+
+ ASSERT_PASSED(validate_object_map, image);
+
+ ASSERT_EQ(0, rbd_close(image));
+ rados_ioctx_destroy(ioctx);
+}
+
TEST_F(TestLibRBD, BlockingAIO)
{
librados::IoCtx ioctx;