mirror of
https://github.com/ceph/ceph
synced 2025-02-24 11:37:37 +00:00
Merge pull request #43573 from idryomov/wip-create-ioctx-preserve-full-try
librbd: preserve CEPH_OSD_FLAG_FULL_TRY in create_ioctx() Reviewed-by: Mykola Golub <mgolub@suse.com> Reviewed-by: Sunny Kumar <sunkumar@redhat.com>
This commit is contained in:
commit
82c16d39c3
@ -149,6 +149,9 @@ int create_ioctx(librados::IoCtx& src_io_ctx, const std::string& pool_desc,
|
||||
|
||||
dst_io_ctx->set_namespace(
|
||||
pool_namespace ? *pool_namespace : src_io_ctx.get_namespace());
|
||||
if (src_io_ctx.get_pool_full_try()) {
|
||||
dst_io_ctx->set_pool_full_try();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -483,7 +483,6 @@ Context *OpenRequest<I>::handle_v2_get_data_pool(int *result) {
|
||||
}
|
||||
m_image_ctx->data_ctx.close();
|
||||
} else {
|
||||
m_image_ctx->data_ctx.set_namespace(m_image_ctx->md_ctx.get_namespace());
|
||||
m_image_ctx->rebuild_data_io_context();
|
||||
}
|
||||
} else {
|
||||
|
@ -791,6 +791,13 @@ std::string IoCtx::get_namespace() const {
|
||||
return ctx->get_namespace();
|
||||
}
|
||||
|
||||
void IoCtx::set_pool_full_try() {
|
||||
}
|
||||
|
||||
bool IoCtx::get_pool_full_try() {
|
||||
return false;
|
||||
}
|
||||
|
||||
static int save_operation_result(int result, int *pval) {
|
||||
if (pval != NULL) {
|
||||
*pval = result;
|
||||
|
@ -2118,32 +2118,22 @@ TEST_F(TestLibRBD, ConcurrentCreatesUnvalidatedPool)
|
||||
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);
|
||||
|
||||
@ -2168,8 +2158,47 @@ TEST_F(TestLibRBD, CreateThickRemoveFullTry)
|
||||
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);
|
||||
}
|
||||
|
@ -7,6 +7,6 @@ set -ex
|
||||
source $(dirname $0)/detect-build-env-vars.sh
|
||||
|
||||
RBD_FEATURES=13 valgrind --tool=memcheck --leak-check=full --error-exitcode=1 \
|
||||
--suppressions=${CEPH_ROOT}/src/valgrind.supp unittest_librbd
|
||||
--suppressions=${CEPH_ROOT}/qa/valgrind.supp unittest_librbd
|
||||
|
||||
echo OK
|
||||
|
Loading…
Reference in New Issue
Block a user