]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: replay deltas
authorSamuel Just <sjust@redhat.com>
Mon, 15 Jun 2020 20:32:35 +0000 (13:32 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 19 Jun 2020 19:59:26 +0000 (12:59 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h

index e5ab31c204cc384fb757a2b2fbaff88802dabbf5..2b5790aa58c54fb145d1c153126e61d3cd2fbacc 100644 (file)
@@ -38,6 +38,22 @@ void Cache::add_extent(CachedExtentRef ref)
   logger().debug("add_extent: {}", *ref);
 }
 
+void Cache::mark_dirty(CachedExtentRef ref)
+{
+  if (ref->is_dirty()) {
+    assert(ref->primary_ref_list_hook.is_linked());
+    return;
+  }
+
+  assert(ref->is_valid());
+  assert(!ref->primary_ref_list_hook.is_linked());
+  intrusive_ptr_add_ref(&*ref);
+  dirty.push_back(*ref);
+  ref->state = CachedExtent::extent_state_t::DIRTY;
+
+  logger().debug("mark_dirty: {}", *ref);
+}
+
 void Cache::retire_extent(CachedExtentRef ref)
 {
   logger().debug("retire_extent: {}", *ref);
@@ -212,8 +228,26 @@ Cache::replay_delta(paddr_t record_base, const delta_info_t &delta)
       return replay_delta_ret(replay_delta_ertr::ready_future_marker{});
     });
   }
-  // TODO
-  return replay_delta_ret(replay_delta_ertr::ready_future_marker{});
+
+  return get_extent_by_type(
+    delta.type,
+    delta.paddr,
+    delta.length).safe_then([this, record_base, delta](auto extent) {
+      /* TODO asserts about version */
+      logger().debug(
+       "replay_delta: replaying {} on {}",
+       *extent,
+       delta);
+
+      assert(extent->version == delta.pversion);
+
+      assert(extent->last_committed_crc == delta.prev_crc);
+      extent->apply_delta_and_adjust_crc(record_base, delta.bl);
+      assert(extent->last_committed_crc == delta.final_crc);
+
+      extent->version++;
+      mark_dirty(extent);
+    });
 }
 
 Cache::get_root_ret Cache::get_root(Transaction &t)
index e3495961b1a38735f0be08e56046d1368a84e56e..13a34a746a303f27f84709beaaf43a6093ceee1b 100644 (file)
@@ -385,6 +385,9 @@ private:
   /// Add extent to extents handling dirty and refcounting
   void add_extent(CachedExtentRef ref);
 
+  /// Mark exising extent ref dirty -- mainly for replay
+  void mark_dirty(CachedExtentRef ref);
+
   /// Remove extent from extents handling dirty and refcounting
   void retire_extent(CachedExtentRef ref);