diff options
author | Sage Weil <sage@inktank.com> | 2013-10-14 08:58:58 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-10-22 13:45:39 -0700 |
commit | 51e8aa9123f0130e5b66375fc638f50fd4896200 (patch) | |
tree | 8878fd11252db27afeeb16c2c5d2b5038cb10304 | |
parent | 9aaffbc0802d69f35d79d2d6d535a23d5a71525b (diff) | |
download | ceph-51e8aa9123f0130e5b66375fc638f50fd4896200.tar.gz |
librados: add wait_for_latest_map()
There are times when we need to make sure the client has the latest osdmap,
for example after sending a mon command modifying pool properties.
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/include/rados/librados.hpp | 3 | ||||
-rw-r--r-- | src/librados/RadosClient.cc | 18 | ||||
-rw-r--r-- | src/librados/RadosClient.h | 2 | ||||
-rw-r--r-- | src/librados/librados.cc | 5 | ||||
-rw-r--r-- | src/osdc/Objecter.cc | 31 | ||||
-rw-r--r-- | src/osdc/Objecter.h | 2 | ||||
-rw-r--r-- | src/test/librados/misc.cc | 10 |
7 files changed, 71 insertions, 0 deletions
diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 436c9a60418..58a64996705 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -811,6 +811,9 @@ namespace librados int cluster_stat(cluster_stat_t& result); int cluster_fsid(std::string *fsid); + /// get/wait for the most recent osdmap + int wait_for_latest_map(); + /* * pool aio * diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 4614108c981..61d6aebc70f 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -368,6 +368,24 @@ void librados::RadosClient::wait_for_osdmap() } } +int librados::RadosClient::wait_for_latest_osdmap() +{ + Mutex mylock("RadosClient::wait_for_latest_osdmap"); + Cond cond; + bool done; + + lock.Lock(); + objecter->wait_for_latest_osd_map(new C_SafeCond(&mylock, &cond, &done)); + lock.Unlock(); + + mylock.Lock(); + while (!done) + cond.Wait(mylock); + mylock.Unlock(); + + return 0; +} + int librados::RadosClient::pool_list(std::list<std::string>& v) { Mutex::Locker l(lock); diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 9f795498089..80f26794985 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -82,6 +82,8 @@ public: uint64_t get_instance_id(); + int wait_for_latest_osdmap(); + int create_ioctx(const char *name, IoCtxImpl **io); int get_fsid(std::string *s); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 738c3224afe..a9f317f06cc 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -1619,6 +1619,11 @@ int librados::Rados::cluster_fsid(string *fsid) return client->get_fsid(fsid); } +int librados::Rados::wait_for_latest_map() +{ + return client->wait_for_latest_osdmap(); +} + librados::PoolAsyncCompletion *librados::Rados::pool_async_create_completion() { PoolAsyncCompletionImpl *c = new PoolAsyncCompletionImpl; diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9ad49b0715b..3b39a7d987c 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -969,6 +969,37 @@ void Objecter::wait_for_osd_map() lock.Unlock(); } +struct C_Objecter_GetVersion : public Context { + Objecter *objecter; + uint64_t oldest, newest; + Context *fin; + C_Objecter_GetVersion(Objecter *o, Context *c) + : objecter(o), oldest(0), newest(0), fin(c) {} + void finish(int r) { + if (r >= 0) + objecter->_get_latest_version(oldest, newest, fin); + } +}; + +void Objecter::wait_for_latest_osd_map(Context *fin) +{ + ldout(cct, 10) << __func__ << dendl; + C_Objecter_GetVersion *c = new C_Objecter_GetVersion(this, fin); + monc->get_version("osdmap", &c->newest, &c->oldest, c); +} + +void Objecter::_get_latest_version(epoch_t oldest, epoch_t newest, Context *fin) +{ + if (osdmap->get_epoch() >= newest) { + ldout(cct, 10) << __func__ << " latest " << newest << ", have it" << dendl; + if (fin) + fin->complete(0); + return; + } + + ldout(cct, 10) << __func__ << " latest " << newest << ", waiting" << dendl; + wait_for_new_map(fin, newest, 0); +} void Objecter::maybe_request_map() { diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index f42d07415cc..b24349499a1 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1389,6 +1389,8 @@ private: void set_client_incarnation(int inc) { client_inc = inc; } void wait_for_new_map(Context *c, epoch_t epoch, int err=0); + void wait_for_latest_osd_map(Context *fin); + void _get_latest_version(epoch_t oldest, epoch_t neweset, Context *fin); /** Get the current set of global op flags */ int get_global_op_flags() { return global_op_flags; } diff --git a/src/test/librados/misc.cc b/src/test/librados/misc.cc index 64358df23d9..a753521798c 100644 --- a/src/test/librados/misc.cc +++ b/src/test/librados/misc.cc @@ -48,6 +48,16 @@ TEST(LibRadosMisc, ClusterFSID) { ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); } +TEST(LibRadosMisc, WaitOSDMapPP) { + Rados cluster; + std::string pool_name = get_temp_pool_name(); + ASSERT_EQ("", create_one_pool_pp(pool_name, cluster)); + + ASSERT_EQ(0, cluster.wait_for_latest_map()); + + ASSERT_EQ(0, destroy_one_pool_pp(pool_name, cluster)); +} + static std::string read_key_from_tmap(IoCtx& ioctx, const std::string &obj, const std::string &key) { |