From ac2c8083de2d05f59a90cdcf4df8f81add51f12e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 3 May 2016 16:21:48 -0400 Subject: [PATCH] os/bluestore: keep an extent_ref_map for each blob This lets us track which portions of a blob are still in use. In some cases, we may be able to split the blob to deallocate a portion of it. In other cases, we will want this information to know whether to recompress the blob (or whatever). Signed-off-by: Sage Weil --- src/os/bluestore/bluestore_types.cc | 9 ++++++++- src/os/bluestore/bluestore_types.h | 7 +++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index ea73b8ba83d2d..8907f8148fb30 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -425,6 +425,7 @@ void bluestore_blob_t::encode(bufferlist& bl) const ::encode(csum_type, bl); ::encode(csum_block_order, bl); ::encode(num_refs, bl); + ::encode(ref_map, bl); ::encode(csum_data, bl); ENCODE_FINISH(bl); } @@ -438,6 +439,7 @@ void bluestore_blob_t::decode(bufferlist::iterator& p) ::decode(csum_type, p); ::decode(csum_block_order, p); ::decode(num_refs, p); + ::decode(ref_map, p); ::decode(csum_data, p); DECODE_FINISH(p); } @@ -454,6 +456,7 @@ void bluestore_blob_t::dump(Formatter *f) const f->dump_unsigned("csum_type", csum_type); f->dump_unsigned("csum_block_order", csum_block_order); f->dump_unsigned("num_refs", num_refs); + f->dump_object("ref_map", ref_map); f->open_array_section("csum_data"); size_t n = get_csum_count(); for (unsigned i = 0; i < n; ++i) @@ -469,19 +472,23 @@ void bluestore_blob_t::generate_test_instances(list& ls) ls.push_back(new bluestore_blob_t(4096, bluestore_pextent_t(111, 222), 12)); ls.back()->csum_type = CSUM_XXHASH32; ls.back()->csum_block_order = 16; - ls.back()->num_refs = 2; ls.back()->csum_data = vector{1, 2, 3, 4}; // one uint32_t + ls.back()->num_refs = 3; } ostream& operator<<(ostream& out, const bluestore_blob_t& o) { out << "blob(" << o.extents << " len " << o.length + << " nref " << o.num_refs << " " << o.get_flags_string(); if (o.csum_type) { out << " csum " << o.get_csum_type_string(o.csum_type) << " order " << (int)o.csum_block_order; } + if (!o.ref_map.empty()) { + out << " ref_map " << o.ref_map; + } out << ")"; return out; } diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index 800c691ed3d8f..a1cfe39a8381c 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -238,7 +238,8 @@ struct bluestore_blob_t { uint8_t csum_type; ///< CSUM_* uint8_t csum_block_order; ///< csum block size is 1< csum_data; ///< opaque vector of csum data bluestore_blob_t(uint32_t l = 0, uint32_t f = 0) @@ -246,7 +247,8 @@ struct bluestore_blob_t { flags(f), csum_type(CSUM_NONE), csum_block_order(12), - num_refs(1) {} + num_refs(1) { + } bluestore_blob_t(uint32_t l, const bluestore_pextent_t& ext, uint32_t f = 0) : length(l), @@ -381,6 +383,7 @@ ostream& operator<<(ostream& out, const bluestore_blob_t& o); /// blob id: positive = local, negative = shared bnode typedef int64_t bluestore_blob_id_t; + /// lextent: logical data block back by the extent struct bluestore_lextent_t { static string get_flags_string(unsigned flags); -- 2.39.5