From c1acb20b0f444683b5c2fe21b17aa712b00e445d Mon Sep 17 00:00:00 2001 From: Maksim Denisov Date: Wed, 19 Feb 2025 13:41:39 +0100 Subject: LocalCasReader: Use IncrementalReader --- src/buildtool/execution_api/local/TARGETS | 1 + .../execution_api/local/local_cas_reader.cpp | 30 +++++++--------------- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/buildtool/execution_api/local/TARGETS b/src/buildtool/execution_api/local/TARGETS index 04f78c34..dd083f2a 100644 --- a/src/buildtool/execution_api/local/TARGETS +++ b/src/buildtool/execution_api/local/TARGETS @@ -54,6 +54,7 @@ , ["src/buildtool/file_system", "object_type"] , ["src/buildtool/system", "system_command"] , ["src/utils/cpp", "back_map"] + , ["src/utils/cpp", "incremental_reader"] ] } , "context": diff --git a/src/buildtool/execution_api/local/local_cas_reader.cpp b/src/buildtool/execution_api/local/local_cas_reader.cpp index c88f5c15..58af1cbd 100644 --- a/src/buildtool/execution_api/local/local_cas_reader.cpp +++ b/src/buildtool/execution_api/local/local_cas_reader.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -37,6 +36,7 @@ #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/utils/cpp/expected.hpp" +#include "src/utils/cpp/incremental_reader.hpp" #include "src/utils/cpp/path.hpp" namespace { @@ -164,29 +164,17 @@ auto LocalCasReader::StageBlobTo( auto LocalCasReader::DumpRaw(std::filesystem::path const& path, DumpCallback const& dumper) noexcept -> bool { - auto closer = [](gsl::owner file) -> void { - if (file != nullptr) { - std::fclose(file); - } - }; - auto in = std::shared_ptr{std::fopen(path.c_str(), "rb"), closer}; - if (not in) { + constexpr std::size_t kChunkSize{512}; + auto to_read = IncrementalReader::FromFile(kChunkSize, path); + if (not to_read.has_value()) { return false; } - constexpr std::size_t kChunkSize{512}; - std::string buffer(kChunkSize, '\0'); - while (auto size = std::fread(buffer.data(), 1, buffer.size(), in.get())) { - try { - buffer.resize(size); - if (not std::invoke(dumper, buffer)) { - return false; - } - } catch (...) { - return false; - } - } - return true; + return std::all_of( + to_read->begin(), to_read->end(), [&dumper](auto const& chunk) { + return chunk.has_value() and + std::invoke(dumper, std::string{chunk.value()}); + }); } auto LocalCasReader::IsNativeProtocol() const noexcept -> bool { -- cgit v1.2.3