diff options
author | Sage Weil <sage@inktank.com> | 2013-06-13 16:39:30 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-13 16:39:30 -0700 |
commit | 93505bb3c794312814f7e4d099296a53f3bb9db0 (patch) | |
tree | 0ec25fa974ceeca41e89deb57bda1881e9132842 | |
parent | 95aa2e8d079fdad618c3ded827fedd8a5c8067da (diff) | |
download | ceph-93505bb3c794312814f7e4d099296a53f3bb9db0.tar.gz |
librados: wait for osdmap for commands that need it
In commit 7e1cf87b5158c870e2a118ed6d316be8cb9818ce we stopped waiting for
the osdmap on start because the Objecter will normally wait, but for some
commands we assume the osdmap is recent(ish).
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r-- | src/librados/RadosClient.cc | 19 | ||||
-rw-r--r-- | src/librados/RadosClient.h | 2 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index f5dccaffc09..f68125fb8c0 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -85,6 +85,7 @@ librados::RadosClient::RadosClient(CephContext *cct_) int64_t librados::RadosClient::lookup_pool(const char *name) { Mutex::Locker l(lock); + wait_for_osdmap(); int64_t ret = osdmap.lookup_pg_pool_name(name); if (ret < 0) return -ENOENT; @@ -100,6 +101,7 @@ const char *librados::RadosClient::get_pool_name(int64_t pool_id) int librados::RadosClient::pool_get_auid(uint64_t pool_id, unsigned long long *auid) { Mutex::Locker l(lock); + wait_for_osdmap(); const pg_pool_t *pg = osdmap.get_pg_pool(pool_id); if (!pg) return -ENOENT; @@ -110,6 +112,7 @@ int librados::RadosClient::pool_get_auid(uint64_t pool_id, unsigned long long *a int librados::RadosClient::pool_get_name(uint64_t pool_id, std::string *s) { Mutex::Locker l(lock); + wait_for_osdmap(); const char *str = osdmap.get_pool_name(pool_id); if (!str) return -ENOENT; @@ -123,7 +126,7 @@ int librados::RadosClient::get_fsid(std::string *s) return -EINVAL; Mutex::Locker l(lock); ostringstream oss; - oss << osdmap.get_fsid(); + oss << monclient.get_fsid(); *s = oss.str(); return 0; } @@ -354,9 +357,21 @@ bool librados::RadosClient::_dispatch(Message *m) return true; } +void librados::RadosClient::wait_for_osdmap() +{ + assert(lock.is_locked()); + if (osdmap.get_epoch() == 0) { + ldout(cct, 10) << __func__ << " waiting" << dendl; + while (osdmap.get_epoch() == 0) + cond.Wait(lock); + ldout(cct, 10) << __func__ << " done waiting" << dendl; + } +} + int librados::RadosClient::pool_list(std::list<std::string>& v) { Mutex::Locker l(lock); + wait_for_osdmap(); for (map<int64_t,pg_pool_t>::const_iterator p = osdmap.get_pools().begin(); p != osdmap.get_pools().end(); ++p) @@ -453,6 +468,7 @@ int librados::RadosClient::pool_create_async(string& name, PoolAsyncCompletionIm int librados::RadosClient::pool_delete(const char *name) { lock.Lock(); + wait_for_osdmap(); int tmp_pool_id = osdmap.lookup_pg_pool_name(name); if (tmp_pool_id < 0) { lock.Unlock(); @@ -481,6 +497,7 @@ int librados::RadosClient::pool_delete(const char *name) int librados::RadosClient::pool_delete_async(const char *name, PoolAsyncCompletionImpl *c) { Mutex::Locker l(lock); + wait_for_osdmap(); int tmp_pool_id = osdmap.lookup_pg_pool_name(name); if (tmp_pool_id < 0) return -ENOENT; diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 337beff5750..4f616d45331 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -70,6 +70,8 @@ private: void *log_cb_arg; string log_watch; + void wait_for_osdmap(); + public: Finisher finisher; |