Add FileGenerateManager::QueryId.

This commit is contained in:
levlam 2024-07-12 18:44:41 +03:00
parent 755d9e6689
commit 72019eab50
6 changed files with 49 additions and 27 deletions

View File

@ -28,6 +28,7 @@ namespace td {
class FileDownloadManager final : public Actor {
public:
using QueryId = uint64;
class Callback {
public:
virtual ~Callback();

View File

@ -265,7 +265,7 @@ class WebFileDownloadGenerateActor final : public FileGenerateActor {
class FileExternalGenerateActor final : public FileGenerateActor {
public:
FileExternalGenerateActor(uint64 query_id, const FullGenerateFileLocation &generate_location,
FileExternalGenerateActor(FileGenerateManager::QueryId query_id, const FullGenerateFileLocation &generate_location,
const LocalFileLocation &local_location, string name,
unique_ptr<FileGenerateCallback> callback, ActorShared<> parent)
: query_id_(query_id)
@ -294,7 +294,7 @@ class FileExternalGenerateActor final : public FileGenerateActor {
}
private:
uint64 query_id_;
FileGenerateManager::QueryId query_id_;
FullGenerateFileLocation generate_location_;
LocalFileLocation local_;
string name_;
@ -422,7 +422,7 @@ static Status check_mtime(std::string &conversion, CSlice original_path) {
<< tag("actual modification time", actual_mtime));
}
void FileGenerateManager::generate_file(uint64 query_id, FullGenerateFileLocation generate_location,
void FileGenerateManager::generate_file(QueryId query_id, FullGenerateFileLocation generate_location,
const LocalFileLocation &local_location, string name,
unique_ptr<FileGenerateCallback> callback) {
LOG(INFO) << "Begin to generate file with " << generate_location;
@ -455,7 +455,7 @@ void FileGenerateManager::generate_file(uint64 query_id, FullGenerateFileLocatio
}
}
void FileGenerateManager::cancel(uint64 query_id) {
void FileGenerateManager::cancel(QueryId query_id) {
auto it = query_id_to_query_.find(query_id);
if (it == query_id_to_query_.end()) {
return;
@ -463,7 +463,7 @@ void FileGenerateManager::cancel(uint64 query_id) {
it->second.worker_.reset();
}
void FileGenerateManager::external_file_generate_write_part(uint64 query_id, int64 offset, string data,
void FileGenerateManager::external_file_generate_write_part(QueryId query_id, int64 offset, string data,
Promise<> promise) {
auto it = query_id_to_query_.find(query_id);
if (it == query_id_to_query_.end()) {
@ -474,8 +474,8 @@ void FileGenerateManager::external_file_generate_write_part(uint64 query_id, int
std::move(safe_promise));
}
void FileGenerateManager::external_file_generate_progress(uint64 query_id, int64 expected_size, int64 local_prefix_size,
Promise<> promise) {
void FileGenerateManager::external_file_generate_progress(QueryId query_id, int64 expected_size,
int64 local_prefix_size, Promise<> promise) {
auto it = query_id_to_query_.find(query_id);
if (it == query_id_to_query_.end()) {
return promise.set_error(Status::Error(400, "Unknown generation_id"));
@ -485,7 +485,7 @@ void FileGenerateManager::external_file_generate_progress(uint64 query_id, int64
std::move(safe_promise));
}
void FileGenerateManager::external_file_generate_finish(uint64 query_id, Status status, Promise<> promise) {
void FileGenerateManager::external_file_generate_finish(QueryId query_id, Status status, Promise<> promise) {
auto it = query_id_to_query_.find(query_id);
if (it == query_id_to_query_.end()) {
return promise.set_error(Status::Error(400, "Unknown generation_id"));
@ -495,7 +495,7 @@ void FileGenerateManager::external_file_generate_finish(uint64 query_id, Status
std::move(safe_promise));
}
void FileGenerateManager::do_cancel(uint64 query_id) {
void FileGenerateManager::do_cancel(QueryId query_id) {
query_id_to_query_.erase(query_id);
}

View File

@ -34,18 +34,20 @@ class FileGenerateCallback {
class FileGenerateManager final : public Actor {
public:
using QueryId = uint64;
explicit FileGenerateManager(ActorShared<> parent) : parent_(std::move(parent)) {
}
void generate_file(uint64 query_id, FullGenerateFileLocation generate_location,
void generate_file(QueryId query_id, FullGenerateFileLocation generate_location,
const LocalFileLocation &local_location, string name, unique_ptr<FileGenerateCallback> callback);
void cancel(uint64 query_id);
void cancel(QueryId query_id);
// external updates about file generation state
void external_file_generate_write_part(uint64 query_id, int64 offset, string data, Promise<> promise);
void external_file_generate_progress(uint64 query_id, int64 expected_size, int64 local_prefix_size,
void external_file_generate_write_part(QueryId query_id, int64 offset, string data, Promise<> promise);
void external_file_generate_progress(QueryId query_id, int64 expected_size, int64 local_prefix_size,
Promise<> promise);
void external_file_generate_finish(uint64 query_id, Status status, Promise<> promise);
void external_file_generate_finish(QueryId query_id, Status status, Promise<> promise);
private:
struct Query {
@ -60,13 +62,13 @@ class FileGenerateManager final : public Actor {
};
ActorShared<> parent_;
std::map<uint64, Query> query_id_to_query_;
std::map<QueryId, Query> query_id_to_query_;
bool close_flag_ = false;
void hangup() final;
void hangup_shared() final;
void loop() final;
void do_cancel(uint64 query_id);
void do_cancel(QueryId query_id);
};
} // namespace td

View File

@ -2925,18 +2925,19 @@ void FileManager::delete_file_reference(FileId file_id, Slice file_reference) {
void FileManager::external_file_generate_write_part(int64 generation_id, int64 offset, string data, Promise<> promise) {
send_closure(file_generate_manager_, &FileGenerateManager::external_file_generate_write_part,
static_cast<uint64>(generation_id), offset, std::move(data), std::move(promise));
static_cast<FileGenerateManager::QueryId>(generation_id), offset, std::move(data), std::move(promise));
}
void FileManager::external_file_generate_progress(int64 generation_id, int64 expected_size, int64 local_prefix_size,
Promise<> promise) {
send_closure(file_generate_manager_, &FileGenerateManager::external_file_generate_progress,
static_cast<uint64>(generation_id), expected_size, local_prefix_size, std::move(promise));
static_cast<FileGenerateManager::QueryId>(generation_id), expected_size, local_prefix_size,
std::move(promise));
}
void FileManager::external_file_generate_finish(int64 generation_id, Status status, Promise<> promise) {
send_closure(file_generate_manager_, &FileGenerateManager::external_file_generate_finish,
static_cast<uint64>(generation_id), std::move(status), std::move(promise));
static_cast<FileGenerateManager::QueryId>(generation_id), std::move(status), std::move(promise));
}
void FileManager::run_generate(FileNodePtr node) {
@ -2993,7 +2994,7 @@ void FileManager::run_generate(FileNodePtr node) {
return;
}
FileDownloadManager::QueryId query_id = queries_container_.create(Query{file_id, Query::Type::Generate});
FileGenerateManager::QueryId query_id = queries_container_.create(Query{file_id, Query::Type::Generate});
node->generate_id_ = query_id;
send_closure(file_generate_manager_, &FileGenerateManager::generate_file, query_id, *node->generate_, node->local_,
node->suggested_path(), [file_manager = this, query_id] {
@ -3002,7 +3003,7 @@ void FileManager::run_generate(FileNodePtr node) {
uint64 query_id_;
public:
Callback(ActorId<FileManager> actor, FileDownloadManager::QueryId query_id)
Callback(ActorId<FileManager> actor, FileGenerateManager::QueryId query_id)
: actor_(std::move(actor)), query_id_(query_id) {
}
void on_partial_generate(PartialLocalFileLocation partial_local, int64 expected_size) final {
@ -3013,7 +3014,7 @@ void FileManager::run_generate(FileNodePtr node) {
send_closure(actor_, &FileManager::on_generate_ok, query_id_, std::move(local));
}
void on_error(Status error) final {
send_closure(actor_, &FileManager::on_download_error, query_id_, std::move(error));
send_closure(actor_, &FileManager::on_generate_error, query_id_, std::move(error));
}
};
return make_unique<Callback>(file_manager->actor_id(file_manager), query_id);
@ -3963,7 +3964,7 @@ void FileManager::on_upload_full_ok(FileUploadManager::QueryId query_id, FullRem
LOG_STATUS(merge(new_file_id, file_id));
}
void FileManager::on_partial_generate(FileDownloadManager::QueryId query_id, PartialLocalFileLocation partial_local,
void FileManager::on_partial_generate(FileGenerateManager::QueryId query_id, PartialLocalFileLocation partial_local,
int64 expected_size) {
if (is_closed_) {
return;
@ -4000,7 +4001,7 @@ void FileManager::on_partial_generate(FileDownloadManager::QueryId query_id, Par
try_flush_node(file_node, "on_partial_generate");
}
void FileManager::on_generate_ok(FileDownloadManager::QueryId query_id, FullLocalFileLocation local) {
void FileManager::on_generate_ok(FileGenerateManager::QueryId query_id, FullLocalFileLocation local) {
if (is_closed_) {
return;
}
@ -4060,6 +4061,22 @@ void FileManager::on_download_error(FileDownloadManager::QueryId query_id, Statu
on_error_impl(node, query.type_, was_active, std::move(status));
}
void FileManager::on_generate_error(FileGenerateManager::QueryId query_id, Status status) {
if (is_closed_) {
return;
}
Query query;
bool was_active;
std::tie(query, was_active) = finish_query(static_cast<Container<Query>::Id>(query_id));
auto node = get_file_node(query.file_id_);
if (!node) {
LOG(ERROR) << "Can't find file node for " << query.file_id_ << " " << status;
return;
}
on_error_impl(node, query.type_, was_active, std::move(status));
}
void FileManager::on_upload_error(FileUploadManager::QueryId query_id, Status status) {
if (is_closed_) {
return;

View File

@ -147,7 +147,7 @@ class FileNode {
FileDownloadManager::QueryId download_id_ = 0;
unique_ptr<FullGenerateFileLocation> generate_;
FileDownloadManager::QueryId generate_id_ = 0;
FileGenerateManager::QueryId generate_id_ = 0;
int64 size_ = 0;
int64 expected_size_ = 0;
@ -786,8 +786,9 @@ class FileManager final : public Actor {
void on_error_impl(FileNodePtr node, Query::Type type, bool was_active, Status status);
void on_partial_generate(FileDownloadManager::QueryId, PartialLocalFileLocation partial_local, int64 expected_size);
void on_generate_ok(FileDownloadManager::QueryId, FullLocalFileLocation local);
void on_partial_generate(FileGenerateManager::QueryId, PartialLocalFileLocation partial_local, int64 expected_size);
void on_generate_ok(FileGenerateManager::QueryId, FullLocalFileLocation local);
void on_generate_error(FileGenerateManager::QueryId query_id, Status status);
std::pair<Query, bool> finish_query(Container<Query>::Id query_id);

View File

@ -26,6 +26,7 @@ namespace td {
class FileUploadManager final : public Actor {
public:
using QueryId = uint64;
class Callback {
public:
virtual ~Callback();