From 1f8199f7f54d996998a5856d90c369facf6c4514 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 3 Sep 2020 21:17:52 -0700 Subject: [PATCH] crimson/os/seastore/journal: record extents types and laddr in record metadata We'll need this to scan segments for live blocks. Signed-off-by: Samuel Just --- src/crimson/os/seastore/cache.cc | 10 +++++++++- src/crimson/os/seastore/journal.cc | 6 ++++++ src/crimson/os/seastore/journal.h | 19 +++++++++++++++++++ src/crimson/os/seastore/seastore_types.h | 2 ++ .../crimson/seastore/test_seastore_journal.cc | 2 +- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 2fb51bd018314..90fc253e40ef6 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -248,7 +248,15 @@ std::optional 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()->get_laddr() + : L_ADDR_NULL, + std::move(bl) + }); } return std::make_optional(std::move(record)); diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 8bdadaa21f525..1489919b6c3bc 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -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(); + metadata += record.extents.size() * + ceph::encoded_sizeof_bounded(); extent_len_t data = 0; for (const auto &i: record.deltas) { metadata += ceph::encoded_sizeof(i); @@ -321,6 +326,7 @@ std::optional> Journal::try_decode_deltas( { auto bliter = bl.cbegin(); bliter += ceph::encoded_sizeof_bounded(); + bliter += header.extents * ceph::encoded_sizeof_bounded(); logger().debug("{}: decoding {} deltas", __func__, header.deltas); std::vector deltas(header.deltas); for (auto &&i : deltas) { diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index 83234fc8c4466..f1bdaff3a2b0e 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -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) diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index a17e47aac5ab8..fa556e2e3525b 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -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 }; diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index 3be26fd5c0431..197ff4cfcf4e1 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -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) { -- 2.39.5