Add more logging and minor file reference fixes.

GitOrigin-RevId: 42fd08c7e7d8c4d0be12e5cddb352dd874553edb
This commit is contained in:
levlam 2019-02-15 23:09:18 +03:00
parent 49965b4ab7
commit 24128120cb
4 changed files with 36 additions and 15 deletions

View File

@ -225,8 +225,9 @@ class FileDb : public FileDbInterface {
generate_key = as_key(*file_data.generate_);
}
LOG(DEBUG) << "SAVE " << id.get() << " -> " << file_data << " "
<< tag("remote", format::as_hex_dump<4>(Slice(remote_key)))
<< tag("local", format::as_hex_dump<4>(Slice(local_key)));
<< tag("remote_key", format::as_hex_dump<4>(Slice(remote_key)))
<< tag("local_key", format::as_hex_dump<4>(Slice(local_key)))
<< tag("generate_key", format::as_hex_dump<4>(Slice(generate_key)));
send_closure(file_db_actor_, &FileDbActor::store_file_data, id, serialize(file_data), remote_key, local_key,
generate_key);
}

View File

@ -30,6 +30,7 @@
#include "td/utils/port/path.h"
#include "td/utils/port/Stat.h"
#include "td/utils/ScopeGuard.h"
#include "td/utils/StringBuilder.h"
#include "td/utils/tl_helpers.h"
#include <algorithm>
@ -43,6 +44,22 @@ namespace {
constexpr int64 MAX_FILE_SIZE = 1500 * (1 << 20) /* 1500MB */;
} // namespace
StringBuilder &operator<<(StringBuilder &string_builder, FileLocationSource source) {
switch (source) {
case FileLocationSource::None:
return string_builder << "None";
case FileLocationSource::FromUser:
return string_builder << "User";
case FileLocationSource::FromDatabase:
return string_builder << "Database";
case FileLocationSource::FromServer:
return string_builder << "Server";
default:
UNREACHABLE();
return string_builder << "Unknown";
}
}
NewRemoteFileLocation::NewRemoteFileLocation(RemoteFileLocation remote, FileLocationSource source) {
switch (remote.type()) {
case RemoteFileLocation::Type::Empty:
@ -949,7 +966,7 @@ Result<FileId> FileManager::register_file(FileData &&data, FileLocationSource fi
bool has_remote = data.remote_.type() == RemoteFileLocation::Type::Full;
bool has_generate = data.generate_ != nullptr;
if (data.local_.type() == LocalFileLocation::Type::Full && !force) {
if (file_location_source == FileLocationSource::FromDb) {
if (file_location_source == FileLocationSource::FromDatabase) {
PathView path_view(data.local_.full().path_);
if (path_view.is_relative()) {
data.local_.full().path_ = PSTRING()
@ -1073,6 +1090,7 @@ static int merge_choose_file_source_location(FileLocationSource x, FileLocationS
static int merge_choose_remote_location(const FullRemoteFileLocation &x, FileLocationSource x_source,
const FullRemoteFileLocation &y, FileLocationSource y_source) {
LOG(INFO) << "Choose between " << x << " from " << x_source << " and " << y << " from " << y_source;
if (x.is_web() != y.is_web()) {
return x.is_web(); // prefer non-web
}
@ -1086,11 +1104,12 @@ static int merge_choose_remote_location(const FullRemoteFileLocation &x, FileLoc
return merge_choose_file_source_location(x_source, y_source);
}
}
if (x.get_access_hash() != y.get_access_hash()) {
if (x.get_access_hash() != y.get_access_hash() && (x_source != y_source || x.is_web() || x.get_id() == y.get_id())) {
return merge_choose_file_source_location(x_source, y_source);
}
return 2;
}
static int merge_choose_remote_location(const NewRemoteFileLocation &x, const NewRemoteFileLocation &y) {
if (x.is_full_alive != y.is_full_alive) {
return !x.is_full_alive;
@ -1211,7 +1230,7 @@ void FileManager::do_cancel_generate(FileNodePtr node) {
}
Result<FileId> FileManager::merge(FileId x_file_id, FileId y_file_id, bool no_sync) {
LOG(DEBUG) << x_file_id << " VS " << y_file_id;
LOG(DEBUG) << "Merge new file " << x_file_id << " and old file " << y_file_id;
if (!x_file_id.is_valid()) {
return Status::Error("First file_id is invalid");
@ -1240,7 +1259,7 @@ Result<FileId> FileManager::merge(FileId x_file_id, FileId y_file_id, bool no_sy
}
if (x_node->remote_.full && y_node->remote_.full && !x_node->remote_.full.value().is_web() &&
!y_node->remote_.full.value().is_web() &&
!y_node->remote_.full.value().is_web() && y_node->remote_.is_full_alive &&
x_node->remote_.full.value().get_dc_id() != y_node->remote_.full.value().get_dc_id()) {
LOG(ERROR) << "File remote location was changed from " << y_node->remote_.full.value() << " to "
<< x_node->remote_.full.value();
@ -1268,8 +1287,7 @@ Result<FileId> FileManager::merge(FileId x_file_id, FileId y_file_id, bool no_sy
}
if (encryption_key_i == -1) {
if (nodes[remote_i]->remote_.full && nodes[local_i]->local_.type() != LocalFileLocation::Type::Partial) {
//???
LOG(ERROR) << "Different encryption key in files, but go Choose same key as remote location";
LOG(ERROR) << "Different encryption key in files, but lets choose same key as remote location";
encryption_key_i = remote_i;
} else {
return Status::Error("Can't merge files. Different encryption keys");
@ -1301,7 +1319,8 @@ Result<FileId> FileManager::merge(FileId x_file_id, FileId y_file_id, bool no_sy
<< ", node_i = " << node_i << ", local_i = " << local_i << ", remote_i = " << remote_i
<< ", generate_i = " << generate_i << ", size_i = " << size_i << ", remote_name_i = " << remote_name_i
<< ", url_i = " << url_i << ", owner_i = " << owner_i << ", encryption_key_i = " << encryption_key_i
<< ", main_file_id_i = " << main_file_id_i;
<< ", main_file_id_i = " << main_file_id_i << ", trusted_by_source = " << trusted_by_source
<< ", x_source = " << x_node->remote_.full_source << ", y_source = " << y_node->remote_.full_source;
if (local_i == other_node_i) {
do_cancel_download(node);
node->set_download_offset(other_node->download_offset_);
@ -1680,7 +1699,8 @@ void FileManager::load_from_pmc(FileNodePtr node, bool new_remote, bool new_loca
<< ", new_local = " << new_local << ", new_generate = " << new_generate;
auto load = [&](auto location) {
TRY_RESULT(file_data, file_db_->get_file_data_sync(location));
TRY_RESULT(new_file_id, register_file(std::move(file_data), FileLocationSource::FromDb, "load_from_pmc", false));
TRY_RESULT(new_file_id,
register_file(std::move(file_data), FileLocationSource::FromDatabase, "load_from_pmc", false));
TRY_RESULT(main_file_id, merge(file_id, new_file_id));
file_id = main_file_id;
return Status::OK();

View File

@ -46,7 +46,7 @@ extern int VERBOSITY_NAME(update_file);
class FileData;
class FileDbInterface;
enum class FileLocationSource : int8 { None, FromUser, FromDb, FromServer };
enum class FileLocationSource : int8 { None, FromUser, FromDatabase, FromServer };
struct NewRemoteFileLocation {
NewRemoteFileLocation() = default;

View File

@ -155,8 +155,8 @@ FileId FileManager::parse_file(ParserT &parser) {
if (parser.version() >= static_cast<int32>(Version::StoreFileOwnerId)) {
parse(owner_dialog_id, parser);
}
return register_remote(full_remote_location, FileLocationSource::FromDb, owner_dialog_id, size, expected_size,
name);
return register_remote(full_remote_location, FileLocationSource::FromDatabase, owner_dialog_id, size,
expected_size, name);
}
case FileStoreType::Local: {
FullLocalFileLocation full_local_location;
@ -200,7 +200,7 @@ FileId FileManager::parse_file(ParserT &parser) {
full_generated_location.conversion_ = PSTRING() << "#file_id#" << download_file_id.get();
}
auto r_file_id = register_generate(full_generated_location.file_type_, FileLocationSource::FromDb,
auto r_file_id = register_generate(full_generated_location.file_type_, FileLocationSource::FromDatabase,
full_generated_location.original_path_, full_generated_location.conversion_,
owner_dialog_id, expected_size);
if (r_file_id.is_ok()) {
@ -217,7 +217,7 @@ FileId FileManager::parse_file(ParserT &parser) {
if (parser.version() >= static_cast<int32>(Version::StoreFileOwnerId)) {
parse(owner_dialog_id, parser);
}
return register_url(url, type, FileLocationSource::FromDb, owner_dialog_id);
return register_url(url, type, FileLocationSource::FromDatabase, owner_dialog_id);
}
}
return FileId();