diff options
author | Nikolay Perfilov <pnv1@yandex-team.ru> | 2025-07-15 14:34:25 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-15 14:34:25 +0300 |
commit | daa3c9f41349462899fc7d30b99255cfe1d08557 (patch) | |
tree | c3a91a85a16adccf34694d8131254add8a4d8abc | |
parent | 2343398c837b5650fed2d59a687907b1e71e8c34 (diff) | |
download | ydb-daa3c9f41349462899fc7d30b99255cfe1d08557.tar.gz |
Reset arenas on retries (#21138)
-rw-r--r-- | ydb/public/lib/ydb_cli/import/import.cpp | 14 |
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); |