]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: record extents types and laddr in record metadata
authorSamuel Just <sjust@redhat.com>
Fri, 4 Sep 2020 04:17:52 +0000 (21:17 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:08 +0000 (12:27 -0700)
We'll need this to scan segments for live blocks.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h
src/crimson/os/seastore/seastore_types.h
src/test/crimson/seastore/test_seastore_journal.cc

index 2fb51bd018314bc96e9fa1449d3f178add4c389e..90fc253e40ef69085fcf21ce74f39a460cad670a 100644 (file)
@@ -248,7 +248,15 @@ std::optional<record_t> Cache::try_construct_record(Transaction &t)
     if (i->get_type() == extent_types_t::ROOT) {
       assert(0 == "ROOT never gets written as a fresh block");
     }
-    record.extents.push_back(extent_t{std::move(bl)});
+
+    assert(bl.length() == i->get_length());
+    record.extents.push_back(extent_t{
+       i->get_type(),
+       i->is_logical()
+       ? i->cast<LogicalCachedExtent>()->get_laddr()
+       : L_ADDR_NULL,
+       std::move(bl)
+      });
   }
 
   return std::make_optional<record_t>(std::move(record));
index 8bdadaa21f52503196df8bd28bc3c2b68e22bec1..1489919b6c3bceb5099180615f846b5e8579b861 100644 (file)
@@ -66,6 +66,9 @@ ceph::bufferlist Journal::encode_record(
     record.extents.size()
   };
   ::encode(header, metadatabl);
+  for (const auto &i: record.extents) {
+    ::encode(extent_info_t(i), metadatabl);
+  }
   for (const auto &i: record.deltas) {
     ::encode(i, metadatabl);
   }
@@ -113,6 +116,8 @@ Journal::record_size_t Journal::get_encoded_record_length(
   const record_t &record) const {
   extent_len_t metadata =
     (extent_len_t)ceph::encoded_sizeof_bounded<record_header_t>();
+  metadata += record.extents.size() *
+    ceph::encoded_sizeof_bounded<extent_info_t>();
   extent_len_t data = 0;
   for (const auto &i: record.deltas) {
     metadata += ceph::encoded_sizeof(i);
@@ -321,6 +326,7 @@ std::optional<std::vector<delta_info_t>> Journal::try_decode_deltas(
 {
   auto bliter = bl.cbegin();
   bliter += ceph::encoded_sizeof_bounded<record_header_t>();
+  bliter += header.extents  * ceph::encoded_sizeof_bounded<extent_info_t>();
   logger().debug("{}: decoding {} deltas", __func__, header.deltas);
   std::vector<delta_info_t> deltas(header.deltas);
   for (auto &&i : deltas) {
index 83234fc8c44663879eefc5d40fa506b6c740bce2..f1bdaff3a2b0eeba12d82c90fe85bd50c63ea2c0 100644 (file)
@@ -61,6 +61,24 @@ struct record_header_t {
   }
 };
 
+struct extent_info_t {
+  extent_types_t type = extent_types_t::NONE;
+  laddr_t addr = L_ADDR_NULL;
+  extent_len_t len = 0;
+
+  extent_info_t() = default;
+  extent_info_t(const extent_t &et)
+    : type(et.type), addr(et.addr), len(et.bl.length()) {}
+
+  DENC(extent_info_t, v, p) {
+    DENC_START(1, 1, p);
+    denc(v.type, p);
+    denc(v.addr, p);
+    denc(v.len, p);
+    DENC_FINISH(p);
+  }
+};
+
 /**
  * Callback interface for managing available segments
  */
@@ -266,3 +284,4 @@ private:
 }
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::segment_header_t)
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::record_header_t)
+WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::extent_info_t)
index a17e47aac5ab84671b77d99868a866ece2379c08..fa556e2e3525bb9273ef8b3528d6171d13122986 100644 (file)
@@ -282,6 +282,8 @@ std::ostream &operator<<(std::ostream &out, extent_types_t t);
 
 /* description of a new physical extent */
 struct extent_t {
+  extent_types_t type;  ///< type of extent
+  laddr_t addr;         ///< laddr of extent (L_ADDR_NULL for non-logical)
   ceph::bufferlist bl;  ///< payload, bl.length() == length, aligned
 };
 
index 3be26fd5c04313f6e8f3fbf19b87950a4758aee5..197ff4cfcf4e1e74ed6c0b5ec64fab248d01e64f 100644 (file)
@@ -168,7 +168,7 @@ struct journal_test_t : seastar_test_suite_t, JournalSegmentProvider {
     char contents = distribution(generator);
     bufferlist bl;
     bl.append(buffer::ptr(buffer::create(blocks * block_size, contents)));
-    return extent_t{bl};
+    return extent_t{extent_types_t::TEST_BLOCK, L_ADDR_NULL, bl};
   }
 
   delta_info_t generate_delta(size_t bytes) {