From: Xuehan Xu Date: Fri, 13 Aug 2021 13:51:10 +0000 (+0800) Subject: crimson/os/seastore: set root block to clean at the initialization phase X-Git-Tag: v17.1.0~919^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b2a0e10b05ca3e2f29ea2bb6ad2971dc72bed58a;p=ceph.git crimson/os/seastore: set root block to clean at the initialization phase Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 18905214a4cc..f095982adeb8 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -593,11 +593,13 @@ void Cache::replace_extent(CachedExtentRef next, CachedExtentRef prev) extents.replace(*next, *prev); if (prev->get_type() == extent_types_t::ROOT) { - assert(prev->primary_ref_list_hook.is_linked()); - assert(prev->is_dirty()); - stats.dirty_bytes -= prev->get_length(); - dirty.erase(dirty.s_iterator_to(*prev)); - intrusive_ptr_release(&*prev); + assert(prev->is_clean() + || prev->primary_ref_list_hook.is_linked()); + if (prev->is_dirty()) { + stats.dirty_bytes -= prev->get_length(); + dirty.erase(dirty.s_iterator_to(*prev)); + intrusive_ptr_release(&*prev); + } add_to_dirty(next); } else if (prev->is_dirty()) { assert(prev->get_dirty_from() == next->get_dirty_from()); @@ -980,7 +982,7 @@ void Cache::init() { root = nullptr; } root = new RootBlock(); - root->state = CachedExtent::extent_state_t::DIRTY; + root->state = CachedExtent::extent_state_t::CLEAN; add_extent(root); } @@ -1022,6 +1024,7 @@ Cache::replay_delta( remove_extent(root); root->apply_delta_and_adjust_crc(record_base, delta.bl); root->dirty_from_or_retired_at = journal_seq; + root->state = CachedExtent::extent_state_t::DIRTY; add_extent(root); return replay_delta_ertr::now(); } else { diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index d808a7d7bc1b..a265c601e0fa 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -496,6 +496,9 @@ public: Transaction &t, F &&f) { + // journal replay should has been finished at this point, + // Cache::root should have been inserted to the dirty list + assert(root->is_dirty()); std::vector dirty; for (auto &e : extents) { dirty.push_back(CachedExtentRef(&e));