]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: add calls to expose required write alignment
authorSamuel Just <sam.just@inktank.com>
Thu, 6 Feb 2014 04:04:41 +0000 (20:04 -0800)
committerSamuel Just <sam.just@inktank.com>
Mon, 17 Feb 2014 22:24:55 +0000 (14:24 -0800)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/include/rados/librados.hpp
src/librados/RadosClient.cc
src/librados/RadosClient.h
src/librados/librados.cc
src/osd/osd_types.h

index 6b059febb33c0003d4f12af8b44adf3787d29bf4..193e3e2478d97c858405d2feba0d9ed20eff4c91 100644 (file)
@@ -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);
index 691b85b98fb3c6ef1e2d963b21b576d956b7a247..b656b5e25f23ff7b3b0439c0042d18afffeeab5a 100644 (file)
@@ -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);
index 325f4563d023cdcc7b3fbab653fab721bd68cf13..e608ced8d8e3096b01b23898e49205f4c48fc360 100644 (file)
@@ -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);
 
index c62d2b1db1c3478a5547ef5bd2cd955e825180d3..7c65ff61b3bd56cc54f36db845b4e9cfcb85447c 100644 (file)
@@ -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;
index b0521b7d8818ab64ac213c3e9adcbead98aca758..185d4368e4ab4532191bb9ceae8ee0508191d279 100644 (file)
@@ -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: