From: Sage Weil Date: Mon, 21 Jul 2014 21:11:42 +0000 (-0700) Subject: librados: wait for map on create_ioctx failure X-Git-Tag: v0.86~213^2~54 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0a54f0052073938dbb5e763fe7c89c304b0874e1;p=ceph.git librados: wait for map on create_ioctx failure Ensure we have a map so we don't simply complain that a pool doesn't exists. Only take the lock and wait if we fail to lookup the pool, though, so we avoid contending the lock in the general case. Signed-off-by: Sage Weil --- diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 3f6fe74d85df..f59cca963cef 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -315,8 +315,28 @@ librados::RadosClient::~RadosClient() int librados::RadosClient::create_ioctx(const char *name, IoCtxImpl **io) { int64_t poolid = lookup_pool(name); - if (poolid < 0) - return (int)poolid; + if (poolid < 0) { + // hmm, first make sure we have *a* map + { + Mutex::Locker l(lock); + int r = wait_for_osdmap(); + if (r < 0) + return r; + } + + poolid = lookup_pool(name); + if (poolid < 0) { + // make sure we have the *latest* map + int r = wait_for_latest_osdmap(); + if (r < 0) + return r; + + poolid = lookup_pool(name); + if (poolid < 0) { + return (int)poolid; + } + } + } *io = new librados::IoCtxImpl(this, objecter, &lock, poolid, name, CEPH_NOSNAP);