@@ -45,46 +45,55 @@ StorageSystemFilesystemCache::StorageSystemFilesystemCache(const StorageID & tab
4545
4646void StorageSystemFilesystemCache::fillData (MutableColumns & res_columns, ContextPtr, const ActionsDAG::Node *, std::vector<UInt8>) const
4747{
48- auto caches = FileCacheFactory::instance ().getAll ();
48+ auto caches_by_name = FileCacheFactory::instance ().getAll ();
49+ std::unordered_set<FileCacheFactory::FileCacheDataPtr> caches;
50+ for (const auto & [_, cache_data] : caches_by_name)
51+ caches.insert (cache_data);
52+ std::unordered_map<FileCacheFactory::FileCacheDataPtr, std::vector<std::string>> caches_by_instance;
53+ for (const auto & [cache_name, cache_data] : caches_by_name)
54+ caches_by_instance[cache_data].push_back (cache_name);
4955
50- for (const auto & [cache_name, cache_data] : caches)
56+ for (const auto & cache_data : caches)
5157 {
5258 const auto & cache = cache_data->cache ;
5359 if (!cache->isInitialized ())
5460 continue ;
5561
5662 cache->iterate([&](const FileSegment::Info & file_segment)
5763 {
58- size_t i = 0 ;
59- res_columns[i++]->insert (cache_name);
60- res_columns[i++]->insert (cache->getBasePath ());
64+ for (const auto & cache_name : caches_by_instance.at (cache_data))
65+ {
66+ size_t i = 0 ;
67+ res_columns[i++]->insert (cache_name);
68+ res_columns[i++]->insert (cache->getBasePath ());
6169
62- // / Do not use `file_segment->getPath` here because it will lead to nullptr dereference
63- // / (because file_segments in getSnapshot doesn't have `cache` field set)
70+ // / Do not use `file_segment->getPath` here because it will lead to nullptr dereference
71+ // / (because file_segments in getSnapshot doesn't have `cache` field set)
6472
65- const auto path = cache->getFileSegmentPath (
66- file_segment.key , file_segment.offset , file_segment.kind ,
67- FileCache::UserInfo (file_segment.user_id , file_segment.user_weight ));
68- res_columns[i++]->insert (path);
69- res_columns[i++]->insert (file_segment.key .toString ());
70- res_columns[i++]->insert (file_segment.range_left );
71- res_columns[i++]->insert (file_segment.range_right );
72- res_columns[i++]->insert (file_segment.size );
73- res_columns[i++]->insert (FileSegment::stateToString (file_segment.state ));
74- res_columns[i++]->insert (file_segment.download_finished_time );
75- res_columns[i++]->insert (file_segment.cache_hits );
76- res_columns[i++]->insert (file_segment.references );
77- res_columns[i++]->insert (file_segment.downloaded_size );
78- res_columns[i++]->insert (toString (file_segment.kind ));
79- res_columns[i++]->insert (file_segment.is_unbound );
80- res_columns[i++]->insert (file_segment.user_id );
73+ const auto path = cache->getFileSegmentPath (
74+ file_segment.key , file_segment.offset , file_segment.kind ,
75+ FileCache::UserInfo (file_segment.user_id , file_segment.user_weight ));
76+ res_columns[i++]->insert (path);
77+ res_columns[i++]->insert (file_segment.key .toString ());
78+ res_columns[i++]->insert (file_segment.range_left );
79+ res_columns[i++]->insert (file_segment.range_right );
80+ res_columns[i++]->insert (file_segment.size );
81+ res_columns[i++]->insert (FileSegment::stateToString (file_segment.state ));
82+ res_columns[i++]->insert (file_segment.download_finished_time );
83+ res_columns[i++]->insert (file_segment.cache_hits );
84+ res_columns[i++]->insert (file_segment.references );
85+ res_columns[i++]->insert (file_segment.downloaded_size );
86+ res_columns[i++]->insert (toString (file_segment.kind ));
87+ res_columns[i++]->insert (file_segment.is_unbound );
88+ res_columns[i++]->insert (file_segment.user_id );
8189
82- std::error_code ec;
83- auto size = fs::file_size (path, ec);
84- if (!ec)
85- res_columns[i++]->insert (size);
86- else
87- res_columns[i++]->insertDefault ();
90+ std::error_code ec;
91+ auto size = fs::file_size (path, ec);
92+ if (!ec)
93+ res_columns[i++]->insert (size);
94+ else
95+ res_columns[i++]->insertDefault ();
96+ }
8897 }, FileCache::getCommonUser ().user_id );
8998 }
9099}
0 commit comments