Complete ring buffer and direct download support #26

This commit is contained in:
Scott E. Graves 2024-12-23 08:35:04 -06:00
parent 2fd0ff8a93
commit 8ff90ae769
2 changed files with 19 additions and 10 deletions

View File

@ -42,10 +42,11 @@ public:
direct_open_file(const direct_open_file &) noexcept = delete; direct_open_file(const direct_open_file &) noexcept = delete;
direct_open_file(direct_open_file &&) noexcept = delete; direct_open_file(direct_open_file &&) noexcept = delete;
auto operator=(direct_open_file &&) noexcept -> direct_open_file & = delete; auto operator=(direct_open_file &&) noexcept -> direct_open_file & = delete;
auto auto operator=(const direct_open_file &) noexcept
operator=(const direct_open_file &) noexcept -> direct_open_file & = delete; -> direct_open_file & = delete;
private: private:
std::atomic<std::uint64_t> last_progress_{0U};
std::size_t total_chunks_; std::size_t total_chunks_;
stop_type stop_requested_{false}; stop_type stop_requested_{false};
@ -63,13 +64,13 @@ public:
return false; return false;
} }
[[nodiscard]] auto [[nodiscard]] auto get_read_state() const
get_read_state() const -> boost::dynamic_bitset<> override { -> boost::dynamic_bitset<> override {
return {}; return {};
} }
[[nodiscard]] auto [[nodiscard]] auto get_read_state(std::size_t /* chunk */) const
get_read_state(std::size_t /* chunk */) const -> bool override { -> bool override {
return false; return false;
} }
@ -95,8 +96,8 @@ public:
return api_error::not_supported; return api_error::not_supported;
} }
[[nodiscard]] auto write(std::uint64_t, const data_buffer &, [[nodiscard]] auto write(std::uint64_t, const data_buffer &, std::size_t &)
std::size_t &) -> api_error override { -> api_error override {
return api_error::not_supported; return api_error::not_supported;
} }
}; };

View File

@ -27,6 +27,7 @@
#include "providers/i_provider.hpp" #include "providers/i_provider.hpp"
#include "types/repertory.hpp" #include "types/repertory.hpp"
#include "utils/common.hpp" #include "utils/common.hpp"
#include "utils/time.hpp"
namespace repertory { namespace repertory {
direct_open_file::direct_open_file(std::uint64_t chunk_size, direct_open_file::direct_open_file(std::uint64_t chunk_size,
@ -40,6 +41,7 @@ direct_open_file::~direct_open_file() { close(); }
auto direct_open_file::close() -> bool { auto direct_open_file::close() -> bool {
stop_requested_ = true; stop_requested_ = true;
last_progress_ = 0U;
return open_file_base::close(); return open_file_base::close();
} }
@ -58,13 +60,19 @@ auto direct_open_file::read(std::size_t read_size, std::uint64_t read_offset,
auto res = provider_.read_file_bytes(fsi_.api_path, read_size, read_offset, auto res = provider_.read_file_bytes(fsi_.api_path, read_size, read_offset,
data, stop_requested_); data, stop_requested_);
if (res == api_error::success) { if (res != api_error::success) {
return res;
}
reset_timeout();
if ((utils::time::get_time_now() - last_progress_.load()) >
(2U * utils::time::NANOS_PER_SECOND)) {
last_progress_ = utils::time::get_time_now();
auto progress = (static_cast<double>(read_offset + read_size) / auto progress = (static_cast<double>(read_offset + read_size) /
static_cast<double>(fsi_.size) * 100.0); static_cast<double>(fsi_.size) * 100.0);
event_system::instance().raise<download_progress>( event_system::instance().raise<download_progress>(
fsi_.api_path, fsi_.source_path, progress); fsi_.api_path, fsi_.source_path, progress);
} }
reset_timeout();
return res; return res;
} }