@@ -44,7 +44,7 @@ Cache::Cache(
4444 " seastore_cache_lru_size" ))
4545{
4646 LOG_PREFIX (Cache::Cache);
47- INFO (" created, lru_size ={}" , lru.get_capacity ());
47+ INFO (" created, lru_capacity ={}B " , lru.get_capacity_bytes ());
4848 register_metrics ();
4949 segment_providers_by_device_id.resize (DEVICE_ID_MAX, nullptr );
5050}
@@ -97,8 +97,7 @@ Cache::retire_extent_ret Cache::retire_extent_addr(
9797 TRANS_ID_NULL);
9898 DEBUGT (" retire {}~{} as placeholder, add extent -- {}" ,
9999 t, addr, length, *ext);
100- const auto t_src = t.get_src ();
101- add_extent (ext, &t_src);
100+ add_extent (ext);
102101 }
103102 t.add_to_read_set (ext);
104103 t.add_to_retired_set (ext);
@@ -126,8 +125,7 @@ void Cache::retire_absent_extent_addr(
126125 TRANS_ID_NULL);
127126 DEBUGT (" retire {}~{} as placeholder, add extent -- {}" ,
128127 t, addr, length, *ext);
129- const auto t_src = t.get_src ();
130- add_extent (ext, &t_src);
128+ add_extent (ext);
131129 t.add_to_read_set (ext);
132130 t.add_to_retired_set (ext);
133131}
@@ -511,14 +509,14 @@ void Cache::register_metrics()
511509 sm::make_counter (
512510 " cache_lru_size_bytes" ,
513511 [this ] {
514- return lru.get_current_contents_bytes ();
512+ return lru.get_current_size_bytes ();
515513 },
516514 sm::description (" total bytes pinned by the lru" )
517515 ),
518516 sm::make_counter (
519- " cache_lru_size_extents " ,
517+ " cache_lru_num_extents " ,
520518 [this ] {
521- return lru.get_current_contents_extents ();
519+ return lru.get_current_num_extents ();
522520 },
523521 sm::description (" total extents pinned by the lru" )
524522 ),
@@ -727,19 +725,12 @@ void Cache::register_metrics()
727725 );
728726}
729727
730- void Cache::add_extent (
731- CachedExtentRef ref,
732- const Transaction::src_t * p_src=nullptr )
728+ void Cache::add_extent (CachedExtentRef ref)
733729{
734730 assert (ref->is_valid ());
735731 assert (ref->user_hint == PLACEMENT_HINT_NULL);
736732 assert (ref->rewrite_generation == NULL_GENERATION);
737733 extents.insert (*ref);
738- if (ref->is_dirty ()) {
739- add_to_dirty (ref);
740- } else {
741- touch_extent (*ref, p_src);
742- }
743734}
744735
745736void Cache::mark_dirty (CachedExtentRef ref)
@@ -766,14 +757,11 @@ void Cache::add_to_dirty(CachedExtentRef ref)
766757
767758void Cache::remove_from_dirty (CachedExtentRef ref)
768759{
769- if (ref->is_dirty ()) {
770- ceph_assert (ref->primary_ref_list_hook .is_linked ());
771- stats.dirty_bytes -= ref->get_length ();
772- dirty.erase (dirty.s_iterator_to (*ref));
773- intrusive_ptr_release (&*ref);
774- } else {
775- ceph_assert (!ref->primary_ref_list_hook .is_linked ());
776- }
760+ assert (ref->is_dirty ());
761+ ceph_assert (ref->primary_ref_list_hook .is_linked ());
762+ stats.dirty_bytes -= ref->get_length ();
763+ dirty.erase (dirty.s_iterator_to (*ref));
764+ intrusive_ptr_release (&*ref);
777765}
778766
779767void Cache::remove_extent (CachedExtentRef ref)
@@ -807,7 +795,7 @@ void Cache::commit_replace_extent(
807795 assert (next->version == prev->version + 1 );
808796 extents.replace (*next, *prev);
809797
810- if (prev->get_type () == extent_types_t ::ROOT ) {
798+ if (is_root_type ( prev->get_type ()) ) {
811799 assert (prev->is_stable_clean ()
812800 || prev->primary_ref_list_hook .is_linked ());
813801 if (prev->is_dirty ()) {
@@ -1093,7 +1081,7 @@ CachedExtentRef Cache::duplicate_for_write(
10931081 auto [iter, inserted] = i->mutation_pendings .insert (*ret);
10941082 ceph_assert (inserted);
10951083 t.add_mutated_extent (ret);
1096- if (ret->get_type () == extent_types_t ::ROOT ) {
1084+ if (is_root_type ( ret->get_type ()) ) {
10971085 t.root = ret->cast <RootBlock>();
10981086 } else {
10991087 ret->last_committed_crc = i->last_committed_crc ;
@@ -1187,7 +1175,7 @@ record_t Cache::prepare_record(
11871175
11881176 assert (i->get_version () > 0 );
11891177 auto final_crc = i->calc_crc32c ();
1190- if (i->get_type () == extent_types_t ::ROOT ) {
1178+ if (is_root_type ( i->get_type ()) ) {
11911179 SUBTRACET (seastore_t , " writing out root delta {}B -- {}" ,
11921180 t, delta_length, *i);
11931181 assert (t.root == i);
@@ -1255,8 +1243,8 @@ record_t Cache::prepare_record(
12551243 retire_stat.increment (extent->get_length ());
12561244 DEBUGT (" retired and remove extent -- {}" , t, *extent);
12571245 commit_retire_extent (t, extent);
1258- if (is_backref_mapped_extent_node (extent)
1259- || is_retired_placeholder (extent->get_type ())) {
1246+ if (is_backref_mapped_extent_node (extent) ||
1247+ is_retired_placeholder_type (extent->get_type ())) {
12601248 rel_delta.alloc_blk_ranges .emplace_back (
12611249 extent->get_paddr (),
12621250 L_ADDR_NULL,
@@ -1289,7 +1277,7 @@ record_t Cache::prepare_record(
12891277 i->prepare_write ();
12901278 i->prepare_commit ();
12911279 bl.append (i->get_bptr ());
1292- if (i->get_type () == extent_types_t ::ROOT ) {
1280+ if (is_root_type ( i->get_type ()) ) {
12931281 ceph_assert (0 == " ROOT never gets written as a fresh block" );
12941282 }
12951283
@@ -1354,7 +1342,7 @@ record_t Cache::prepare_record(
13541342 i->state = CachedExtent::extent_state_t ::CLEAN;
13551343 assert (i->is_logical ());
13561344 i->clear_modified_region ();
1357- touch_extent (*i);
1345+ touch_extent (*i, &trans_src );
13581346 DEBUGT (" inplace rewrite ool block is commmitted -- {}" , t, *i);
13591347 }
13601348
@@ -1576,9 +1564,11 @@ void Cache::complete_commit(
15761564 i->prior_instance .reset ();
15771565 DEBUGT (" add extent as fresh, inline={} -- {}" ,
15781566 t, is_inline, *i);
1579- const auto t_src = t.get_src ();
15801567 i->invalidate_hints ();
1581- add_extent (i, &t_src);
1568+ add_extent (i);
1569+ assert (!i->is_dirty ());
1570+ const auto t_src = t.get_src ();
1571+ touch_extent (*i, &t_src);
15821572 epm.commit_space_used (i->get_paddr (), i->get_length ());
15831573 if (is_backref_mapped_extent_node (i)) {
15841574 DEBUGT (" backref_list new {} len {}" ,
@@ -1619,7 +1609,7 @@ void Cache::complete_commit(
16191609 i->prior_instance = CachedExtentRef ();
16201610 i->state = CachedExtent::extent_state_t ::DIRTY;
16211611 assert (i->version > 0 );
1622- if (i->version == 1 || i->get_type () == extent_types_t ::ROOT ) {
1612+ if (i->version == 1 || is_root_type ( i->get_type ()) ) {
16231613 i->dirty_from_or_retired_at = start_seq;
16241614 DEBUGT (" commit extent done, become dirty -- {}" , t, *i);
16251615 } else {
@@ -1648,8 +1638,8 @@ void Cache::complete_commit(
16481638 for (auto &i: t.retired_set ) {
16491639 auto &extent = i.extent ;
16501640 extent->dirty_from_or_retired_at = start_seq;
1651- if (is_backref_mapped_extent_node (extent)
1652- || is_retired_placeholder (extent->get_type ())) {
1641+ if (is_backref_mapped_extent_node (extent) ||
1642+ is_retired_placeholder_type (extent->get_type ())) {
16531643 DEBUGT (" backref_list free {} len {}" ,
16541644 t,
16551645 extent->get_paddr (),
@@ -1694,8 +1684,13 @@ void Cache::complete_commit(
16941684 i->get_length (),
16951685 i->get_type (),
16961686 start_seq));
1697- const auto t_src = t.get_src ();
1698- add_extent (i, &t_src);
1687+ add_extent (i);
1688+ if (i->is_dirty ()) {
1689+ add_to_dirty (i);
1690+ } else {
1691+ const auto t_src = t.get_src ();
1692+ touch_extent (*i, &t_src);
1693+ }
16991694 }
17001695 }
17011696 if (!backref_list.empty ()) {
@@ -1752,8 +1747,8 @@ Cache::close_ertr::future<> Cache::close()
17521747 stats.dirty_bytes ,
17531748 get_oldest_dirty_from ().value_or (JOURNAL_SEQ_NULL),
17541749 get_oldest_backref_dirty_from ().value_or (JOURNAL_SEQ_NULL),
1755- lru.get_current_contents_extents (),
1756- lru.get_current_contents_bytes (),
1750+ lru.get_current_num_extents (),
1751+ lru.get_current_size_bytes (),
17571752 extents.size (),
17581753 extents.get_bytes ());
17591754 root.reset ();
@@ -1860,7 +1855,7 @@ Cache::replay_delta(
18601855 std::make_pair (false , nullptr ));
18611856 }
18621857
1863- if (delta.type == extent_types_t ::ROOT ) {
1858+ if (is_root_type ( delta.type ) ) {
18641859 TRACE (" replay root delta at {} {}, remove extent ... -- {}, prv_root={}" ,
18651860 journal_seq, record_base, delta, *root);
18661861 remove_extent (root);
@@ -1871,6 +1866,7 @@ Cache::replay_delta(
18711866 journal_seq, record_base, delta, *root);
18721867 root->set_modify_time (modify_time);
18731868 add_extent (root);
1869+ add_to_dirty (root);
18741870 return replay_delta_ertr::make_ready_future<std::pair<bool , CachedExtentRef>>(
18751871 std::make_pair (true , root));
18761872 } else {
@@ -1881,7 +1877,7 @@ Cache::replay_delta(
18811877 if (ret) {
18821878 // no retired-placeholder should be exist yet because no transaction
18831879 // has been created.
1884- assert (ret->get_type () != extent_types_t ::RETIRED_PLACEHOLDER );
1880+ assert (! is_retired_placeholder_type ( ret->get_type ()) );
18851881 return ret->wait_io ().then ([ret] {
18861882 return ret;
18871883 });
@@ -1898,7 +1894,9 @@ Cache::replay_delta(
18981894 delta.length ,
18991895 nullptr ,
19001896 [](CachedExtent &) {},
1901- [](CachedExtent &) {}) :
1897+ [this ](CachedExtent &ext) {
1898+ touch_extent (ext, nullptr );
1899+ }) :
19021900 _get_extent_if_cached (
19031901 delta.paddr )
19041902 ).handle_error (
@@ -2009,7 +2007,7 @@ Cache::get_next_dirty_extents_ret Cache::get_next_dirty_extents(
20092007 if (result == Transaction::get_extent_ret::ABSENT) {
20102008 DEBUGT (" extent is absent on t -- {}" , t, *ext);
20112009 t.add_to_read_set (ext);
2012- if (ext->get_type () == extent_types_t ::ROOT ) {
2010+ if (is_root_type ( ext->get_type ()) ) {
20132011 if (t.root ) {
20142012 assert (&*t.root == &*ext);
20152013 ceph_assert (0 == " t.root would have to already be in the read set" );
@@ -2161,4 +2159,110 @@ Cache::do_get_caching_extent_by_type(
21612159 });
21622160}
21632161
2162+ cache_stats_t Cache::get_stats (
2163+ bool report_detail, double seconds) const
2164+ {
2165+ cache_stats_t ret;
2166+ lru.get_stats (ret, report_detail, seconds);
2167+ return ret;
2168+ }
2169+
2170+ void Cache::LRU::get_stats (
2171+ cache_stats_t &stats,
2172+ bool report_detail,
2173+ double seconds) const
2174+ {
2175+ LOG_PREFIX (Cache::LRU::get_stats);
2176+
2177+ stats.lru_sizes = cache_size_stats_t {current_size, lru.size ()};
2178+ stats.lru_io = overall_io;
2179+ stats.lru_io .minus (last_overall_io);
2180+
2181+ if (report_detail && seconds != 0 ) {
2182+ cache_io_stats_t _trans_io = trans_io;
2183+ _trans_io.minus (last_trans_io);
2184+
2185+ cache_io_stats_t other_io = stats.lru_io ;
2186+ other_io.minus (_trans_io);
2187+
2188+ counter_by_src_t <counter_by_extent_t <cache_io_stats_t > >
2189+ _trans_io_by_src_ext = trans_io_by_src_ext;
2190+ counter_by_src_t <cache_io_stats_t > trans_io_by_src;
2191+ for (uint8_t _src=0 ; _src<TRANSACTION_TYPE_MAX; ++_src) {
2192+ auto src = static_cast <transaction_type_t >(_src);
2193+ auto & io_by_ext = get_by_src (_trans_io_by_src_ext, src);
2194+ const auto & last_io_by_ext = get_by_src (last_trans_io_by_src_ext, src);
2195+ auto & trans_io_per_src = get_by_src (trans_io_by_src, src);
2196+ for (uint8_t _ext=0 ; _ext<EXTENT_TYPES_MAX; ++_ext) {
2197+ auto ext = static_cast <extent_types_t >(_ext);
2198+ auto & extent_io = get_by_ext (io_by_ext, ext);
2199+ const auto & last_extent_io = get_by_ext (last_io_by_ext, ext);
2200+ extent_io.minus (last_extent_io);
2201+ trans_io_per_src.add (extent_io);
2202+ }
2203+ }
2204+
2205+ std::ostringstream oss;
2206+ oss << " \n lru total" << stats.lru_sizes ;
2207+ cache_size_stats_t data_sizes;
2208+ cache_size_stats_t mdat_sizes;
2209+ cache_size_stats_t phys_sizes;
2210+ for (uint8_t _ext=0 ; _ext<EXTENT_TYPES_MAX; ++_ext) {
2211+ auto ext = static_cast <extent_types_t >(_ext);
2212+ const auto extent_sizes = get_by_ext (sizes_by_ext, ext);
2213+ if (is_data_type (ext)) {
2214+ data_sizes.add (extent_sizes);
2215+ } else if (is_logical_metadata_type (ext)) {
2216+ mdat_sizes.add (extent_sizes);
2217+ } else if (is_physical_type (ext)) {
2218+ phys_sizes.add (extent_sizes);
2219+ }
2220+ }
2221+ oss << " \n data" << data_sizes
2222+ << " \n mdat" << mdat_sizes
2223+ << " \n phys" << phys_sizes;
2224+
2225+ oss << " \n lru io: trans-"
2226+ << cache_io_stats_printer_t {seconds, _trans_io}
2227+ << " ; other-"
2228+ << cache_io_stats_printer_t {seconds, other_io};
2229+ for (uint8_t _src=0 ; _src<TRANSACTION_TYPE_MAX; ++_src) {
2230+ auto src = static_cast <transaction_type_t >(_src);
2231+ const auto & trans_io_per_src = get_by_src (trans_io_by_src, src);
2232+ if (trans_io_per_src.is_empty ()) {
2233+ continue ;
2234+ }
2235+ cache_io_stats_t data_io;
2236+ cache_io_stats_t mdat_io;
2237+ cache_io_stats_t phys_io;
2238+ const auto & io_by_ext = get_by_src (_trans_io_by_src_ext, src);
2239+ for (uint8_t _ext=0 ; _ext<EXTENT_TYPES_MAX; ++_ext) {
2240+ auto ext = static_cast <extent_types_t >(_ext);
2241+ const auto extent_io = get_by_ext (io_by_ext, ext);
2242+ if (is_data_type (ext)) {
2243+ data_io.add (extent_io);
2244+ } else if (is_logical_metadata_type (ext)) {
2245+ mdat_io.add (extent_io);
2246+ } else if (is_physical_type (ext)) {
2247+ phys_io.add (extent_io);
2248+ }
2249+ }
2250+ oss << " \n " << src << " : "
2251+ << cache_io_stats_printer_t {seconds, trans_io_per_src}
2252+ << " \n data: "
2253+ << cache_io_stats_printer_t {seconds, data_io}
2254+ << " \n mdat: "
2255+ << cache_io_stats_printer_t {seconds, mdat_io}
2256+ << " \n phys: "
2257+ << cache_io_stats_printer_t {seconds, phys_io};
2258+ }
2259+
2260+ INFO (" {}" , oss.str ());
2261+ }
2262+
2263+ last_overall_io = overall_io;
2264+ last_trans_io = trans_io;
2265+ last_trans_io_by_src_ext = trans_io_by_src_ext;
2266+ }
2267+
21642268}
0 commit comments