rados_ioctx_destroy(ioctx);
}
-TEST_F(TestLibRBD, CreateThickRemoveFullTry)
+static void remove_full_try(rados_ioctx_t ioctx, const std::string& image_name,
+ const std::string& data_pool_name)
{
- REQUIRE(!is_librados_test_stub(_rados));
-
- rados_ioctx_t ioctx;
- auto pool_name = create_pool(true);
- ASSERT_EQ(0, rados_ioctx_create(_cluster, pool_name.c_str(), &ioctx));
-
int order = 0;
- auto image_name = get_temp_image_name();
uint64_t quota = 10 << 20;
uint64_t size = 5 * quota;
ASSERT_EQ(0, create_image(ioctx, image_name.c_str(), size, &order));
- // FIXME: this is a workaround for rbd_trash object being created
- // on the first remove -- pre-create it to avoid bumping into quota
- ASSERT_EQ(0, rbd_remove(ioctx, image_name.c_str()));
- ASSERT_EQ(0, create_image(ioctx, image_name.c_str(), size, &order));
-
std::string cmdstr = "{\"prefix\": \"osd pool set-quota\", \"pool\": \"" +
- pool_name + "\", \"field\": \"max_bytes\", \"val\": \"" +
+ data_pool_name + "\", \"field\": \"max_bytes\", \"val\": \"" +
std::to_string(quota) + "\"}";
char *cmd[1];
cmd[0] = (char *)cmdstr.c_str();
- ASSERT_EQ(0, rados_mon_command(_cluster, (const char **)cmd, 1, "", 0,
- nullptr, 0, nullptr, 0));
+ ASSERT_EQ(0, rados_mon_command(rados_ioctx_get_cluster(ioctx),
+ (const char **)cmd, 1, "", 0, nullptr, 0,
+ nullptr, 0));
rados_set_pool_full_try(ioctx);
ASSERT_EQ(0, rbd_close(image));
// make sure we have latest map that marked the pool full
- ASSERT_EQ(0, rados_wait_for_latest_osdmap(_cluster));
+ ASSERT_EQ(0, rados_wait_for_latest_osdmap(rados_ioctx_get_cluster(ioctx)));
ASSERT_EQ(0, rbd_remove(ioctx, image_name.c_str()));
+}
+
+TEST_F(TestLibRBD, RemoveFullTry)
+{
+ REQUIRE(!is_librados_test_stub(_rados));
+
+ rados_ioctx_t ioctx;
+ auto pool_name = create_pool(true);
+ ASSERT_EQ(0, rados_ioctx_create(_cluster, pool_name.c_str(), &ioctx));
+ // cancel out rbd_default_data_pool -- we need an image without
+ // a separate data pool
+ ASSERT_EQ(0, rbd_pool_metadata_set(ioctx, "conf_rbd_default_data_pool",
+ pool_name.c_str()));
+
+ int order = 0;
+ auto image_name = get_temp_image_name();
+ // FIXME: this is a workaround for rbd_trash object being created
+ // on the first remove -- pre-create it to avoid bumping into quota
+ ASSERT_EQ(0, create_image(ioctx, image_name.c_str(), 0, &order));
+ ASSERT_EQ(0, rbd_remove(ioctx, image_name.c_str()));
+ remove_full_try(ioctx, image_name, pool_name);
+
+ rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, RemoveFullTryDataPool)
+{
+ REQUIRE_FORMAT_V2();
+ REQUIRE(!is_librados_test_stub(_rados));
+
+ rados_ioctx_t ioctx;
+ auto pool_name = create_pool(true);
+ auto data_pool_name = create_pool(true);
+ ASSERT_EQ(0, rados_ioctx_create(_cluster, pool_name.c_str(), &ioctx));
+ ASSERT_EQ(0, rbd_pool_metadata_set(ioctx, "conf_rbd_default_data_pool",
+ data_pool_name.c_str()));
+
+ auto image_name = get_temp_image_name();
+ remove_full_try(ioctx, image_name, data_pool_name);
rados_ioctx_destroy(ioctx);
}