diff --git a/include/dwarfs/writer/internal/metadata_freezer.h b/include/dwarfs/writer/internal/metadata_freezer.h index e6eef674..a20ad9c8 100644 --- a/include/dwarfs/writer/internal/metadata_freezer.h +++ b/include/dwarfs/writer/internal/metadata_freezer.h @@ -24,12 +24,15 @@ #pragma once #include +#include #include #include namespace dwarfs { +class logger; + namespace thrift::metadata { class metadata; } @@ -38,8 +41,24 @@ namespace writer::internal { class metadata_freezer { public: - static std::pair - freeze(thrift::metadata::metadata const& data); + metadata_freezer(logger& lgr); + ~metadata_freezer(); + + std::pair + freeze(thrift::metadata::metadata const& data) const { + return impl_->freeze(data); + } + + class impl { + public: + virtual ~impl() = default; + + virtual std::pair + freeze(thrift::metadata::metadata const& data) const = 0; + }; + + private: + std::unique_ptr impl_; }; } // namespace writer::internal diff --git a/src/writer/internal/metadata_freezer.cpp b/src/writer/internal/metadata_freezer.cpp index c761672d..a1adeb3c 100644 --- a/src/writer/internal/metadata_freezer.cpp +++ b/src/writer/internal/metadata_freezer.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -60,11 +61,33 @@ std::pair freeze_to_buffer(T const& x) { return {schema_buffer.share(), data_buffer.share()}; } +template +class metadata_freezer_ : public metadata_freezer::impl { + public: + explicit metadata_freezer_(logger& lgr) + : LOG_PROXY_INIT(lgr) {} + + std::pair + freeze(thrift::metadata::metadata const& data) const override { + auto ti = LOG_TIMED_VERBOSE; + auto rv = freeze_to_buffer(data); + + ti << "freezing metadata to " << rv.second.size() << " bytes..."; + + return rv; + } + + private: + LOG_PROXY_DECL(LoggerPolicy); +}; + } // namespace -std::pair -metadata_freezer::freeze(thrift::metadata::metadata const& data) { - return freeze_to_buffer(data); -} +metadata_freezer::metadata_freezer(logger& lgr) + : impl_{ + make_unique_logging_object( + lgr)} {} + +metadata_freezer::~metadata_freezer() = default; } // namespace dwarfs::writer::internal diff --git a/src/writer/scanner.cpp b/src/writer/scanner.cpp index 18496c12..0a58e5ae 100644 --- a/src/writer/scanner.cpp +++ b/src/writer/scanner.cpp @@ -949,7 +949,7 @@ void scanner_::scan( mdb.set_total_hardlink_size(prog.hardlink_size); mdb.gather_global_entry_data(ge_data); - auto [schema, data] = metadata_freezer::freeze(mdb.build()); + auto [schema, data] = metadata_freezer(LOG_GET_LOGGER).freeze(mdb.build()); LOG_VERBOSE << "uncompressed metadata size: " << size_with_unit(data.size());