From: Samuel Just Date: Thu, 5 Nov 2020 23:11:35 +0000 (-0800) Subject: crimson/os/seastore/journal: record segment/record nonces based on seastore_id X-Git-Tag: v16.1.0~284^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2674d338e2db8f96c536b922df8ea07524620539;p=ceph.git crimson/os/seastore/journal: record segment/record nonces based on seastore_id Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 161b03409a56..0b1d420b794f 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -24,9 +24,20 @@ std::ostream &operator<<(std::ostream &out, const segment_header_t &header) << "segment_seq=" << header.journal_segment_seq << ", physical_segment_id=" << header.physical_segment_id << ", journal_tail=" << header.journal_tail + << ", segment_nonce=" << header.segment_nonce << ")"; } +segment_nonce_t generate_nonce( + segment_seq_t seq, + const seastore_meta_t &meta) +{ + return ceph_crc32c( + seq, + reinterpret_cast(meta.seastore_id.bytes()), + sizeof(meta.seastore_id.uuid)); +} + Journal::Journal(SegmentManager &segment_manager) : block_size(segment_manager.get_block_size()), max_record_length( @@ -47,11 +58,15 @@ Journal::initialize_segment(Segment &segment) // write out header ceph_assert(segment.get_write_ptr() == 0); bufferlist bl; + segment_seq_t seq = next_journal_segment_seq++; + current_segment_nonce = generate_nonce( + seq, segment_manager.get_meta()); auto header = segment_header_t{ seq, segment.get_segment_id(), - segment_provider->get_journal_tail_target()}; + segment_provider->get_journal_tail_target(), + current_segment_nonce}; encode(header, bl); bufferptr bp( @@ -83,7 +98,8 @@ ceph::bufferlist Journal::encode_record( rsize.dlength, 0 /* checksum, TODO */, record.deltas.size(), - record.extents.size() + record.extents.size(), + current_segment_nonce }; encode(header, metadatabl); for (const auto &i: record.extents) { diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index 5ca090ac4ee8..ee7bf9e9ea87 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -19,6 +19,9 @@ namespace crimson::os::seastore { +using segment_nonce_t = uint32_t; + + /** * Segment header * @@ -32,12 +35,14 @@ struct segment_header_t { segment_id_t physical_segment_id; // debugging journal_seq_t journal_tail; + segment_nonce_t segment_nonce; DENC(segment_header_t, v, p) { DENC_START(1, 1, p); denc(v.journal_segment_seq, p); denc(v.physical_segment_id, p); denc(v.journal_tail, p); + denc(v.segment_nonce, p); DENC_FINISH(p); } }; @@ -50,6 +55,7 @@ struct record_header_t { checksum_t full_checksum; // checksum for full record (TODO) size_t deltas; // number of deltas size_t extents; // number of extents + segment_nonce_t segment_nonce;// nonce of containing segment DENC(record_header_t, v, p) { DENC_START(1, 1, p); @@ -58,6 +64,7 @@ struct record_header_t { denc(v.full_checksum, p); denc(v.deltas, p); denc(v.extents, p); + denc(v.segment_nonce, p); DENC_FINISH(p); } }; @@ -223,6 +230,7 @@ private: SegmentManager &segment_manager; segment_seq_t next_journal_segment_seq = 0; + segment_nonce_t current_segment_nonce = 0; SegmentRef current_journal_segment; segment_off_t written_to = 0; diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index fd05767faf18..f9943d5fc875 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -19,7 +19,7 @@ using depth_le_t = ceph_les32; using checksum_t = uint32_t; -// Immutable metadata for seastore set a mkfs time +// Immutable metadata for seastore to set at mkfs time struct seastore_meta_t { uuid_d seastore_id;