aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolay Perfilov <pnv1@yandex-team.ru>2025-07-15 14:34:25 +0300
committerGitHub <noreply@github.com>2025-07-15 14:34:25 +0300
commitdaa3c9f41349462899fc7d30b99255cfe1d08557 (patch)
treec3a91a85a16adccf34694d8131254add8a4d8abc
parent2343398c837b5650fed2d59a687907b1e71e8c34 (diff)
downloadydb-daa3c9f41349462899fc7d30b99255cfe1d08557.tar.gz
Reset arenas on retries (#21138)
-rw-r--r--ydb/public/lib/ydb_cli/import/import.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/ydb/public/lib/ydb_cli/import/import.cpp b/ydb/public/lib/ydb_cli/import/import.cpp
index c9b7a28881b..072fcaff722 100644
--- a/ydb/public/lib/ydb_cli/import/import.cpp
+++ b/ydb/public/lib/ydb_cli/import/import.cpp
@@ -984,13 +984,21 @@ inline TAsyncStatus TImportFileClient::TImpl::UpsertTValueBufferOnArena(
auto buildTValueAndSendRequest = [this, &buildFunc, &dbPath, &tableClient, &prebuiltValue, arena]() {
// For every retry attempt after first request build value from strings again
// to prevent copying data in retryFunc in a happy way when there is only one request
- TValue builtValue = prebuiltValue.has_value() ? std::move(prebuiltValue.value()) : buildFunc(arena.get());
- prebuiltValue = std::nullopt;
+ std::unique_ptr<TValue> builtValue;
+ if (prebuiltValue.has_value()) {
+ // Sending first request with prebuilt value
+ builtValue = std::make_unique<TValue>(std::move(prebuiltValue.value()));
+ prebuiltValue = std::nullopt;
+ } else {
+ // Building value from strings again for retry
+ arena->Reset();
+ builtValue = std::make_unique<TValue>(buildFunc(arena.get()));
+ }
auto settings = UpsertSettings;
settings.Arena(arena.get());
return tableClient.BulkUpsert(
- dbPath, std::move(builtValue), settings)
+ dbPath, std::move(*builtValue), settings)
.Apply([](const NYdb::NTable::TAsyncBulkUpsertResult& bulkUpsertResult) {
NYdb::TStatus status = bulkUpsertResult.GetValueSync();
return NThreading::MakeFuture(status);