Do not try to force file reupload too often.

GitOrigin-RevId: 533e25add08f00daf06c1ce1e42a111c930ef41e
This commit is contained in:
levlam 2019-11-16 20:09:27 +03:00
parent afca63a4f4
commit bda15f31e4
2 changed files with 35 additions and 9 deletions

View File

@ -1492,6 +1492,10 @@ Result<FileId> FileManager::merge(FileId x_file_id, FileId y_file_id, bool no_sy
node->need_load_from_pmc_ |= other_node->need_load_from_pmc_; node->need_load_from_pmc_ |= other_node->need_load_from_pmc_;
node->can_search_locally_ &= other_node->can_search_locally_; node->can_search_locally_ &= other_node->can_search_locally_;
if (other_node->last_successful_force_reupload_time_ > node->last_successful_force_reupload_time_) {
node->last_successful_force_reupload_time_ = other_node->last_successful_force_reupload_time_;
}
if (main_file_id_i == other_node_i) { if (main_file_id_i == other_node_i) {
context_->on_merge_files(other_node->main_file_id_, node->main_file_id_); context_->on_merge_files(other_node->main_file_id_, node->main_file_id_);
node->main_file_id_ = other_node->main_file_id_; node->main_file_id_ = other_node->main_file_id_;
@ -2167,7 +2171,7 @@ void FileManager::run_download(FileNodePtr node) {
download_limit, priority); download_limit, priority);
} }
class ForceUploadActor : public Actor { class FileManager::ForceUploadActor : public Actor {
public: public:
ForceUploadActor(FileManager *file_manager, FileId file_id, std::shared_ptr<FileManager::UploadCallback> callback, ForceUploadActor(FileManager *file_manager, FileId file_id, std::shared_ptr<FileManager::UploadCallback> callback,
int32 new_priority, uint64 upload_order, ActorShared<> parent) int32 new_priority, uint64 upload_order, ActorShared<> parent)
@ -2248,6 +2252,7 @@ class ForceUploadActor : public Actor {
void on_ok() { void on_ok() {
callback_.reset(); callback_.reset();
send_closure(G()->file_manager(), &FileManager::on_force_reupload_success, file_id_);
stop(); stop();
} }
@ -2284,16 +2289,14 @@ class ForceUploadActor : public Actor {
} }
}; };
void FileManager::on_force_reupload_success(FileId file_id) {
auto node = get_sync_file_node(file_id);
CHECK(node);
node->last_successful_force_reupload_time_ = Time::now();
}
void FileManager::resume_upload(FileId file_id, std::vector<int> bad_parts, std::shared_ptr<UploadCallback> callback, void FileManager::resume_upload(FileId file_id, std::vector<int> bad_parts, std::shared_ptr<UploadCallback> callback,
int32 new_priority, uint64 upload_order, bool force) { int32 new_priority, uint64 upload_order, bool force) {
if (bad_parts.size() == 1 && bad_parts[0] == -1) {
create_actor<ForceUploadActor>("ForceUploadActor", this, file_id, std::move(callback), new_priority, upload_order,
context_->create_reference())
.release();
return;
}
LOG(INFO) << "Resume upload of file " << file_id << " with priority " << new_priority << " and force = " << force;
auto node = get_sync_file_node(file_id); auto node = get_sync_file_node(file_id);
if (!node) { if (!node) {
LOG(INFO) << "File " << file_id << " not found"; LOG(INFO) << "File " << file_id << " not found";
@ -2302,6 +2305,23 @@ void FileManager::resume_upload(FileId file_id, std::vector<int> bad_parts, std:
} }
return; return;
} }
if (bad_parts.size() == 1 && bad_parts[0] == -1) {
if (node->last_successful_force_reupload_time_ >= Time::now() - 60) {
LOG(INFO) << "Recently reuploaded file " << file_id << ", do not try again";
if (callback) {
callback->on_upload_error(file_id, Status::Error("Failed to reupload file"));
}
return;
}
create_actor<ForceUploadActor>("ForceUploadActor", this, file_id, std::move(callback), new_priority, upload_order,
context_->create_reference())
.release();
return;
}
LOG(INFO) << "Resume upload of file " << file_id << " with priority " << new_priority << " and force = " << force;
if (force) { if (force) {
node->remote_.is_full_alive = false; node->remote_.is_full_alive = false;
} }

View File

@ -147,6 +147,8 @@ class FileNode {
FileId main_file_id_; FileId main_file_id_;
double last_successful_force_reupload_time_ = -1e10;
FileId upload_pause_; FileId upload_pause_;
int8 upload_priority_ = 0; int8 upload_priority_ = 0;
int8 download_priority_ = 0; int8 download_priority_ = 0;
@ -513,6 +515,8 @@ class FileManager : public FileLoadManager::Callback {
std::shared_ptr<UploadCallback> upload_callback_; std::shared_ptr<UploadCallback> upload_callback_;
}; };
class ForceUploadActor;
ActorShared<> parent_; ActorShared<> parent_;
unique_ptr<Context> context_; unique_ptr<Context> context_;
std::shared_ptr<FileDbInterface> file_db_; std::shared_ptr<FileDbInterface> file_db_;
@ -595,6 +599,8 @@ class FileManager : public FileLoadManager::Callback {
FileNodePtr get_sync_file_node(FileId file_id); FileNodePtr get_sync_file_node(FileId file_id);
void on_force_reupload_success(FileId file_id);
// void release_file_node(FileNodeId id); // void release_file_node(FileNodeId id);
void do_cancel_download(FileNodePtr node); void do_cancel_download(FileNodePtr node);
void do_cancel_upload(FileNodePtr node); void do_cancel_upload(FileNodePtr node);