<< "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<const unsigned char *>(meta.seastore_id.bytes()),
+ sizeof(meta.seastore_id.uuid));
+}
+
Journal::Journal(SegmentManager &segment_manager)
: block_size(segment_manager.get_block_size()),
max_record_length(
// 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(
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) {
namespace crimson::os::seastore {
+using segment_nonce_t = uint32_t;
+
+
/**
* Segment header
*
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);
}
};
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);
denc(v.full_checksum, p);
denc(v.deltas, p);
denc(v.extents, p);
+ denc(v.segment_nonce, p);
DENC_FINISH(p);
}
};
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;
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;