From 52b0ddcfb9d836a1a1afe47abd0bf1bdd0fd4c8e Mon Sep 17 00:00:00 2001 From: John Spray Date: Thu, 14 Aug 2014 11:56:07 +0100 Subject: [PATCH] librados: fix race on osdmap initialization This would cause occasional failures where calls to lookup_pool immediately after connect() would fail to find any pool because the OSD map had not yet been loaded. The wait for the map was lost when the pool name cache was lost in ce176b827. To avoid similar issues, the pool_requires_alignment and pool_required_alignment helpers need the same wait_for_osdmap before proceeding. Usually callers would call lookup_pool before these guys but it's not guaranteed. Signed-off-by: John Spray --- src/librados/RadosClient.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 7fddcdebd03a5..1cba0434ede7d 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -85,6 +85,13 @@ librados::RadosClient::RadosClient(CephContext *cct_) int64_t librados::RadosClient::lookup_pool(const char *name) { + Mutex::Locker l(lock); + + int r = wait_for_osdmap(); + if (r < 0) { + return r; + } + const OSDMap *osdmap = objecter->get_osdmap_read(); int64_t ret = osdmap->lookup_pg_pool_name(name); objecter->put_osdmap_read(); @@ -94,6 +101,12 @@ int64_t librados::RadosClient::lookup_pool(const char *name) bool librados::RadosClient::pool_requires_alignment(int64_t pool_id) { Mutex::Locker l(lock); + + int r = wait_for_osdmap(); + if (r < 0) { + return r; + } + const OSDMap *osdmap = objecter->get_osdmap_read(); bool ret = osdmap->have_pg_pool(pool_id) && osdmap->get_pg_pool(pool_id)->requires_aligned_append(); @@ -104,6 +117,12 @@ bool librados::RadosClient::pool_requires_alignment(int64_t pool_id) uint64_t librados::RadosClient::pool_required_alignment(int64_t pool_id) { Mutex::Locker l(lock); + + int r = wait_for_osdmap(); + if (r < 0) { + return r; + } + const OSDMap *osdmap = objecter->get_osdmap_read(); uint64_t ret = osdmap->have_pg_pool(pool_id) ? osdmap->get_pg_pool(pool_id)->required_alignment() : 0; -- 2.39.5