From 4d95e83d990bebc3dd61e79d6d54530eac5a7a4c Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Thu, 22 Jul 2021 20:53:44 +0200 Subject: [PATCH] Refactor printing of compression statistics --- src/ccache.cpp | 44 ++++++++++++++- src/storage/primary/PrimaryStorage.hpp | 13 ++++- .../primary/PrimaryStorage_compress.cpp | 53 ++++--------------- 3 files changed, 63 insertions(+), 47 deletions(-) diff --git a/src/ccache.cpp b/src/ccache.cpp index f5e4b19d3..08d266972 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -1943,6 +1943,41 @@ log_result_to_stats_log(Context& ctx) .log_result(ctx.args_info.input_file, *result_id); } +static void +print_compression_statistics(const storage::primary::CompressionStatistics& cs) +{ + const double ratio = cs.compr_size > 0 + ? static_cast(cs.content_size) / cs.compr_size + : 0.0; + const double savings = ratio > 0.0 ? 100.0 - (100.0 / ratio) : 0.0; + + const std::string on_disk_size_str = + Util::format_human_readable_size(cs.on_disk_size); + const std::string cache_size_str = + Util::format_human_readable_size(cs.compr_size + cs.incompr_size); + const std::string compr_size_str = + Util::format_human_readable_size(cs.compr_size); + const std::string content_size_str = + Util::format_human_readable_size(cs.content_size); + const std::string incompr_size_str = + Util::format_human_readable_size(cs.incompr_size); + + PRINT(stdout, + "Total data: {:>8s} ({} disk blocks)\n", + cache_size_str, + on_disk_size_str); + PRINT(stdout, + "Compressed data: {:>8s} ({:.1f}% of original size)\n", + compr_size_str, + 100.0 - savings); + PRINT(stdout, " - Original data: {:>8s}\n", content_size_str); + PRINT(stdout, + " - Compression ratio: {:>5.3f} x ({:.1f}% space savings)\n", + ratio, + savings); + PRINT(stdout, "Incompressible data: {:>8s}\n", incompr_size_str); +} + static void finalize_at_exit(Context& ctx) { @@ -2490,8 +2525,13 @@ handle_main_options(int argc, const char* const* argv) case 'x': // --show-compression { ProgressBar progress_bar("Scanning..."); - ctx.storage.primary.print_compression_statistics( - [&](double progress) { progress_bar.update(progress); }); + const auto compression_statistics = + ctx.storage.primary.get_compression_statistics( + [&](double progress) { progress_bar.update(progress); }); + if (isatty(STDOUT_FILENO)) { + PRINT_RAW(stdout, "\n\n"); + } + print_compression_statistics(compression_statistics); break; } diff --git a/src/storage/primary/PrimaryStorage.hpp b/src/storage/primary/PrimaryStorage.hpp index 2361b1008..958394876 100644 --- a/src/storage/primary/PrimaryStorage.hpp +++ b/src/storage/primary/PrimaryStorage.hpp @@ -26,11 +26,21 @@ #include +#include + class Config; namespace storage { namespace primary { +struct CompressionStatistics +{ + uint64_t compr_size; + uint64_t content_size; + uint64_t incompr_size; + uint64_t on_disk_size; +}; + class PrimaryStorage { public: @@ -74,7 +84,8 @@ public: // --- Compression --- - void print_compression_statistics(const ProgressReceiver& progress_receiver); + CompressionStatistics + get_compression_statistics(const ProgressReceiver& progress_receiver) const; void recompress(nonstd::optional level, const ProgressReceiver& progress_receiver); diff --git a/src/storage/primary/PrimaryStorage_compress.cpp b/src/storage/primary/PrimaryStorage_compress.cpp index 5bd95be89..892a27b21 100644 --- a/src/storage/primary/PrimaryStorage_compress.cpp +++ b/src/storage/primary/PrimaryStorage_compress.cpp @@ -219,14 +219,11 @@ recompress_file(RecompressionStatistics& statistics, LOG("Recompression of {} done", cache_file.path()); } -void -PrimaryStorage::print_compression_statistics( - const ProgressReceiver& progress_receiver) +CompressionStatistics +PrimaryStorage::get_compression_statistics( + const ProgressReceiver& progress_receiver) const { - uint64_t on_disk_size = 0; - uint64_t compr_size = 0; - uint64_t content_size = 0; - uint64_t incompr_size = 0; + CompressionStatistics cs{}; for_each_level_1_subdir( m_config.cache_dir(), @@ -236,15 +233,15 @@ PrimaryStorage::print_compression_statistics( for (size_t i = 0; i < files.size(); ++i) { const auto& cache_file = files[i]; - on_disk_size += cache_file.lstat().size_on_disk(); + cs.on_disk_size += cache_file.lstat().size_on_disk(); try { auto file = open_file(cache_file.path(), "rb"); auto reader = create_reader(cache_file, file.get()); - compr_size += cache_file.lstat().size(); - content_size += reader->content_size(); + cs.compr_size += cache_file.lstat().size(); + cs.content_size += reader->content_size(); } catch (core::Error&) { - incompr_size += cache_file.lstat().size(); + cs.incompr_size += cache_file.lstat().size(); } sub_progress_receiver(1.0 / 2 + 1.0 * i / files.size() / 2); @@ -252,39 +249,7 @@ PrimaryStorage::print_compression_statistics( }, progress_receiver); - if (isatty(STDOUT_FILENO)) { - PRINT_RAW(stdout, "\n\n"); - } - - const double ratio = - compr_size > 0 ? static_cast(content_size) / compr_size : 0.0; - const double savings = ratio > 0.0 ? 100.0 - (100.0 / ratio) : 0.0; - - const std::string on_disk_size_str = - Util::format_human_readable_size(on_disk_size); - const std::string cache_size_str = - Util::format_human_readable_size(compr_size + incompr_size); - const std::string compr_size_str = - Util::format_human_readable_size(compr_size); - const std::string content_size_str = - Util::format_human_readable_size(content_size); - const std::string incompr_size_str = - Util::format_human_readable_size(incompr_size); - - PRINT(stdout, - "Total data: {:>8s} ({} disk blocks)\n", - cache_size_str, - on_disk_size_str); - PRINT(stdout, - "Compressed data: {:>8s} ({:.1f}% of original size)\n", - compr_size_str, - 100.0 - savings); - PRINT(stdout, " - Original data: {:>8s}\n", content_size_str); - PRINT(stdout, - " - Compression ratio: {:>5.3f} x ({:.1f}% space savings)\n", - ratio, - savings); - PRINT(stdout, "Incompressible data: {:>8s}\n", incompr_size_str); + return cs; } void -- 2.47.3