]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: add blob_map to onode_t
authorSage Weil <sage@redhat.com>
Tue, 3 May 2016 19:07:50 +0000 (15:07 -0400)
committerSage Weil <sage@redhat.com>
Wed, 1 Jun 2016 15:38:42 +0000 (11:38 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h

index 1f4c5dc784f978ff5fc1140c48a3be1902be7a34..cf7889050550f4b6146912200415efeb8c1a8090 100644 (file)
@@ -538,7 +538,9 @@ void bluestore_onode_t::encode(bufferlist& bl) const
   ::encode(nid, bl);
   ::encode(size, bl);
   ::encode(attrs, bl);
+  ::encode(blob_map, bl);
   ::encode(block_map, bl);
+  ::encode(extent_map, bl);
   ::encode(overlay_map, bl);
   ::encode(overlay_refs, bl);
   ::encode(last_overlay_key, bl);
@@ -555,7 +557,9 @@ void bluestore_onode_t::decode(bufferlist::iterator& p)
   ::decode(nid, p);
   ::decode(size, p);
   ::decode(attrs, p);
+  ::decode(blob_map, p);
   ::decode(block_map, p);
+  ::decode(extent_map, p);
   ::decode(overlay_map, p);
   ::decode(overlay_refs, p);
   ::decode(last_overlay_key, p);
@@ -588,8 +592,24 @@ void bluestore_onode_t::dump(Formatter *f) const
     f->close_section();
   }
   f->close_section();
+  f->open_object_section("blob_map");
+  for (const auto& p : blob_map) {
+    f->open_object_section("blob");
+    f->dump_unsigned("id", p.first);
+    p.second.dump(f);
+    f->close_section();
+  }
+  f->close_section();
+  f->open_object_section("extent_map");
+  for (const auto& p : extent_map) {
+    f->open_object_section("extent");
+    f->dump_unsigned("logical_offset", p.first);
+    p.second.dump(f);
+    f->close_section();
+  }
+  f->close_section();
   f->open_object_section("overlays");
-  for (map<uint64_t, bluestore_overlay_t>::const_iterator p = overlay_map.begin();
+  for (map<uint64_t,bluestore_overlay_t>::const_iterator p = overlay_map.begin();
        p != overlay_map.end(); ++p) {
     f->open_object_section("overlay");
     f->dump_unsigned("offset", p->first);
index 480be8121e4ffbca07f633a6d7c134d303dc1928..71c721bfd262e41681b462f8237023c91813d64a 100644 (file)
@@ -448,8 +448,10 @@ struct bluestore_onode_t {
   uint64_t size;                       ///< object size
   map<string, bufferptr> attrs;        ///< attrs
   map<uint64_t, bluestore_extent_t> block_map;   ///< block data
+  map<uint64_t,bluestore_lextent_t> extent_map;  ///< extent refs
   map<uint64_t,bluestore_overlay_t> overlay_map; ///< overlay data (stored in db)
   map<uint64_t,uint16_t> overlay_refs; ///< overlay keys ref counts (if >1)
+  bluestore_blob_map_t blob_map;       ///< local blobs (this onode onode)
   uint32_t last_overlay_key;           ///< key for next overlay
   uint64_t omap_head;                  ///< id for omap root node
 
@@ -490,6 +492,32 @@ struct bluestore_onode_t {
     return fp;
   }
 
+  map<uint64_t,bluestore_lextent_t>::iterator find_lextent(uint64_t offset) {
+    map<uint64_t,bluestore_lextent_t>::iterator fp =
+      extent_map.lower_bound(offset);
+    if (fp != extent_map.begin()) {
+      --fp;
+      if (fp->first + fp->second.length <= offset) {
+       ++fp;
+      }
+    }
+    if (fp != extent_map.end() && fp->first > offset)
+      return extent_map.end();  // extent is past offset
+    return fp;
+  }
+
+  map<uint64_t,bluestore_lextent_t>::iterator seek_lextent(uint64_t offset) {
+    map<uint64_t,bluestore_lextent_t>::iterator fp =
+      extent_map.lower_bound(offset);
+    if (fp != extent_map.begin()) {
+      --fp;
+      if (fp->first + fp->second.length <= offset) {
+       ++fp;
+      }
+    }
+    return fp;
+  }
+
   bool put_overlay_ref(uint64_t key) {
     map<uint64_t,uint16_t>::iterator q = overlay_refs.find(key);
     if (q == overlay_refs.end())