This commit is contained in:
parent
4a203ebf47
commit
fe0c687f82
@ -98,6 +98,91 @@ open_file::open_file(std::uint64_t chunk_size, std::uint8_t chunk_timeout,
|
|||||||
|
|
||||||
open_file::~open_file() { close(); }
|
open_file::~open_file() { close(); }
|
||||||
|
|
||||||
|
auto open_file::close() -> bool {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
if (fsi_.directory || stop_requested_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_requested_ = true;
|
||||||
|
|
||||||
|
unique_mutex_lock reader_lock(io_thread_mtx_);
|
||||||
|
io_thread_notify_.notify_all();
|
||||||
|
reader_lock.unlock();
|
||||||
|
|
||||||
|
if (reader_thread_) {
|
||||||
|
reader_thread_->join();
|
||||||
|
reader_thread_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not open_file_base::close()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto err = get_api_error();
|
||||||
|
if (err == api_error::success || err == api_error::download_incomplete ||
|
||||||
|
err == api_error::download_stopped) {
|
||||||
|
if (modified_ && not read_state_.all()) {
|
||||||
|
set_api_error(api_error::download_incomplete);
|
||||||
|
} else if (not modified_ && (fsi_.size > 0U) && not read_state_.all()) {
|
||||||
|
set_api_error(api_error::download_stopped);
|
||||||
|
}
|
||||||
|
|
||||||
|
err = get_api_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
nf_->close();
|
||||||
|
|
||||||
|
if (modified_) {
|
||||||
|
if (err == api_error::success) {
|
||||||
|
mgr_.queue_upload(*this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == api_error::download_incomplete) {
|
||||||
|
mgr_.store_resume(*this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != api_error::success || read_state_.all()) {
|
||||||
|
mgr_.remove_resume(fsi_.api_path, get_source_path());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == api_error::success) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto file = utils::file::file{fsi_.source_path};
|
||||||
|
auto file_size = file.size().value_or(0U);
|
||||||
|
if (file.remove()) {
|
||||||
|
auto res = cache_size_mgr::instance().shrink(file_size);
|
||||||
|
if (res != api_error::success) {
|
||||||
|
utils::error::raise_api_path_error(function_name, fsi_.api_path,
|
||||||
|
fsi_.source_path, res,
|
||||||
|
"failed to shrink cache");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
utils::error::raise_api_path_error(
|
||||||
|
function_name, fsi_.api_path, fsi_.source_path,
|
||||||
|
utils::get_last_error_code(), "failed to delete source file");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto parent = utils::path::get_parent_path(fsi_.source_path);
|
||||||
|
fsi_.source_path =
|
||||||
|
utils::path::combine(parent, {utils::create_uuid_string()});
|
||||||
|
auto res =
|
||||||
|
provider_.set_item_meta(fsi_.api_path, META_SOURCE, fsi_.source_path);
|
||||||
|
if (res != api_error::success) {
|
||||||
|
utils::error::raise_api_path_error(function_name, fsi_.api_path,
|
||||||
|
fsi_.source_path, res,
|
||||||
|
"failed to set new source path");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void open_file::download_chunk(std::size_t chunk, bool skip_active,
|
void open_file::download_chunk(std::size_t chunk, bool skip_active,
|
||||||
bool should_reset) {
|
bool should_reset) {
|
||||||
if (should_reset) {
|
if (should_reset) {
|
||||||
@ -444,91 +529,6 @@ auto open_file::resize(std::uint64_t new_file_size) -> api_error {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto open_file::close() -> bool {
|
|
||||||
REPERTORY_USES_FUNCTION_NAME();
|
|
||||||
|
|
||||||
if (fsi_.directory || stop_requested_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_requested_ = true;
|
|
||||||
|
|
||||||
unique_mutex_lock reader_lock(io_thread_mtx_);
|
|
||||||
io_thread_notify_.notify_all();
|
|
||||||
reader_lock.unlock();
|
|
||||||
|
|
||||||
if (reader_thread_) {
|
|
||||||
reader_thread_->join();
|
|
||||||
reader_thread_.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (not open_file_base::close()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto err = get_api_error();
|
|
||||||
if (err == api_error::success || err == api_error::download_incomplete ||
|
|
||||||
err == api_error::download_stopped) {
|
|
||||||
if (modified_ && not read_state_.all()) {
|
|
||||||
set_api_error(api_error::download_incomplete);
|
|
||||||
} else if (not modified_ && (fsi_.size > 0U) && not read_state_.all()) {
|
|
||||||
set_api_error(api_error::download_stopped);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = get_api_error();
|
|
||||||
}
|
|
||||||
|
|
||||||
nf_->close();
|
|
||||||
|
|
||||||
if (modified_) {
|
|
||||||
if (err == api_error::success) {
|
|
||||||
mgr_.queue_upload(*this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err == api_error::download_incomplete) {
|
|
||||||
mgr_.store_resume(*this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err != api_error::success || read_state_.all()) {
|
|
||||||
mgr_.remove_resume(fsi_.api_path, get_source_path());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err == api_error::success) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto file = utils::file::file{fsi_.source_path};
|
|
||||||
auto file_size = file.size().value_or(0U);
|
|
||||||
if (file.remove()) {
|
|
||||||
auto res = cache_size_mgr::instance().shrink(file_size);
|
|
||||||
if (res != api_error::success) {
|
|
||||||
utils::error::raise_api_path_error(function_name, fsi_.api_path,
|
|
||||||
fsi_.source_path, res,
|
|
||||||
"failed to shrink cache");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
utils::error::raise_api_path_error(
|
|
||||||
function_name, fsi_.api_path, fsi_.source_path,
|
|
||||||
utils::get_last_error_code(), "failed to delete source file");
|
|
||||||
}
|
|
||||||
|
|
||||||
auto parent = utils::path::get_parent_path(fsi_.source_path);
|
|
||||||
fsi_.source_path =
|
|
||||||
utils::path::combine(parent, {utils::create_uuid_string()});
|
|
||||||
auto res =
|
|
||||||
provider_.set_item_meta(fsi_.api_path, META_SOURCE, fsi_.source_path);
|
|
||||||
if (res != api_error::success) {
|
|
||||||
utils::error::raise_api_path_error(function_name, fsi_.api_path,
|
|
||||||
fsi_.source_path, res,
|
|
||||||
"failed to set new source path");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void open_file::set_modified() {
|
void open_file::set_modified() {
|
||||||
if (not modified_) {
|
if (not modified_) {
|
||||||
modified_ = true;
|
modified_ = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user