summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormvel <[email protected]>2022-12-19 11:56:43 +0300
committermvel <[email protected]>2022-12-19 11:56:43 +0300
commit52a9e6a2c317d50ff61a20a705c0848623256c1d (patch)
treeeb653ae7c11370bf4641fc1e0eba8d3ce60a9947
parentee24e6c1f52ac838f4acd7773fcac520dec6267b (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.cpp15
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 {