]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: add pool prefix to omap keys
authorSage Weil <sage@redhat.com>
Tue, 23 Jul 2019 22:12:22 +0000 (17:12 -0500)
committerSage Weil <sage@redhat.com>
Tue, 6 Aug 2019 14:24:14 +0000 (09:24 -0500)
Set per-onode flag to indicate whether the object has per-pool keys or
not.  This will allow us to incrementally transition objects later.

Put the new keys under a different prefix.

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/bluestore_types.h

index 8d443fd895deec844f683b15a0f56c4115906842..e7dac2237198d23f620df05fe9479ea4768d1d14 100644 (file)
@@ -73,6 +73,7 @@ const string PREFIX_COLL = "C";        // collection name -> cnode_t
 const string PREFIX_OBJ = "O";         // object name -> onode_t
 const string PREFIX_OMAP = "M";        // u64 + keyname -> value
 const string PREFIX_PGMETA_OMAP = "P"; // u64 + keyname -> value(for meta coll)
+const string PREFIX_PERPOOL_OMAP = "m"; // s64 + u64 + keyname -> value
 const string PREFIX_DEFERRED = "L";    // id -> deferred_transaction_t
 const string PREFIX_ALLOC = "B";       // u64 offset -> u64 length (freelist)
 const string PREFIX_ALLOC_BITMAP = "b";// (see BitmapFreelistManager)
@@ -3273,20 +3274,31 @@ void BlueStore::Onode::dump(Formatter* f) const
 
 const string& BlueStore::Onode::get_omap_prefix()
 {
-  return onode.is_pgmeta_omap() ? PREFIX_PGMETA_OMAP
-    : PREFIX_OMAP;
+  if (onode.is_pgmeta_omap()) {
+    return PREFIX_PGMETA_OMAP;
+  }
+  if (onode.is_perpool_omap()) {
+    return PREFIX_PERPOOL_OMAP;
+  }
+  return PREFIX_OMAP;
 }
 
 // '-' < '.' < '~'
 
 void BlueStore::Onode::get_omap_header(string *out)
 {
+  if (onode.is_perpool_omap()) {
+    _key_encode_u64(oid.hobj.pool, out);
+  }
   _key_encode_u64(onode.nid, out);
   out->push_back('-');
 }
 
 void BlueStore::Onode::get_omap_key(const string& key, string *out)
 {
+  if (onode.is_perpool_omap()) {
+    _key_encode_u64(oid.hobj.pool, out);
+  }
   _key_encode_u64(onode.nid, out);
   out->push_back('.');
   out->append(key);
@@ -3294,19 +3306,29 @@ void BlueStore::Onode::get_omap_key(const string& key, string *out)
 
 void BlueStore::Onode::rewrite_omap_key(const string& old, string *out)
 {
+  if (onode.is_perpool_omap()) {
+    _key_encode_u64(oid.hobj.pool, out);
+  }
   _key_encode_u64(onode.nid, out);
   out->append(old.c_str() + out->length(), old.size() - out->length());
 }
 
 void BlueStore::Onode::get_omap_tail(string *out)
 {
+  if (onode.is_perpool_omap()) {
+    _key_encode_u64(oid.hobj.pool, out);
+  }
   _key_encode_u64(onode.nid, out);
   out->push_back('~');
 }
 
 void BlueStore::Onode::decode_omap_key(const string& key, string *user_key)
 {
-  *user_key = key.substr(sizeof(uint64_t) + 1);
+  if (onode.is_perpool_omap()) {
+    *user_key = key.substr(sizeof(uint64_t)*2 + 1);
+  } else {
+    *user_key = key.substr(sizeof(uint64_t) + 1);
+  }
 }
 
 
@@ -8211,7 +8233,9 @@ void BlueStore::_get_statfs_overall(struct store_statfs_t *buf)
 {
   buf->reset();
 
-  buf->omap_allocated = db->estimate_prefix_size(PREFIX_OMAP, string());
+  buf->omap_allocated =
+    db->estimate_prefix_size(PREFIX_OMAP, string()) +
+    db->estimate_prefix_size(PREFIX_PERPOOL_OMAP, string());
 
   uint64_t bfree = alloc->get_free();
 
@@ -13145,7 +13169,7 @@ int BlueStore::_omap_setkeys(TransContext *txc,
   auto p = bl.cbegin();
   __u32 num;
   if (!o->onode.has_omap()) {
-    o->onode.set_omap_flag();
+    o->onode.set_omap_flags();
     if (o->oid.is_pgmeta()) {
       o->onode.flags |= bluestore_onode_t::FLAG_PGMETA_OMAP;
     }
@@ -13189,7 +13213,7 @@ int BlueStore::_omap_setheader(TransContext *txc,
   int r;
   string key;
   if (!o->onode.has_omap()) {
-    o->onode.set_omap_flag();
+    o->onode.set_omap_flags();
     if (o->oid.is_pgmeta()) {
       o->onode.flags |= bluestore_onode_t::FLAG_PGMETA_OMAP;
     }
@@ -13344,7 +13368,7 @@ int BlueStore::_clone(TransContext *txc,
   }
   if (oldo->onode.has_omap()) {
     dout(20) << __func__ << " copying omap data" << dendl;
-    newo->onode.set_omap_flag();
+    newo->onode.set_omap_flags();
     if (newo->oid.is_pgmeta()) {
       newo->onode.flags |= bluestore_onode_t::FLAG_PGMETA_OMAP;
     }
index 87fbd981d9f806f60f8bbfd613a0f9e1a171c935..9db13c3ff456d6fb58fc59e1e56afb7a40f258d0 100644 (file)
@@ -913,6 +913,7 @@ struct bluestore_onode_t {
   enum {
     FLAG_OMAP = 1,       ///< object may have omap data
     FLAG_PGMETA_OMAP = 2,  ///< omap data is in meta omap prefix
+    FLAG_PERPOOL_OMAP = 4, ///< omap data is in per-pool prefix; per-pool keys
   };
 
   string get_flags_string() const {
@@ -920,6 +921,12 @@ struct bluestore_onode_t {
     if (flags & FLAG_OMAP) {
       s = "omap";
     }
+    if (flags & FLAG_PGMETA_OMAP) {
+      s += "+pgmeta_omap";
+    }
+    if (flags & FLAG_PERPOOL_OMAP) {
+      s += "+perpool_omap";
+    }
     return s;
   }
 
@@ -941,9 +948,12 @@ struct bluestore_onode_t {
   bool is_pgmeta_omap() const {
     return has_flag(FLAG_PGMETA_OMAP);
   }
+  bool is_perpool_omap() const {
+    return has_flag(FLAG_PERPOOL_OMAP);
+  }
 
-  void set_omap_flag() {
-    set_flag(FLAG_OMAP);
+  void set_omap_flags() {
+    set_flag(FLAG_OMAP | FLAG_PERPOOL_OMAP);
   }
 
   void clear_omap_flag() {