diff options
| author | mvel <[email protected]> | 2022-12-19 11:56:43 +0300 |
|---|---|---|
| committer | mvel <[email protected]> | 2022-12-19 11:56:43 +0300 |
| commit | 52a9e6a2c317d50ff61a20a705c0848623256c1d (patch) | |
| tree | eb653ae7c11370bf4641fc1e0eba8d3ce60a9947 | |
| parent | ee24e6c1f52ac838f4acd7773fcac520dec6267b (diff) | |
[yql] Avoid heavy checksums calculation in local mode ()
Суть проблемы: YQL свой файловый сторадж устраивает так: считает от файла md5 и по этому ключу его кладёт.
Ключ считается долго и печально, и при запуске в локальном режиме этот самый подсчёт md5 занимает примерно половину времени.
Делаем так: в режиме `YQL_LOCAL == "1"` вместо настоящей контрольной суммы подсовываем md5 от имени файла (в локальном сторадже работают хардлинки и дедупликация не болит).
При этом возникает неприятность, которую приходится слегка костылить на стыке с YT: нельзя сообщать YT эту фальшивую контрольную сумму.
В сам кипарис загружается небольшая часть файлов при запуске тестов, так что подсчёт чексуммы на стороне YT при покладке в свой сторадж уже не сильно жмёт.
А вот в YQL-ный сторадж грузится много разных сошек и в некоторых случаях ещё и бинарь `mrproc`, и вот тут мы очень много экономим, не вычисляя md5 много раз.
| -rw-r--r-- | ydb/library/yql/core/file_storage/file_storage.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/ydb/library/yql/core/file_storage/file_storage.cpp b/ydb/library/yql/core/file_storage/file_storage.cpp index 84c77ffd172..2d73bc469f9 100644 --- a/ydb/library/yql/core/file_storage/file_storage.cpp +++ b/ydb/library/yql/core/file_storage/file_storage.cpp @@ -29,6 +29,7 @@ #include <util/stream/str.h> #include <util/stream/file.h> #include <util/stream/null.h> +#include <util/system/env.h> #include <util/system/fs.h> #include <util/system/fstat.h> #include <util/system/guard.h> @@ -45,6 +46,7 @@ public: explicit TFileStorageImpl(const TFileStorageConfig& params, const std::vector<NFS::IDownloaderPtr>& downloaders) : Storage(params.GetMaxFiles(), ui64(params.GetMaxSizeMb()) << 20ull, params.GetPath()) , Config(params) + , UseFakeChecksums(GetEnv("YQL_LOCAL") == "1") { Downloaders.push_back(MakeHttpDownloader(params)); Downloaders.insert(Downloaders.begin(), downloaders.begin(), downloaders.end()); @@ -55,7 +57,7 @@ public: TFileLinkPtr PutFile(const TString& file, const TString& outFileName = {}) final { YQL_LOG(INFO) << "PutFile to cache: " << file; - const auto md5 = MD5::File(file); + const auto md5 = FileChecksum(file); const TString storageFileName = md5 + ".file"; auto lock = MultiResourceLock.Acquire(storageFileName); return Storage.Put(storageFileName, outFileName, md5, [&file, &md5](const TFsPath& dstFile) { @@ -251,6 +253,16 @@ private: return result; } + TString FileChecksum(const TString& file) const { + if (UseFakeChecksums) { + // Avoid heavy binaries recalculation in local mode (YQL-15353): + // calculate MD5 sum of file name instead of file contents + return MD5::Calc(file); + } else { + return MD5::File(file); + } + } + static TString BuildUrlMetaFileName(const THttpURL& url, const TString& token) { return MD5::Calc(TStringBuilder() << token << url.PrintS(THttpURL::FlagNoFrag | THttpURL::FlagHostAscii)) + ".url_meta"; } @@ -265,6 +277,7 @@ private: const TFileStorageConfig Config; std::vector<NFS::IDownloaderPtr> Downloaders; TMultiResourceLock MultiResourceLock; + const bool UseFakeChecksums; // YQL-15353 }; class TFileStorageWithAsync: public TFileStorageDecorator { |
