From: Samuel Just Date: Thu, 6 Feb 2014 04:04:41 +0000 (-0800) Subject: librados: add calls to expose required write alignment X-Git-Tag: v0.78~163^2~61 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=211fc4e17c1da5960db8fac6b6f07f089f73f722;p=ceph.git librados: add calls to expose required write alignment Signed-off-by: Samuel Just --- diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 6b059febb33c0..193e3e2478d97 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -500,6 +500,9 @@ namespace librados std::string get_pool_name(); + bool pool_requires_alignment(); + uint64_t pool_required_alignment(); + // create an object int create(const std::string& oid, bool exclusive); int create(const std::string& oid, bool exclusive, const std::string& category); diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 691b85b98fb3c..b656b5e25f23f 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -122,6 +122,20 @@ int64_t librados::RadosClient::lookup_pool(const char *name) return ret; } +bool librados::RadosClient::pool_requires_alignment(int64_t pool_id) +{ + Mutex::Locker l(lock); + return osdmap.have_pg_pool(pool_id) && + osdmap.get_pg_pool(pool_id)->requires_aligned_append(); +} + +uint64_t librados::RadosClient::pool_required_alignment(int64_t pool_id) +{ + Mutex::Locker l(lock); + return osdmap.have_pg_pool(pool_id) ? + osdmap.get_pg_pool(pool_id)->required_alignment() : 0; +} + const char *librados::RadosClient::get_pool_name(int64_t pool_id) { Mutex::Locker l(lock); diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 325f4563d023c..e608ced8d8e30 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -99,6 +99,8 @@ public: int get_fsid(std::string *s); int64_t lookup_pool(const char *name); const char *get_pool_name(int64_t pool_id); + bool pool_requires_alignment(int64_t pool_id); + uint64_t pool_required_alignment(int64_t pool_id); int pool_get_auid(uint64_t pool_id, unsigned long long *auid); int pool_get_name(uint64_t pool_id, std::string *auid); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index c62d2b1db1c34..7c65ff61b3bd5 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -724,6 +724,16 @@ int librados::IoCtx::get_auid(uint64_t *auid_) return rados_ioctx_pool_get_auid(io_ctx_impl, auid_); } +bool librados::IoCtx::pool_requires_alignment() +{ + return io_ctx_impl->client->pool_requires_alignment(get_id()); +} + +uint64_t librados::IoCtx::pool_required_alignment() +{ + return io_ctx_impl->client->pool_required_alignment(get_id()); +} + std::string librados::IoCtx::get_pool_name() { std::string s; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index b0521b7d8818a..185d4368e4ab4 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -897,6 +897,9 @@ public: bool is_replicated() const { return get_type() == TYPE_REPLICATED; } bool is_erasure() const { return get_type() == TYPE_ERASURE; } + bool requires_aligned_append() const { return is_erasure(); } + uint64_t required_alignment() const { return stripe_width; } + bool can_shift_osds() const { switch (get_type()) { case TYPE_REPLICATED: