refactor(filesystem_v2): really avoid dependency on history

This commit is contained in:
Marcus Holland-Moritz 2025-04-13 23:05:56 +02:00
parent 7b78074ce7
commit 5cc6da0bda
3 changed files with 51 additions and 26 deletions

View File

@ -51,7 +51,9 @@ class history;
class history { class history {
public: public:
explicit history(history_config const& cfg = {}); explicit history(history_config const& cfg = {});
~history(); history(history&&) noexcept;
history& operator=(history&&) noexcept;
~history() noexcept;
void parse(std::span<uint8_t const> data); void parse(std::span<uint8_t const> data);
void parse_append(std::span<uint8_t const> data); void parse_append(std::span<uint8_t const> data);
@ -64,7 +66,7 @@ class history {
private: private:
std::unique_ptr<thrift::history::history> history_; std::unique_ptr<thrift::history::history> history_;
history_config const cfg_; history_config cfg_;
}; };
} // namespace dwarfs } // namespace dwarfs

View File

@ -47,7 +47,9 @@ history::history(history_config const& cfg)
: history_{std::make_unique<thrift::history::history>()} : history_{std::make_unique<thrift::history::history>()}
, cfg_{cfg} {} , cfg_{cfg} {}
history::~history() = default; history::history(history&&) noexcept = default;
history::~history() noexcept = default;
history& history::operator=(history&&) noexcept = default;
void history::parse(std::span<uint8_t const> data) { void history::parse(std::span<uint8_t const> data) {
history_->entries()->clear(); history_->entries()->clear();

View File

@ -212,9 +212,11 @@ class filesystem_ final {
std::shared_ptr<performance_monitor const> const& perfmon); std::shared_ptr<performance_monitor const> const& perfmon);
int check(filesystem_check_level level, size_t num_threads) const; int check(filesystem_check_level level, size_t num_threads) const;
void dump(std::ostream& os, fsinfo_options const& opts) const; void
std::string dump(fsinfo_options const& opts) const; dump(std::ostream& os, fsinfo_options const& opts, history const& hist) const;
nlohmann::json info_as_json(fsinfo_options const& opts) const; std::string dump(fsinfo_options const& opts, history const& hist) const;
nlohmann::json
info_as_json(fsinfo_options const& opts, history const& hist) const;
nlohmann::json metadata_as_json() const; nlohmann::json metadata_as_json() const;
std::string serialize_metadata_as_json(bool simple) const; std::string serialize_metadata_as_json(bool simple) const;
void walk(std::function<void(dir_entry_view)> const& func) const; void walk(std::function<void(dir_entry_view)> const& func) const;
@ -280,7 +282,7 @@ class filesystem_ final {
} }
size_t num_blocks() const { return ir_.num_blocks(); } size_t num_blocks() const { return ir_.num_blocks(); }
bool has_symlinks() const { return meta_.has_symlinks(); } bool has_symlinks() const { return meta_.has_symlinks(); }
history const& get_history() const { return history_; } history get_history() const;
nlohmann::json get_inode_info(inode_view entry) const { nlohmann::json get_inode_info(inode_view entry) const {
return meta_.get_inode_info(std::move(entry), return meta_.get_inode_info(std::move(entry),
std::numeric_limits<size_t>::max()); std::numeric_limits<size_t>::max());
@ -362,7 +364,7 @@ class filesystem_ final {
mutable block_access_level fsinfo_block_access_level_{ mutable block_access_level fsinfo_block_access_level_{
block_access_level::no_access}; block_access_level::no_access};
mutable std::unique_ptr<filesystem_info const> fsinfo_; mutable std::unique_ptr<filesystem_info const> fsinfo_;
history history_; std::vector<fs_section> history_sections_;
file_off_t const image_offset_; file_off_t const image_offset_;
filesystem_options const options_; filesystem_options const options_;
PERFMON_CLS_PROXY_DECL PERFMON_CLS_PROXY_DECL
@ -458,7 +460,6 @@ filesystem_<LoggerPolicy>::filesystem_(
: LOG_PROXY_INIT(lgr) : LOG_PROXY_INIT(lgr)
, os_{os} , os_{os}
, mm_{std::move(mm)} , mm_{std::move(mm)}
, history_({.with_timestamps = true})
, image_offset_{filesystem_parser::find_image_offset(*mm_, , image_offset_{filesystem_parser::find_image_offset(*mm_,
options.image_offset)} options.image_offset)}
, options_{options} // clang-format off , options_{options} // clang-format off
@ -542,13 +543,22 @@ filesystem_<LoggerPolicy>::filesystem_(
ir_ = inode_reader_v2(lgr, std::move(cache), options.inode_reader, perfmon); ir_ = inode_reader_v2(lgr, std::move(cache), options.inode_reader, perfmon);
if (auto it = sections.find(section_type::HISTORY); it != sections.end()) { if (auto it = sections.find(section_type::HISTORY); it != sections.end()) {
for (auto& section : it->second) { history_sections_ = std::move(it->second);
}
}
template <typename LoggerPolicy>
history filesystem_<LoggerPolicy>::get_history() const {
history hist({.with_timestamps = true});
for (auto& section : history_sections_) {
if (section.check_fast(*mm_)) { if (section.check_fast(*mm_)) {
auto buffer = get_section_data(mm_, section); auto buffer = get_section_data(mm_, section);
history_.parse_append(buffer.span()); hist.parse_append(buffer.span());
}
} }
} }
return hist;
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
@ -618,7 +628,8 @@ int filesystem_<LoggerPolicy>::check(filesystem_check_level level,
template <typename LoggerPolicy> template <typename LoggerPolicy>
void filesystem_<LoggerPolicy>::dump(std::ostream& os, void filesystem_<LoggerPolicy>::dump(std::ostream& os,
fsinfo_options const& opts) const { fsinfo_options const& opts,
history const& hist) const {
auto parser = make_fs_parser(); auto parser = make_fs_parser();
if (opts.features.has(fsinfo_feature::version)) { if (opts.features.has(fsinfo_feature::version)) {
@ -670,7 +681,7 @@ void filesystem_<LoggerPolicy>::dump(std::ostream& os,
} }
if (opts.features.has(fsinfo_feature::history)) { if (opts.features.has(fsinfo_feature::history)) {
history_.dump(os); hist.dump(os);
} }
metadata_v2_utils(meta_).dump( metadata_v2_utils(meta_).dump(
@ -688,15 +699,17 @@ void filesystem_<LoggerPolicy>::dump(std::ostream& os,
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
std::string filesystem_<LoggerPolicy>::dump(fsinfo_options const& opts) const { std::string filesystem_<LoggerPolicy>::dump(fsinfo_options const& opts,
history const& hist) const {
std::ostringstream oss; std::ostringstream oss;
dump(oss, opts); dump(oss, opts, hist);
return oss.str(); return oss.str();
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
nlohmann::json nlohmann::json
filesystem_<LoggerPolicy>::info_as_json(fsinfo_options const& opts) const { filesystem_<LoggerPolicy>::info_as_json(fsinfo_options const& opts,
history const& hist) const {
auto parser = make_fs_parser(); auto parser = make_fs_parser();
auto info = nlohmann::json::object(); auto info = nlohmann::json::object();
@ -711,7 +724,7 @@ filesystem_<LoggerPolicy>::info_as_json(fsinfo_options const& opts) const {
} }
if (opts.features.has(fsinfo_feature::history)) { if (opts.features.has(fsinfo_feature::history)) {
info["history"] = history_.as_json(); info["history"] = hist.as_json();
} }
if (opts.features.has(fsinfo_feature::section_details)) { if (opts.features.has(fsinfo_feature::section_details)) {
@ -1310,21 +1323,26 @@ template <typename LoggerPolicy>
class filesystem_full_ class filesystem_full_
: public filesystem_common_<LoggerPolicy, filesystem_v2::impl> { : public filesystem_common_<LoggerPolicy, filesystem_v2::impl> {
public: public:
using filesystem_common_<LoggerPolicy,
filesystem_v2::impl>::filesystem_common_;
using filesystem_common_<LoggerPolicy, filesystem_v2::impl>::fs; using filesystem_common_<LoggerPolicy, filesystem_v2::impl>::fs;
filesystem_full_(logger& lgr, os_access const& os, std::shared_ptr<mmif> mm,
filesystem_options const& options,
std::shared_ptr<performance_monitor const> const& perfmon)
: filesystem_common_<LoggerPolicy, filesystem_v2::impl>(
lgr, os, std::move(mm), options, perfmon)
, history_{fs().get_history()} {}
int check(filesystem_check_level level, size_t num_threads) const override { int check(filesystem_check_level level, size_t num_threads) const override {
return fs().check(level, num_threads); return fs().check(level, num_threads);
} }
void dump(std::ostream& os, fsinfo_options const& opts) const override { void dump(std::ostream& os, fsinfo_options const& opts) const override {
fs().dump(os, opts); fs().dump(os, opts, history_);
} }
std::string dump(fsinfo_options const& opts) const override { std::string dump(fsinfo_options const& opts) const override {
return fs().dump(opts); return fs().dump(opts, history_);
} }
nlohmann::json info_as_json(fsinfo_options const& opts) const override { nlohmann::json info_as_json(fsinfo_options const& opts) const override {
return fs().info_as_json(opts); return fs().info_as_json(opts, history_);
} }
nlohmann::json metadata_as_json() const override { nlohmann::json metadata_as_json() const override {
return fs().metadata_as_json(); return fs().metadata_as_json();
@ -1335,7 +1353,10 @@ class filesystem_full_
std::optional<std::span<uint8_t const>> header() const override { std::optional<std::span<uint8_t const>> header() const override {
return fs().header(); return fs().header();
} }
history const& get_history() const override { return fs().get_history(); } history const& get_history() const override { return history_; }
private:
history history_;
}; };
} // namespace internal } // namespace internal