summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-10-14 08:58:58 -0700
committerSage Weil <sage@inktank.com>2013-10-22 13:45:39 -0700
commit51e8aa9123f0130e5b66375fc638f50fd4896200 (patch)
tree8878fd11252db27afeeb16c2c5d2b5038cb10304
parent9aaffbc0802d69f35d79d2d6d535a23d5a71525b (diff)
downloadceph-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.hpp3
-rw-r--r--src/librados/RadosClient.cc18
-rw-r--r--src/librados/RadosClient.h2
-rw-r--r--src/librados/librados.cc5
-rw-r--r--src/osdc/Objecter.cc31
-rw-r--r--src/osdc/Objecter.h2
-rw-r--r--src/test/librados/misc.cc10
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)
{