From: John Spray Date: Thu, 14 Aug 2014 10:56:07 +0000 (+0100) Subject: librados: fix race on osdmap initialization X-Git-Tag: v0.86~213^2~24 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=52b0ddcfb9d836a1a1afe47abd0bf1bdd0fd4c8e;p=ceph.git 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 --- diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 7fddcdebd03a..1cba0434ede7 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;