Repository: ydb-platform/ydb
Pull request #18366: TImportClient::ListObjectsInS3Export in C++ SDK
Author: login: UgnineSirdis
Labels: name: not-for-changelog
Created: 2025-05-15T12:25:24Z | Merged: 2025-05-16T13:28:47Z

### Changelog entry <!-- a user-readable short description of the changes that goes to CHANGELOG.md and Release Notes -->

...

### Changelog category <!-- remove all except one -->

* Not for changelog (changelog entry is not required)

### Description for reviewers <!-- (optional) description for those who read this PR -->

Implement ListObjectsInS3Export API in C++ SDK.
RFC: https://github.com/ydb-platform/ydb-rfc/blob/main/backup_encryption.md
PR that adds API: https://github.com/ydb-platform/ydb/pull/18035



Diff:
diff --git a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h
index d1dc0b3fd52d..caaf26aef622 100644
--- a/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h
+++ b/ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h
@@ -5,6 +5,10 @@
 
 #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/s3_settings.h>
 
+namespace Ydb::Import {
+class ListObjectsInS3ExportResult;
+}
+
 namespace NYdb::inline Dev {
 namespace NImport {
 
@@ -77,6 +81,49 @@ class TImportFromS3Response : public TOperation {
     TMetadata Metadata_;
 };
 
+using TAsyncImportFromS3Response = NThreading::TFuture<TImportFromS3Response>;
+
+struct TListObjectsInS3ExportSettings : public TOperationRequestSettings<TListObjectsInS3ExportSettings>,
+                                        public TS3Settings<TListObjectsInS3ExportSettings> {
+    using TSelf = TListObjectsInS3ExportSettings;
+
+    struct TItem {
+        // Database object path.
+        std::string Path = {};
+    };
+
+    FLUENT_SETTING_VECTOR(TItem, Item);
+    FLUENT_SETTING_OPTIONAL(uint32_t, NumberOfRetries);
+    FLUENT_SETTING_OPTIONAL(std::string, Prefix);
+    FLUENT_SETTING_OPTIONAL(std::string, SymmetricKey);
+};
+
+class TListObjectsInS3ExportResult : public TStatus {
+public:
+    struct TItem {
+        // S3 object prefix
+        std::string Prefix;
+
+        // Database object path
+        std::string Path;
+
+        void Out(IOutputStream& out) const;
+    };
+
+    TListObjectsInS3ExportResult(TStatus&& status, const ::Ydb::Import::ListObjectsInS3ExportResult& proto);
+
+    const std::vector<TItem>& GetItems() const;
+    const std::string& NextPageToken() const { return NextPageToken_; }
+
+    void Out(IOutputStream& out) const;
+
+private:
+    std::vector<TItem> Items_;
+    std::string NextPageToken_;
+};
+
+using TAsyncListObjectsInS3ExportResult = NThreading::TFuture<TListObjectsInS3ExportResult>;
+
 /// Data
 struct TImportYdbDumpDataSettings : public TOperationRequestSettings<TImportYdbDumpDataSettings> {
     using TSelf = TImportYdbDumpDataSettings;
@@ -99,7 +146,9 @@ class TImportClient {
 public:
     TImportClient(const TDriver& driver, const TCommonClientSettings& settings = TCommonClientSettings());
 
-    NThreading::TFuture<TImportFromS3Response> ImportFromS3(const TImportFromS3Settings& settings);
+    TAsyncImportFromS3Response ImportFromS3(const TImportFromS3Settings& settings);
+
+    TAsyncListObjectsInS3ExportResult ListObjectsInS3Export(const TListObjectsInS3ExportSettings& settings, std::int64_t pageSize = 0, const std::string& pageToken = {});
 
     // ydb dump format
     TAsyncImportDataResult ImportData(const std::string& table, std::string&& data, const TImportYdbDumpDataSettings& settings);
@@ -111,8 +160,3 @@ class TImportClient {
 
 } // namespace NImport
 } // namespace NYdb
-
-template<>
-inline void Out<NYdb::NImport::TImportFromS3Response>(IOutputStream& o, const NYdb::NImport::TImportFromS3Response& x) {
-    return x.Out(o);
-}
diff --git a/ydb/public/sdk/cpp/src/client/import/import.cpp b/ydb/public/sdk/cpp/src/client/import/import.cpp
index b7bce3e3d3f6..fb4445b2eae3 100644
--- a/ydb/public/sdk/cpp/src/client/import/import.cpp
+++ b/ydb/public/sdk/cpp/src/client/import/import.cpp
@@ -10,6 +10,8 @@
 #include <ydb/public/sdk/cpp/src/client/common_client/impl/client.h>
 #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/proto/accessor.h>
 
+#include <util/string/join.h>
+
 namespace NYdb::inline Dev {
 namespace NImport {
 
@@ -34,6 +36,25 @@ std::vector<TImportItemProgress> ItemsProgressFromProto(const google::protobuf::
     return result;
 }
 
+template <class TS3SettingsProto, class TSettings>
+void FillS3Settings(TS3SettingsProto& proto, const TSettings& settings) {
+    proto.set_endpoint(TStringType{settings.Endpoint_});
+    proto.set_scheme(TProtoAccessor::GetProto<ImportFromS3Settings>(settings.Scheme_));
+    proto.set_bucket(TStringType{settings.Bucket_});
+    proto.set_access_key(TStringType{settings.AccessKey_});
+    proto.set_secret_key(TStringType{settings.SecretKey_});
+
+    if (settings.NumberOfRetries_) {
+        proto.set_number_of_retries(settings.NumberOfRetries_.value());
+    }
+
+    if (settings.SymmetricKey_) {
+        proto.mutable_encryption_settings()->mutable_symmetric_key()->set_key(*settings.SymmetricKey_);
+    }
+
+    proto.set_disable_virtual_addressing(!settings.UseVirtualAddressing_);
+}
+
 } // anonymous
 
 /// S3
@@ -66,6 +87,36 @@ const TImportFromS3Response::TMetadata& TImportFromS3Response::Metadata() const
     return Metadata_;
 }
 
+TListObjectsInS3ExportResult::TListObjectsInS3ExportResult(TStatus&& status, const ::Ydb::Import::ListObjectsInS3ExportResult& proto)
+    : TStatus(std::move(status))
+{
+    Items_.reserve(proto.items_size());
+    for (const auto& item : proto.items()) {
+        Items_.emplace_back(TItem{
+            .Prefix = item.prefix(),
+            .Path = item.path()
+        });
+    }
+    NextPageToken_ = proto.next_page_token();
+}
+
+const std::vector<TListObjectsInS3ExportResult::TItem>& TListObjectsInS3ExportResult::GetItems() const {
+    return Items_;
+}
+
+void TListObjectsInS3ExportResult::Out(IOutputStream& out) const {
+    if (IsSuccess()) {
+        out << "{ items: [" << JoinSeq(", ", Items_) << "], next_page_token: \"" << NextPageToken_ << "\" }";
+    } else {
+        return TStatus::Out(out);
+    }
+}
+
+void TListObjectsInS3ExportResult::TItem::Out(IOutputStream& out) const {
+    out << "{ prefix: \"" << Prefix << "\""
+        << ", path: \"" << Path << "\" }";
+}
+
 /// Data
 TImportDataResult::TImportDataResult(TStatus&& status)
     : TStatus(std::move(status))
@@ -80,13 +131,37 @@ class TImportClient::TImpl : public TClientImplCommon<TImportClient::TImpl> {
     {
     }
 
-    TFuture<TImportFromS3Response> ImportFromS3(ImportFromS3Request&& request, const TImportFromS3Settings& settings) {
+    TAsyncImportFromS3Response ImportFromS3(ImportFromS3Request&& request, const TImportFromS3Settings& settings) {
         return RunOperation<V1::ImportService, ImportFromS3Request, ImportFromS3Response, TImportFromS3Response>(
             std::move(request),
             &V1::ImportService::Stub::AsyncImportFromS3,
             TRpcRequestSettings::Make(settings));
     }
 
+    TAsyncListObjectsInS3ExportResult ListObjectsInS3Export(ListObjectsInS3ExportRequest&& request, const TListObjectsInS3ExportSettings& settings) {
+        auto promise = NThreading::NewPromise<TListObjectsInS3ExportResult>();
+
+        auto extractor = [promise]
+            (google::protobuf::Any* any, TPlainStatus status) mutable {
+                ListObjectsInS3ExportResult result;
+                if (any) {
+                    any->UnpackTo(&result);
+                }
+
+                promise.SetValue(TListObjectsInS3ExportResult(TStatus(std::move(status)), result));
+            };
+
+        Connections_->RunDeferred<V1::ImportService, ListObjectsInS3ExportRequest, ListObjectsInS3ExportResponse>(
+            std::move(request),
+            extractor,
+            &V1::ImportService::Stub::AsyncListObjectsInS3Export,
+            DbDriverState_,
+            INITIAL_DEFERRED_CALL_DELAY,
+            TRpcRequestSettings::Make(settings));
+
+        return promise.GetFuture();
+    }
+
     template <typename TSettings>
     TAsyncImportDataResult ImportData(ImportDataRequest&& request, const TSettings& settings) {
         auto promise = NThreading::NewPromise<TImportDataResult>();
@@ -131,14 +206,10 @@ TImportClient::TImportClient(const TDriver& driver, const TCommonClientSettings&
 {
 }
 
-TFuture<TImportFromS3Response> TImportClient::ImportFromS3(const TImportFromS3Settings& settings) {
+TAsyncImportFromS3Response TImportClient::ImportFromS3(const TImportFromS3Settings& settings) {
     auto request = MakeOperationRequest<ImportFromS3Request>(settings);
-
-    request.mutable_settings()->set_endpoint(TStringType{settings.Endpoint_});
-    request.mutable_settings()->set_scheme(TProtoAccessor::GetProto<ImportFromS3Settings>(settings.Scheme_));
-    request.mutable_settings()->set_bucket(TStringType{settings.Bucket_});
-    request.mutable_settings()->set_access_key(TStringType{settings.AccessKey_});
-    request.mutable_settings()->set_secret_key(TStringType{settings.SecretKey_});
+    Ydb::Import::ImportFromS3Settings& settingsProto = *request.mutable_settings();
+    FillS3Settings(settingsProto, settings);
 
     for (const auto& item : settings.Item_) {
         if (!item.Src.empty() && !item.SrcPath.empty()) {
@@ -146,7 +217,7 @@ TFuture<TImportFromS3Response> TImportClient::ImportFromS3(const TImportFromS3Se
                 TStringBuilder() << "Invalid item: both source prefix and source path are set: \"" << item.Src << "\" and \"" << item.SrcPath << "\"");
         }
 
-        auto& protoItem = *request.mutable_settings()->mutable_items()->Add();
+        auto& protoItem = *settingsProto.mutable_items()->Add();
         if (!item.Src.empty()) {
             protoItem.set_source_prefix(item.Src);
         }
@@ -157,32 +228,47 @@ TFuture<TImportFromS3Response> TImportClient::ImportFromS3(const TImportFromS3Se
     }
 
     if (settings.Description_) {
-        request.mutable_settings()->set_description(TStringType{settings.Description_.value()});
-    }
-
-    if (settings.NumberOfRetries_) {
-        request.mutable_settings()->set_number_of_retries(settings.NumberOfRetries_.value());
+        settingsProto.set_description(TStringType{settings.Description_.value()});
     }
 
     if (settings.NoACL_) {
-        request.mutable_settings()->set_no_acl(settings.NoACL_.value());
+        settingsProto.set_no_acl(settings.NoACL_.value());
     }
 
     if (settings.SourcePrefix_) {
-        request.mutable_settings()->set_source_prefix(settings.SourcePrefix_.value());
+        settingsProto.set_source_prefix(settings.SourcePrefix_.value());
     }
 
     if (settings.DestinationPath_) {
-        request.mutable_settings()->set_destination_path(settings.DestinationPath_.value());
+        settingsProto.set_destination_path(settings.DestinationPath_.value());
     }
 
-    if (settings.SymmetricKey_) {
-        request.mutable_settings()->mutable_encryption_settings()->mutable_symmetric_key()->set_key(*settings.SymmetricKey_);
+    return Impl_->ImportFromS3(std::move(request), settings);
+}
+
+TAsyncListObjectsInS3ExportResult TImportClient::ListObjectsInS3Export(const TListObjectsInS3ExportSettings& settings, std::int64_t pageSize, const std::string& pageToken) {
+    auto request = MakeOperationRequest<ListObjectsInS3ExportRequest>(settings);
+    Ydb::Import::ListObjectsInS3ExportSettings& settingsProto = *request.mutable_settings();
+    FillS3Settings(settingsProto, settings);
+
+    if (settings.Prefix_) {
+        settingsProto.set_prefix(settings.Prefix_.value());
     }
 
-    request.mutable_settings()->set_disable_virtual_addressing(!settings.UseVirtualAddressing_);
+    for (const auto& item : settings.Item_) {
+        if (item.Path.empty()) {
+            throw TContractViolation(
+                TStringBuilder() << "Invalid item: path is not set");
+        }
 
-    return Impl_->ImportFromS3(std::move(request), settings);
+        settingsProto.add_items()->set_path(item.Path);
+    }
+
+    // Paging
+    request.set_page_size(pageSize);
+    request.set_page_token(pageToken);
+
+    return Impl_->ListObjectsInS3Export(std::move(request), settings);
 }
 
 TAsyncImportDataResult TImportClient::ImportData(const std::string& table, std::string&& data, const TImportYdbDumpDataSettings& settings) {
diff --git a/ydb/public/sdk/cpp/src/client/import/out.cpp b/ydb/public/sdk/cpp/src/client/import/out.cpp
index d0070502b371..010c9a44ced1 100644
--- a/ydb/public/sdk/cpp/src/client/import/out.cpp
+++ b/ydb/public/sdk/cpp/src/client/import/out.cpp
@@ -3,3 +3,15 @@
 Y_DECLARE_OUT_SPEC(, NYdb::NImport::TImportDataResult, o, x) {
     return x.Out(o);
 }
+
+Y_DECLARE_OUT_SPEC(, NYdb::NImport::TImportFromS3Response, o, x) {
+    return x.Out(o);
+}
+
+Y_DECLARE_OUT_SPEC(, NYdb::NImport::TListObjectsInS3ExportResult, o, x) {
+    return x.Out(o);
+}
+
+Y_DECLARE_OUT_SPEC(, NYdb::NImport::TListObjectsInS3ExportResult::TItem, o, x) {
+    return x.Out(o);
+}


Reviews:
user: login: Gazizonoki
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-15T21:10:47Z
user: login: Gazizonoki
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-15T21:26:33Z

Review comments:
diff_hunk: @@ -77,6 +81,49 @@ class TImportFromS3Response : public TOperation {
     TMetadata Metadata_;
 };
 
+using TAsyncImportFromS3Response = NThreading::TFuture<TImportFromS3Response>;
+
+struct TListObjectsInS3ExportSettings : public TOperationRequestSettings<TListObjectsInS3ExportSettings>,
+                                        public TS3Settings<TListObjectsInS3ExportSettings> {
+    using TSelf = TListObjectsInS3ExportSettings;
+
+    struct TItem {
+        // Database object path.
+        std::string Path = {};
+    };
+
+    FLUENT_SETTING_VECTOR(TItem, Item);
+    FLUENT_SETTING_OPTIONAL(uint32_t, NumberOfRetries);
+    FLUENT_SETTING_OPTIONAL(std::string, Prefix);
+    FLUENT_SETTING_OPTIONAL(std::string, SymmetricKey);
+};
+
+class TListObjectsInS3ExportResult : public TStatus {
+public:
+    struct TItem {
+        // S3 object prefix
+        std::string Prefix;
+
+        // Database object path
+        std::string Path;
+
+        void Out(IOutputStream& out) const;
+    };
+
+    TListObjectsInS3ExportResult(TStatus&& status, const ::Ydb::Import::ListObjectsInS3ExportResult& proto);
+
+    const std::vector<TItem>& GetItems() const;
+    const TString& NextPageToken() const { return NextPageToken_; }
path: ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h
user: login: Gazizonoki
body: ```suggestion
    const std::string& NextPageToken() const { return NextPageToken_; }
```
created_at: 2025-05-15T21:00:36Z
author_association: COLLABORATOR
diff_hunk: @@ -77,6 +81,49 @@ class TImportFromS3Response : public TOperation {
     TMetadata Metadata_;
 };
 
+using TAsyncImportFromS3Response = NThreading::TFuture<TImportFromS3Response>;
+
+struct TListObjectsInS3ExportSettings : public TOperationRequestSettings<TListObjectsInS3ExportSettings>,
+                                        public TS3Settings<TListObjectsInS3ExportSettings> {
+    using TSelf = TListObjectsInS3ExportSettings;
+
+    struct TItem {
+        // Database object path.
+        std::string Path = {};
+    };
+
+    FLUENT_SETTING_VECTOR(TItem, Item);
+    FLUENT_SETTING_OPTIONAL(uint32_t, NumberOfRetries);
+    FLUENT_SETTING_OPTIONAL(std::string, Prefix);
+    FLUENT_SETTING_OPTIONAL(std::string, SymmetricKey);
+};
+
+class TListObjectsInS3ExportResult : public TStatus {
+public:
+    struct TItem {
+        // S3 object prefix
+        std::string Prefix;
+
+        // Database object path
+        std::string Path;
+
+        void Out(IOutputStream& out) const;
+    };
+
+    TListObjectsInS3ExportResult(TStatus&& status, const ::Ydb::Import::ListObjectsInS3ExportResult& proto);
+
+    const std::vector<TItem>& GetItems() const;
+    const TString& NextPageToken() const { return NextPageToken_; }
+
+    void Out(IOutputStream& out) const;
+
+private:
+    std::vector<TItem> Items_;
+    TString NextPageToken_;
path: ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h
user: login: Gazizonoki
body: ```suggestion
    std::string NextPageToken_;
```
created_at: 2025-05-15T21:00:49Z
author_association: COLLABORATOR
diff_hunk: @@ -99,7 +146,9 @@ class TImportClient {
 public:
     TImportClient(const TDriver& driver, const TCommonClientSettings& settings = TCommonClientSettings());
 
-    NThreading::TFuture<TImportFromS3Response> ImportFromS3(const TImportFromS3Settings& settings);
+    TAsyncImportFromS3Response ImportFromS3(const TImportFromS3Settings& settings);
+
+    TAsyncListObjectsInS3ExportResult ListObjectsInS3Export(const TListObjectsInS3ExportSettings& settings, i64 pageSize = 0, const TString& pageToken = {});
path: ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/import/import.h
user: login: Gazizonoki
body: ```suggestion
    TAsyncListObjectsInS3ExportResult ListObjectsInS3Export(const TListObjectsInS3ExportSettings& settings, std::int64_t pageSize = 0, const std::string& pageToken = {});
```
created_at: 2025-05-15T21:01:23Z
author_association: COLLABORATOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-15T12:28:23Z
body: <!-- status pr=18366, validate PR description status -->
:green_circle: `2025-05-15 12:28:23 UTC` The validation of the Pull Request description is successful.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-15T13:07:14Z
body: <!-- status pr=18366, preset=release-asan, run=43070 -->
:white_circle: `2025-05-15 13:07:13 UTC` Pre-commit [check](https://github.com/ydb-platform/ydb/actions/runs/15044884215/job/42284889364) **linux-x86_64-release-asan** for 5df5a6ef1a86b5d7da68151039c6358ba697eae6 has started.
:white_circle: `2025-05-15 13:07:19 UTC` Artifacts will be uploaded [here](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/index.html)
:white_circle: `2025-05-15 13:10:19 UTC` ya make is running...
:yellow_circle: `2025-05-15 15:16:34 UTC` Some tests failed, follow the links below. This fail is not in blocking policy yet Going to retry failed tests...

<details>


[Test history](https://nebius.testmo.net/automation/runs/view/160897) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [14844](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/ya-test.html) | [14642](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/ya-test.html#PASS) | 0 | [127](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/ya-test.html#FAIL) | [48](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/ya-test.html#SKIP) | [27](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/ya-test.html#MUTE) |

</details>

:white_circle: `2025-05-15 15:17:52 UTC` ya make is running... (failed tests rerun, try 2)
:yellow_circle: `2025-05-15 15:50:22 UTC` Some tests failed, follow the links below. This fail is not in blocking policy yet Going to retry failed tests...

<details>


[Test history](https://nebius.testmo.net/automation/runs/view/161002) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [1556 (only retried tests)](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/ya-test.html) | [1423](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/ya-test.html#PASS) | 0 | [74](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/ya-test.html#FAIL) | [32](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/ya-test.html#SKIP) | [27](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/ya-test.html#MUTE) |

</details>

:white_circle: `2025-05-15 15:50:41 UTC` ya make is running... (failed tests rerun, try 3)
:yellow_circle: `2025-05-15 16:23:08 UTC` Some tests failed, follow the links below. This fail is not in blocking policy yet

[Test history](https://nebius.testmo.net/automation/runs/view/161030) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_1/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_2/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_3/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [1346 (only retried tests)](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_3/ya-test.html) | [1230](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_3/ya-test.html#PASS) | 0 | [73](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_3/ya-test.html#FAIL) | [18](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_3/ya-test.html#SKIP) | [25](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64-asan/try_3/ya-test.html#MUTE) |

:green_circle: `2025-05-15 16:23:23 UTC` Build successful.
:yellow_circle: `2025-05-15 16:23:54 UTC` ydbd size **3.9 GiB** changed* by **+871.0 KiB**, which is >= 100.0 KiB vs main: **Warning**
|[ydbd size dash](https://datalens.yandex/cu6hzmpaki700)|main: 386cc579acad102bf8fc39aecea9bd0185cafbf3 |merge: 5df5a6ef1a86b5d7da68151039c6358ba697eae6 |diff | diff %|
|:--- | ---: | ---: | ---: | ---: |
|ydbd size|**4 139 063 240** Bytes |**4 139 955 104** Bytes|**+871.0 KiB**|**+0.022%**|
|ydbd stripped size|**1 436 932 696** Bytes|**1 437 290 168** Bytes|**+349.1 KiB**|**+0.025%**|

<sup>*please be aware that the difference is based on comparing your commit and the last completed build from the post-commit, check [comparation](https://github.com/ydb-platform/ydb/compare/386cc579acad102bf8fc39aecea9bd0185cafbf3..5df5a6ef1a86b5d7da68151039c6358ba697eae6)</sup>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-15T15:12:41Z
body: <!-- status pr=18366, preset=relwithdebinfo, run=43070 -->
:white_circle: `2025-05-15 18:28:43 UTC` Pre-commit [check](https://github.com/ydb-platform/ydb/actions/runs/15044884215/job/42309692266) **linux-x86_64-relwithdebinfo** for 5df5a6ef1a86b5d7da68151039c6358ba697eae6 has started.
:white_circle: `2025-05-15 18:28:55 UTC` Artifacts will be uploaded [here](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/index.html)
:white_circle: `2025-05-15 18:31:52 UTC` ya make is running...
:yellow_circle: `2025-05-15 19:51:02 UTC` Some tests failed, follow the links below. Going to retry failed tests...

<details>


[Test history](https://nebius.testmo.net/automation/runs/view/161166) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [29867](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/ya-test.html) | [27177](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/ya-test.html#PASS) | 0 | [2](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/ya-test.html#FAIL) | [2645](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/ya-test.html#SKIP) | [43](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/ya-test.html#MUTE) |

</details>

:white_circle: `2025-05-15 19:53:31 UTC` ya make is running... (failed tests rerun, try 2)
:green_circle: `2025-05-15 20:17:33 UTC` Tests successful.

[Test history](https://nebius.testmo.net/automation/runs/view/161238) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_1/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_2/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [260 (only retried tests)](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_2/ya-test.html) | [217](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_2/ya-test.html#PASS) | 0 | 0 | [11](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_2/ya-test.html#SKIP) | [32](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15044884215/ya-x86-64/try_2/ya-test.html#MUTE) |

:green_circle: `2025-05-15 20:17:41 UTC` Build successful.
:yellow_circle: `2025-05-15 20:17:59 UTC` ydbd size **2.2 GiB** changed* by **+346.4 KiB**, which is >= 100.0 KiB vs main: **Warning**
|[ydbd size dash](https://datalens.yandex/cu6hzmpaki700)|main: 64ff4742b66be9621feb4b723a3d58d649338caf |merge: 5df5a6ef1a86b5d7da68151039c6358ba697eae6 |diff | diff %|
|:--- | ---: | ---: | ---: | ---: |
|ydbd size|**2 352 548 368** Bytes |**2 352 903 120** Bytes|**+346.4 KiB**|**+0.015%**|
|ydbd stripped size|**494 527 744** Bytes|**494 572 480** Bytes|**+43.7 KiB**|**+0.009%**|

<sup>*please be aware that the difference is based on comparing your commit and the last completed build from the post-commit, check [comparation](https://github.com/ydb-platform/ydb/compare/64ff4742b66be9621feb4b723a3d58d649338caf..5df5a6ef1a86b5d7da68151039c6358ba697eae6)</sup>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-15T21:27:50Z
body: <!-- status pr=18366, preset=release-asan, run=43122 -->
:white_circle: `2025-05-15 21:27:49 UTC` Pre-commit [check](https://github.com/ydb-platform/ydb/actions/runs/15055501353/job/42320357263) **linux-x86_64-release-asan** for ac871faa1f96a77f5f21152f147ba75bc8cc450f has started.
:white_circle: `2025-05-15 21:28:00 UTC` Artifacts will be uploaded [here](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/index.html)
:white_circle: `2025-05-15 21:30:50 UTC` ya make is running...
:yellow_circle: `2025-05-15 23:01:25 UTC` Some tests failed, follow the links below. This fail is not in blocking policy yet Going to retry failed tests...

<details>


[Test history](https://nebius.testmo.net/automation/runs/view/161329) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [15102](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/ya-test.html) | [14967](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/ya-test.html#PASS) | 0 | [77](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/ya-test.html#FAIL) | [31](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/ya-test.html#SKIP) | [27](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/ya-test.html#MUTE) |

</details>

:white_circle: `2025-05-15 23:02:43 UTC` ya make is running... (failed tests rerun, try 2)
:yellow_circle: `2025-05-15 23:33:46 UTC` Some tests failed, follow the links below. This fail is not in blocking policy yet Going to retry failed tests...

<details>


[Test history](https://nebius.testmo.net/automation/runs/view/161371) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [1306 (only retried tests)](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/ya-test.html) | [1188](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/ya-test.html#PASS) | 0 | [65](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/ya-test.html#FAIL) | [29](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/ya-test.html#SKIP) | [24](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/ya-test.html#MUTE) |

</details>

:white_circle: `2025-05-15 23:34:02 UTC` ya make is running... (failed tests rerun, try 3)
:yellow_circle: `2025-05-16 00:06:07 UTC` Some tests failed, follow the links below. This fail is not in blocking policy yet

[Test history](https://nebius.testmo.net/automation/runs/view/161402) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_1/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_2/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_3/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [1265 (only retried tests)](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_3/ya-test.html) | [1146](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_3/ya-test.html#PASS) | 0 | [60](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_3/ya-test.html#FAIL) | [36](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_3/ya-test.html#SKIP) | [23](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64-asan/try_3/ya-test.html#MUTE) |

:green_circle: `2025-05-16 00:06:21 UTC` Build successful.
:yellow_circle: `2025-05-16 00:06:55 UTC` ydbd size **3.9 GiB** changed* by **+501.6 KiB**, which is >= 100.0 KiB vs main: **Warning**
|[ydbd size dash](https://datalens.yandex/cu6hzmpaki700)|main: d2ef12e29157d07f440d85f38c26f7c0e3e5b3fc |merge: ac871faa1f96a77f5f21152f147ba75bc8cc450f |diff | diff %|
|:--- | ---: | ---: | ---: | ---: |
|ydbd size|**4 140 272 552** Bytes |**4 140 786 224** Bytes|**+501.6 KiB**|**+0.012%**|
|ydbd stripped size|**1 437 300 632** Bytes|**1 437 507 256** Bytes|**+201.8 KiB**|**+0.014%**|

<sup>*please be aware that the difference is based on comparing your commit and the last completed build from the post-commit, check [comparation](https://github.com/ydb-platform/ydb/compare/d2ef12e29157d07f440d85f38c26f7c0e3e5b3fc..ac871faa1f96a77f5f21152f147ba75bc8cc450f)</sup>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-15T21:27:53Z
body: <!-- status pr=18366, preset=relwithdebinfo, run=43122 -->
:white_circle: `2025-05-16 11:34:40 UTC` Pre-commit [check](https://github.com/ydb-platform/ydb/actions/runs/15055501353/job/42355545627) **linux-x86_64-relwithdebinfo** for ac871faa1f96a77f5f21152f147ba75bc8cc450f has started.
:white_circle: `2025-05-16 11:34:51 UTC` Artifacts will be uploaded [here](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/index.html)
:white_circle: `2025-05-16 11:37:43 UTC` ya make is running...
:yellow_circle: `2025-05-16 12:59:35 UTC` Some tests failed, follow the links below. Going to retry failed tests...

<details>


[Test history](https://nebius.testmo.net/automation/runs/view/161789) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [30021](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/ya-test.html) | [27341](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/ya-test.html#PASS) | 0 | [1](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/ya-test.html#FAIL) | [2641](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/ya-test.html#SKIP) | [38](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/ya-test.html#MUTE) |

</details>

:white_circle: `2025-05-16 13:02:15 UTC` ya make is running... (failed tests rerun, try 2)
:green_circle: `2025-05-16 13:28:05 UTC` Tests successful.

[Test history](https://nebius.testmo.net/automation/runs/view/161853) | [Ya make output](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/ya_make_output.txt) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_1/test_bloat/tree_map.html) | [Test bloat](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_2/test_bloat/tree_map.html)
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/ydb/tree/main/.github/config/muted_ya.txt "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [695 (only retried tests)](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_2/ya-test.html) | [664](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_2/ya-test.html#PASS) | 0 | 0 | [1](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_2/ya-test.html#SKIP) | [30](https://storage.yandexcloud.net/ydb-gh-logs/ydb-platform/ydb/PR-check/15055501353/ya-x86-64/try_2/ya-test.html#MUTE) |

:green_circle: `2025-05-16 13:28:16 UTC` Build successful.
:yellow_circle: `2025-05-16 13:28:33 UTC` ydbd size **2.2 GiB** changed* by **+164.8 KiB**, which is >= 100.0 KiB vs main: **Warning**
|[ydbd size dash](https://datalens.yandex/cu6hzmpaki700)|main: d2ef12e29157d07f440d85f38c26f7c0e3e5b3fc |merge: ac871faa1f96a77f5f21152f147ba75bc8cc450f |diff | diff %|
|:--- | ---: | ---: | ---: | ---: |
|ydbd size|**2 353 161 704** Bytes |**2 353 330 464** Bytes|**+164.8 KiB**|**+0.007%**|
|ydbd stripped size|**494 608 584** Bytes|**494 608 584** Bytes|**0 Bytes**|**0.000%**|

<sup>*please be aware that the difference is based on comparing your commit and the last completed build from the post-commit, check [comparation](https://github.com/ydb-platform/ydb/compare/d2ef12e29157d07f440d85f38c26f7c0e3e5b3fc..ac871faa1f96a77f5f21152f147ba75bc8cc450f)</sup>
author_association: NONE