]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: fix race on osdmap initialization
authorJohn Spray <john.spray@redhat.com>
Thu, 14 Aug 2014 10:56:07 +0000 (11:56 +0100)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:34:18 +0000 (01:34 +0100)
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 <john.spray@redhat.com>
src/librados/RadosClient.cc

index 7fddcdebd03a5280886c92429177c1bc199ba31e..1cba0434ede7de0d30f0f515dc5fd9aa4c78b8bf 100644 (file)
@@ -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;