From: Samuel Just Date: Mon, 15 Jun 2020 20:32:35 +0000 (-0700) Subject: crimson/os/seastore/cache: replay deltas X-Git-Tag: v16.1.0~1882^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=97222be2ef3192db371b18b0434395af487a4ffd;p=ceph.git crimson/os/seastore/cache: replay deltas Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index e5ab31c204cc..2b5790aa58c5 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index e3495961b1a3..13a34a746a30 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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);