From: Ilya Dryomov Date: Wed, 16 Mar 2022 19:05:56 +0000 (+0100) Subject: librados: check latest osdmap on ENOENT in pool_reverse_lookup() X-Git-Tag: v16.2.8~36^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=dc05671dcd7288f6fff4322c2df050e4ef6684d4;p=ceph.git librados: check latest osdmap on ENOENT in pool_reverse_lookup() Avoid spurious ENOENT errors from rados_pool_reverse_lookup() and Rados::pool_reverse_lookup(). This makes lookup by id consistent with lookup by name: the latter has been checking latest osdmap since commit 7e5669b11b14 ("rados: we need to get the latest osdmap when pool does not exists"). Fixes: https://tracker.ceph.com/issues/54593 Signed-off-by: Ilya Dryomov (cherry picked from commit 1f837e233af32c8a66f88508cde534c361ecfcbc) --- diff --git a/src/librados/librados_c.cc b/src/librados/librados_c.cc index 76014beee715e..ca8f7c3c4890f 100644 --- a/src/librados/librados_c.cc +++ b/src/librados/librados_c.cc @@ -440,7 +440,7 @@ extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_reverse_lookup)( tracepoint(librados, rados_pool_reverse_lookup_enter, cluster, id, maxlen); librados::RadosClient *radosp = (librados::RadosClient *)cluster; std::string name; - int r = radosp->pool_get_name(id, &name); + int r = radosp->pool_get_name(id, &name, true); if (r < 0) { tracepoint(librados, rados_pool_reverse_lookup_exit, r, ""); return r; diff --git a/src/librados/librados_cxx.cc b/src/librados/librados_cxx.cc index ce041418e4235..8c9ac3c916fe8 100644 --- a/src/librados/librados_cxx.cc +++ b/src/librados/librados_cxx.cc @@ -2594,7 +2594,7 @@ int64_t librados::Rados::pool_lookup(const char *name) int librados::Rados::pool_reverse_lookup(int64_t id, std::string *name) { - return client->pool_get_name(id, name); + return client->pool_get_name(id, name, true); } int librados::Rados::mon_command(string cmd, const bufferlist& inbl, diff --git a/src/test/librados/pool.cc b/src/test/librados/pool.cc index 4b0a3cc0246a9..19a170ed27bf9 100644 --- a/src/test/librados/pool.cc +++ b/src/test/librados/pool.cc @@ -63,6 +63,40 @@ TEST(LibRadosPools, PoolLookup2) { ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } +TEST(LibRadosPools, PoolLookupOtherInstance) { + rados_t cluster1; + ASSERT_EQ("", connect_cluster(&cluster1)); + + rados_t cluster2; + std::string pool_name = get_temp_pool_name(); + ASSERT_EQ("", create_one_pool(pool_name, &cluster2)); + int64_t pool_id = rados_pool_lookup(cluster2, pool_name.c_str()); + ASSERT_GT(pool_id, 0); + + ASSERT_EQ(pool_id, rados_pool_lookup(cluster1, pool_name.c_str())); + + ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster2)); + rados_shutdown(cluster1); +} + +TEST(LibRadosPools, PoolReverseLookupOtherInstance) { + rados_t cluster1; + ASSERT_EQ("", connect_cluster(&cluster1)); + + rados_t cluster2; + std::string pool_name = get_temp_pool_name(); + ASSERT_EQ("", create_one_pool(pool_name, &cluster2)); + int64_t pool_id = rados_pool_lookup(cluster2, pool_name.c_str()); + ASSERT_GT(pool_id, 0); + + char buf[100]; + ASSERT_LT(0, rados_pool_reverse_lookup(cluster1, pool_id, buf, 100)); + ASSERT_EQ(0, strcmp(buf, pool_name.c_str())); + + ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster2)); + rados_shutdown(cluster1); +} + TEST(LibRadosPools, PoolDelete) { rados_t cluster; std::string pool_name = get_temp_pool_name();