From 53d775020711ca78dbe70f32238bd7c810974ccb Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Wed, 8 Aug 2012 19:13:45 -0700 Subject: [PATCH] librados: add method to get the fsid of a cluster This will be used by OpenStack to check whether two components have access to the same backend cluster. Signed-off-by: Josh Durgin --- src/include/rados/librados.h | 13 +++++++++++++ src/include/rados/librados.hpp | 1 + src/librados/RadosClient.cc | 11 +++++++++++ src/librados/RadosClient.h | 1 + src/librados/librados.cc | 17 +++++++++++++++++ src/pybind/rados.py | 11 +++++++++++ src/test/pybind/test_rados.py | 6 +++++- src/test/rados-api/misc.cc | 13 +++++++++++++ 8 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index 897471a469419..6660b61e35de7 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -349,6 +349,19 @@ int rados_conf_get(rados_t cluster, const char *option, char *buf, size_t len); */ int rados_cluster_stat(rados_t cluster, struct rados_cluster_stat_t *result); +/** + * Get the fsid of the cluster as a hexadecimal string. + * + * The fsid is a unique id of an entire Ceph cluster. + * + * @param cluster where to get the fsid + * @param buf where to write the fsid + * @param len the size of buf in bytes (should be 37) + * @returns 0 on success, negative error code on failure + * @returns -ERANGE if the buffer is too short to contain the + * fsid + */ +int rados_cluster_fsid(rados_t cluster, char *buf, size_t len); /** * @defgroup librados_h_pools Pools diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 3a3f4775103c3..d9545d467560e 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -518,6 +518,7 @@ namespace librados std::string& category, std::map& stats); int cluster_stat(cluster_stat_t& result); + int cluster_fsid(std::string *fsid); /* pool aio */ static PoolAsyncCompletion *pool_async_create_completion(); diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index e70033623c67f..a2e4463400c55 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -103,6 +103,17 @@ int librados::RadosClient::pool_get_name(uint64_t pool_id, std::string *s) return 0; } +int librados::RadosClient::get_fsid(std::string *s) +{ + if (!s) + return -EINVAL; + Mutex::Locker l(lock); + ostringstream oss; + oss << osdmap.get_fsid(); + *s = oss.str(); + return 0; +} + int librados::RadosClient::connect() { common_init_finish(cct); diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 3ca6153df5b88..1f39f22fb3f31 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -76,6 +76,7 @@ public: int create_ioctx(const char *name, IoCtxImpl **io); + int get_fsid(std::string *s); int64_t lookup_pool(const char *name); const char *get_pool_name(int64_t pool_id); int pool_get_auid(uint64_t pool_id, unsigned long long *auid); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 69ba440d5de8f..4c7426aead207 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -1254,6 +1254,11 @@ int librados::Rados::cluster_stat(cluster_stat_t& result) return r; } +int librados::Rados::cluster_fsid(string *fsid) +{ + return client->get_fsid(fsid); +} + librados::PoolAsyncCompletion *librados::Rados::pool_async_create_completion() { PoolAsyncCompletionImpl *c = new PoolAsyncCompletionImpl; @@ -1447,6 +1452,18 @@ extern "C" int rados_pool_reverse_lookup(rados_t cluster, int64_t id, return name.length(); } +extern "C" int rados_cluster_fsid(rados_t cluster, char *buf, + size_t maxlen) +{ + librados::RadosClient *radosp = (librados::RadosClient *)cluster; + std::string fsid; + radosp->get_fsid(&fsid); + if (fsid.length() >= maxlen) + return -ERANGE; + strcpy(buf, fsid.c_str()); + return fsid.length(); +} + extern "C" int rados_pool_list(rados_t cluster, char *buf, size_t len) { librados::RadosClient *client = (librados::RadosClient *)cluster; diff --git a/src/pybind/rados.py b/src/pybind/rados.py index 4ef77ad32891e..5dbf998cef6af 100755 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -242,6 +242,17 @@ Rados object in state %s." % (self.state)) break return filter(lambda name: name != '', c_names.raw.split('\0')) + def get_fsid(self): + self.require_state("connected") + fsid_len = 36 + fsid = create_string_buffer(fsid_len + 1) + ret = self.librados.rados_cluster_fsid(self.cluster, + byref(fsid), + fsid_len + 1) + if ret < 0: + raise make_ex(ret, "error getting cluster fsid") + return fsid.value + def open_ioctx(self, ioctx_name): self.require_state("connected") if not isinstance(ioctx_name, str): diff --git a/src/test/pybind/test_rados.py b/src/test/pybind/test_rados.py index c91dea904e80e..dab50cff2ae62 100644 --- a/src/test/pybind/test_rados.py +++ b/src/test/pybind/test_rados.py @@ -3,7 +3,7 @@ from rados import (Rados, Object, ObjectExists, ObjectNotFound, ANONYMOUS_AUID, ADMIN_AUID) import threading -class TestPool(object): +class TestRados(object): def setUp(self): self.rados = Rados(conffile='') @@ -51,6 +51,10 @@ class TestPool(object): eq(set(['a' * 500]), self.list_non_default_pools()) self.rados.delete_pool('a' * 500) + def test_get_fsid(self): + fsid = self.rados.get_fsid() + eq(len(fsid), 36) + class TestIoctx(object): def setUp(self): diff --git a/src/test/rados-api/misc.cc b/src/test/rados-api/misc.cc index a1feeed2f1184..0821ec0778482 100644 --- a/src/test/rados-api/misc.cc +++ b/src/test/rados-api/misc.cc @@ -27,6 +27,19 @@ TEST(LibRadosMisc, VersionPP) { Rados::version(&major, &minor, &extra); } +TEST(LibRadosMisc, ClusterFSID) { + rados_t cluster; + std::string pool_name = get_temp_pool_name(); + ASSERT_EQ("", create_one_pool(pool_name, &cluster)); + + char fsid[37]; + ASSERT_EQ(-ERANGE, rados_cluster_fsid(cluster, fsid, sizeof(fsid) - 1)); + ASSERT_EQ(sizeof(fsid) - 1, + (size_t)rados_cluster_fsid(cluster, fsid, sizeof(fsid))); + + ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster)); +} + static std::string read_key_from_tmap(IoCtx& ioctx, const std::string &obj, const std::string &key) { -- 2.39.5