]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/journal: record segment/record nonces based on seastore_id
authorSamuel Just <sjust@redhat.com>
Thu, 5 Nov 2020 23:11:35 +0000 (15:11 -0800)
committerSamuel Just <sjust@redhat.com>
Fri, 11 Dec 2020 21:31:39 +0000 (13:31 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h
src/crimson/os/seastore/seastore_types.h

index 161b03409a563bdb4144d014417e9b35ce5eba51..0b1d420b794fcbc524cc86846fb31d4013b6babf 100644 (file)
@@ -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<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(
@@ -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) {
index 5ca090ac4ee8deb04232770228eb64751195113e..ee7bf9e9ea87fc20f0ea85dd4839e73646a8ef65 100644 (file)
@@ -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;
index fd05767faf18b14cb4d7f84ddc9b9b3184d5941c..f9943d5fc8752033ba5b6ebe800d094291821061 100644 (file)
@@ -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;