diff --git a/ydb/core/external_sources/object_storage.cpp b/ydb/core/external_sources/object_storage.cpp index fc42c5479f58..a25bbe3d6f2e 100644 --- a/ydb/core/external_sources/object_storage.cpp +++ b/ydb/core/external_sources/object_storage.cpp @@ -279,7 +279,6 @@ struct TObjectStorageExternalSource : public IExternalSource { }; virtual NThreading::TFuture> LoadDynamicMetadata(std::shared_ptr meta) override { - Y_UNUSED(ActorSystem); auto format = meta->Attributes.FindPtr("format"); if (!format || !meta->Attributes.contains("withinfer")) { return NThreading::MakeFuture(std::move(meta)); @@ -322,7 +321,7 @@ struct TObjectStorageExternalSource : public IExternalSource { .Url = meta->DataSourceLocation, .Credentials = credentials, .Pattern = effectiveFilePattern, - }, Nothing(), AllowLocalFiles); + }, Nothing(), AllowLocalFiles, ActorSystem); auto afterListing = s3Lister->Next().Apply([path = effectiveFilePattern](const NThreading::TFuture& listResFut) { auto& listRes = listResFut.GetValue(); if (std::holds_alternative(listRes)) { diff --git a/ydb/core/fq/libs/actors/run_actor.cpp b/ydb/core/fq/libs/actors/run_actor.cpp index 82b984a27ead..f66a7eee4ee1 100644 --- a/ydb/core/fq/libs/actors/run_actor.cpp +++ b/ydb/core/fq/libs/actors/run_actor.cpp @@ -1971,7 +1971,7 @@ class TRunActor : public NActors::TActorBootstrapped { { dataProvidersInit.push_back(GetS3DataProviderInitializer(Params.S3Gateway, Params.CredentialsFactory, - Params.Config.GetReadActorsFactoryConfig().HasS3ReadActorFactoryConfig() ? Params.Config.GetReadActorsFactoryConfig().GetS3ReadActorFactoryConfig().GetAllowLocalFiles() : Params.Config.GetGateways().GetS3().GetAllowLocalFiles())); // This part is for backward compatibility. TODO: remove this part after migration to TS3GatewayConfig + Params.Config.GetReadActorsFactoryConfig().HasS3ReadActorFactoryConfig() ? Params.Config.GetReadActorsFactoryConfig().GetS3ReadActorFactoryConfig().GetAllowLocalFiles() : Params.Config.GetGateways().GetS3().GetAllowLocalFiles(), NActors::TActivationContext::ActorSystem())); // This part is for backward compatibility. TODO: remove this part after migration to TS3GatewayConfig } { diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp index d10ad0f6bd1b..da4df55f7d54 100644 --- a/ydb/core/kqp/host/kqp_host.cpp +++ b/ydb/core/kqp/host/kqp_host.cpp @@ -1700,6 +1700,7 @@ class TKqpHost : public IKqpHost { state->Gateway = FederatedQuerySetup->HttpGateway; state->GatewayRetryPolicy = NYql::GetHTTPDefaultRetryPolicy(NYql::THttpRetryPolicyOptions{.RetriedCurlCodes = NYql::FqRetriedCurlCodes()}); state->ExecutorPoolId = AppData()->UserPoolId; + state->ActorSystem = ActorSystem; auto dataSource = NYql::CreateS3DataSource(state); auto dataSink = NYql::CreateS3DataSink(state); diff --git a/ydb/library/yql/providers/s3/actors/yql_s3_source_queue.cpp b/ydb/library/yql/providers/s3/actors/yql_s3_source_queue.cpp index e308a5c65adc..918953ad5b8d 100644 --- a/ydb/library/yql/providers/s3/actors/yql_s3_source_queue.cpp +++ b/ydb/library/yql/providers/s3/actors/yql_s3_source_queue.cpp @@ -502,7 +502,8 @@ class TS3FileQueueActor : public NActors::TActorBootstrapped PatternType, object.GetPath()}, Nothing(), - AllowLocalFiles); + AllowLocalFiles, + NActors::TActivationContext::ActorSystem()); Fetch(); return true; } diff --git a/ydb/library/yql/providers/s3/object_listers/ya.make b/ydb/library/yql/providers/s3/object_listers/ya.make index 2d284a9b4d9a..62849a03a7de 100644 --- a/ydb/library/yql/providers/s3/object_listers/ya.make +++ b/ydb/library/yql/providers/s3/object_listers/ya.make @@ -14,6 +14,7 @@ PEERDIR( ydb/library/yql/providers/common/http_gateway ydb/library/yql/providers/s3/credentials ydb/library/yql/utils + ydb/library/yql/utils/actor_log ydb/library/yql/utils/threading ) diff --git a/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp b/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp index be5fd6134c2e..2f3bf284c498 100644 --- a/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp +++ b/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -25,7 +26,7 @@ namespace NYql::NS3Lister { IOutputStream& operator<<(IOutputStream& stream, const TListingRequest& request) { - return stream << "TListingRequest{.url=" << request.Url + return stream << "[TS3Lister] TListingRequest{.url=" << request.Url << ",.Prefix=" << request.Prefix << ",.Pattern=" << request.Pattern << ",.PatternType=" << request.PatternType @@ -50,7 +51,7 @@ std::pair MakeFilterRegexp(const TString& regex, const size_t numGroups = re->NumberOfCapturingGroups(); YQL_CLOG(DEBUG, ProviderS3) - << "Got regex: '" << regex << "' with " << numGroups << " capture groups "; + << "[TS3Lister] Got regex: '" << regex << "' with " << numGroups << " capture groups "; auto groups = std::make_shared>(numGroups); auto reArgs = std::make_shared>(numGroups); @@ -100,7 +101,7 @@ std::pair MakeFilterWildcard(const TString& patt } const auto regex = NS3::RegexFromWildcards(pattern); - YQL_CLOG(DEBUG, ProviderS3) << "Got prefix: '" << regexPatternPrefix << "', regex: '" + YQL_CLOG(DEBUG, ProviderS3) << "[TS3Lister] Got prefix: '" << regexPatternPrefix << "', regex: '" << regex << "' from original pattern '" << pattern << "'"; return MakeFilterRegexp(regex, sharedCtx); @@ -237,6 +238,8 @@ class TS3Lister : public IS3Lister { const TMaybe Delimiter; const TMaybe ContinuationToken; const ui64 MaxKeys; + const std::pair CurrentLogContextPath; + const NActors::TActorSystem* ActorSystem; }; TS3Lister( @@ -245,7 +248,8 @@ class TS3Lister : public IS3Lister { const TListingRequest& listingRequest, const TMaybe& delimiter, size_t maxFilesPerQuery, - TSharedListingContextPtr sharedCtx) + TSharedListingContextPtr sharedCtx, + NActors::TActorSystem* actorSystem) : MaxFilesPerQuery(maxFilesPerQuery) { Y_ENSURE( listingRequest.Url.substr(0, 7) != "file://", @@ -269,7 +273,9 @@ class TS3Lister : public IS3Lister { std::move(request), delimiter, Nothing(), - MaxFilesPerQuery}; + MaxFilesPerQuery, + NLog::CurrentLogContextPath(), + actorSystem}; YQL_CLOG(TRACE, ProviderS3) << "[TS3Lister] Got URL: '" << ctx.ListingRequest.Url @@ -334,9 +340,19 @@ class TS3Lister : public IS3Lister { /*data=*/"", retryPolicy); } + static IHTTPGateway::TOnResult CallbackFactoryMethod(TListingContext&& listingContext) { return [c = std::move(listingContext)](IHTTPGateway::TResult&& result) { - OnDiscovery(c, std::move(result)); + if (c.ActorSystem) { + NDq::TYqlLogScope logScope(c.ActorSystem, NKikimrServices::KQP_YQL, c.CurrentLogContextPath.first, c.CurrentLogContextPath.second); + OnDiscovery(c, std::move(result)); + } else { + /* + If the subsystem doesn't use the actor system + then there is a need to use an own YqlLoggerScope on the top level + */ + OnDiscovery(c, std::move(result)); + } }; } @@ -350,7 +366,7 @@ class TS3Lister : public IS3Lister { const NXml::TDocument xml(xmlString, NXml::TDocument::String); auto parsedResponse = ParseListObjectV2Response(xml, ctx.RequestId); YQL_CLOG(DEBUG, ProviderS3) - << "Listing of " << ctx.ListingRequest.Url + << "[TS3Lister] Listing of " << ctx.ListingRequest.Url << ctx.ListingRequest.Prefix << ": have " << ctx.Output->Size() << " entries, got another " << parsedResponse.KeyCount << " entries, request id: [" << ctx.RequestId << "]"; @@ -379,7 +395,7 @@ class TS3Lister : public IS3Lister { } if (parsedResponse.IsTruncated && !earlyStop) { - YQL_CLOG(DEBUG, ProviderS3) << "Listing of " << ctx.ListingRequest.Url + YQL_CLOG(DEBUG, ProviderS3) << "[TS3Lister] Listing of " << ctx.ListingRequest.Url << ctx.ListingRequest.Prefix << ": got truncated flag, will continue"; @@ -408,14 +424,14 @@ class TS3Lister : public IS3Lister { TStringBuilder{} << "request id: [" << ctx.RequestId << "]", std::move(result.Issues)); YQL_CLOG(INFO, ProviderS3) - << "Listing of " << ctx.ListingRequest.Url << ctx.ListingRequest.Prefix + << "[TS3Lister] Listing of " << ctx.ListingRequest.Url << ctx.ListingRequest.Prefix << ": got error from http gateway: " << issues.ToString(true); ctx.Promise.SetValue(TListError{EListError::GENERAL, std::move(issues)}); ctx.NextRequestPromise.SetValue(Nothing()); } } catch (const std::exception& ex) { YQL_CLOG(INFO, ProviderS3) - << "Listing of " << ctx.ListingRequest.Url << ctx.ListingRequest.Prefix + << "[TS3Lister] Listing of " << ctx.ListingRequest.Url << ctx.ListingRequest.Prefix << " : got exception: " << ex.what(); ctx.Promise.SetException(std::current_exception()); ctx.NextRequestPromise.SetValue(Nothing()); @@ -451,9 +467,10 @@ class TS3ParallelLimitedListerFactory : public IS3ListerFactory { using TPtr = std::shared_ptr; explicit TS3ParallelLimitedListerFactory( - size_t maxParallelOps, TSharedListingContextPtr sharedCtx) + size_t maxParallelOps, TSharedListingContextPtr sharedCtx, NActors::TActorSystem* actorSystem) : SharedCtx(std::move(sharedCtx)) - , Semaphore(TAsyncSemaphore::Make(std::max(1, maxParallelOps))) { } + , Semaphore(TAsyncSemaphore::Make(std::max(1, maxParallelOps))) + , ActorSystem(actorSystem) { } TFuture Make( const IHTTPGateway::TPtr& httpGateway, @@ -463,10 +480,10 @@ class TS3ParallelLimitedListerFactory : public IS3ListerFactory { bool allowLocalFiles) override { auto acquired = Semaphore->AcquireAsync(); return acquired.Apply( - [ctx = SharedCtx, httpGateway, retryPolicy, listingRequest, delimiter, allowLocalFiles](const auto& f) { + [ctx = SharedCtx, httpGateway, retryPolicy, listingRequest, delimiter, allowLocalFiles, actorSystem = ActorSystem](const auto& f) { return std::shared_ptr(new TListerLockReleaseWrapper{ NS3Lister::MakeS3Lister( - httpGateway, retryPolicy, listingRequest, delimiter, allowLocalFiles, ctx), + httpGateway, retryPolicy, listingRequest, delimiter, allowLocalFiles, actorSystem, ctx), std::make_unique( f.GetValue()->MakeAutoRelease())}); }); @@ -502,6 +519,7 @@ class TS3ParallelLimitedListerFactory : public IS3ListerFactory { private: TSharedListingContextPtr SharedCtx; const TAsyncSemaphore::TPtr Semaphore; + NActors::TActorSystem* ActorSystem; }; } // namespace @@ -512,10 +530,11 @@ IS3Lister::TPtr MakeS3Lister( const TListingRequest& listingRequest, const TMaybe& delimiter, bool allowLocalFiles, + NActors::TActorSystem* actorSystem, TSharedListingContextPtr sharedCtx) { if (listingRequest.Url.substr(0, 7) != "file://") { return std::make_shared( - httpGateway, retryPolicy, listingRequest, delimiter, 1000, std::move(sharedCtx)); + httpGateway, retryPolicy, listingRequest, delimiter, 1000, std::move(sharedCtx), actorSystem); } if (!allowLocalFiles) { @@ -529,13 +548,14 @@ IS3ListerFactory::TPtr MakeS3ListerFactory( size_t maxParallelOps, size_t callbackThreadCount, size_t callbackPerThreadQueueSize, - size_t regexpCacheSize) { + size_t regexpCacheSize, + NActors::TActorSystem* actorSystem) { std::shared_ptr sharedCtx = nullptr; if (callbackThreadCount != 0 || regexpCacheSize != 0) { sharedCtx = std::make_shared( callbackThreadCount, callbackPerThreadQueueSize, regexpCacheSize); } - return std::make_shared(maxParallelOps, sharedCtx); + return std::make_shared(maxParallelOps, sharedCtx, actorSystem); } } // namespace NYql::NS3Lister diff --git a/ydb/library/yql/providers/s3/object_listers/yql_s3_list.h b/ydb/library/yql/providers/s3/object_listers/yql_s3_list.h index 93fafae19057..3419ec3fd462 100644 --- a/ydb/library/yql/providers/s3/object_listers/yql_s3_list.h +++ b/ydb/library/yql/providers/s3/object_listers/yql_s3_list.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -169,6 +170,7 @@ IS3Lister::TPtr MakeS3Lister( const TListingRequest& listingRequest, const TMaybe& delimiter, bool allowLocalFiles, + NActors::TActorSystem* actorSystem, TSharedListingContextPtr sharedCtx = nullptr); class IS3ListerFactory { @@ -189,7 +191,8 @@ IS3ListerFactory::TPtr MakeS3ListerFactory( size_t maxParallelOps, size_t callbackThreadCount, size_t callbackPerThreadQueueSize, - size_t regexpCacheSize); + size_t regexpCacheSize, + NActors::TActorSystem* actorSystem); } // namespace NS3Lister } // namespace NYql diff --git a/ydb/library/yql/providers/s3/provider/yql_s3_io_discovery.cpp b/ydb/library/yql/providers/s3/provider/yql_s3_io_discovery.cpp index 2c1ee3313622..bf8e033d32d9 100644 --- a/ydb/library/yql/providers/s3/provider/yql_s3_io_discovery.cpp +++ b/ydb/library/yql/providers/s3/provider/yql_s3_io_discovery.cpp @@ -83,7 +83,8 @@ class TS3IODiscoveryTransformer : public TGraphTransformerBase { State_->Configuration->MaxInflightListsPerQuery, State_->Configuration->ListingCallbackThreadCount, State_->Configuration->ListingCallbackPerThreadQueueSize, - State_->Configuration->RegexpCacheSize)) + State_->Configuration->RegexpCacheSize, + State_->ActorSystem)) , ListingStrategy_(MakeS3ListingStrategy( State_->Gateway, State_->GatewayRetryPolicy, diff --git a/ydb/library/yql/providers/s3/provider/yql_s3_listing_strategy.cpp b/ydb/library/yql/providers/s3/provider/yql_s3_listing_strategy.cpp index 1c582018e157..18c374425eb3 100644 --- a/ydb/library/yql/providers/s3/provider/yql_s3_listing_strategy.cpp +++ b/ydb/library/yql/providers/s3/provider/yql_s3_listing_strategy.cpp @@ -492,8 +492,14 @@ class TBFSDirectoryResolverIterator : public IS3Lister { }); return NextDirectoryListeningChunk; } + + static TString ParseBasePath(const TString& path) { + TString basePath = TString{TStringBuf{path}.RBefore('/')}; + return basePath == path && !basePath.EndsWith('/') ? TString{} : basePath; + } + void PerformEarlyStop(TListEntries& result, const TString& sourcePrefix) { - result.Directories.push_back({.Path = sourcePrefix}); + result.Directories.push_back({.Path = ParseBasePath(sourcePrefix)}); for (auto& directoryPrefix : DirectoryPrefixQueue) { result.Directories.push_back({.Path = directoryPrefix}); } diff --git a/ydb/library/yql/providers/s3/provider/yql_s3_provider.cpp b/ydb/library/yql/providers/s3/provider/yql_s3_provider.cpp index 85707a21f16a..c283c53e8cab 100644 --- a/ydb/library/yql/providers/s3/provider/yql_s3_provider.cpp +++ b/ydb/library/yql/providers/s3/provider/yql_s3_provider.cpp @@ -4,8 +4,8 @@ namespace NYql { -TDataProviderInitializer GetS3DataProviderInitializer(IHTTPGateway::TPtr gateway, ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory, bool allowLocalFiles) { - return [gateway, credentialsFactory, allowLocalFiles] ( +TDataProviderInitializer GetS3DataProviderInitializer(IHTTPGateway::TPtr gateway, ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory, bool allowLocalFiles, NActors::TActorSystem* actorSystem) { + return [gateway, credentialsFactory, allowLocalFiles, actorSystem] ( const TString& userName, const TString& sessionId, const TGatewaysConfig* gatewaysConfig, @@ -31,6 +31,7 @@ TDataProviderInitializer GetS3DataProviderInitializer(IHTTPGateway::TPtr gateway state->Types = typeCtx.Get(); state->FunctionRegistry = functionRegistry; state->CredentialsFactory = credentialsFactory; + state->ActorSystem = actorSystem; if (gatewaysConfig) { state->Configuration->Init(gatewaysConfig->GetS3(), typeCtx); } diff --git a/ydb/library/yql/providers/s3/provider/yql_s3_provider.h b/ydb/library/yql/providers/s3/provider/yql_s3_provider.h index 0bcf96290c7a..f5eaa96630c4 100644 --- a/ydb/library/yql/providers/s3/provider/yql_s3_provider.h +++ b/ydb/library/yql/providers/s3/provider/yql_s3_provider.h @@ -32,9 +32,10 @@ struct TS3State : public TThrRefBase IHTTPGateway::TRetryPolicy::TPtr GatewayRetryPolicy = GetHTTPDefaultRetryPolicy(); ui32 ExecutorPoolId = 0; std::list> PrimaryKeys; + NActors::TActorSystem* ActorSystem = nullptr; }; -TDataProviderInitializer GetS3DataProviderInitializer(IHTTPGateway::TPtr gateway, ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory = nullptr, bool allowLocalFiles = false); +TDataProviderInitializer GetS3DataProviderInitializer(IHTTPGateway::TPtr gateway, ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory = nullptr, bool allowLocalFiles = false, NActors::TActorSystem* actorSystem = nullptr); TIntrusivePtr CreateS3DataSource(TS3State::TPtr state); TIntrusivePtr CreateS3DataSink(TS3State::TPtr state); diff --git a/ydb/library/yql/tools/dqrun/dqrun.cpp b/ydb/library/yql/tools/dqrun/dqrun.cpp index c69af2f6c7cd..f8f6a2a4d0a1 100644 --- a/ydb/library/yql/tools/dqrun/dqrun.cpp +++ b/ydb/library/yql/tools/dqrun/dqrun.cpp @@ -931,7 +931,7 @@ int RunMain(int argc, const char* argv[]) if (!httpGateway) { httpGateway = IHTTPGateway::Make(gatewaysConfig.HasHttpGateway() ? &gatewaysConfig.GetHttpGateway() : nullptr); } - dataProvidersInit.push_back(GetS3DataProviderInitializer(httpGateway, nullptr, true)); + dataProvidersInit.push_back(GetS3DataProviderInitializer(httpGateway, nullptr, true, actorSystemManager->GetActorSystem())); } if (gatewaysConfig.HasPq()) { diff --git a/ydb/tests/fq/s3/test_s3_1.py b/ydb/tests/fq/s3/test_s3_1.py index 2a117867c7a5..0f4260bdf4cc 100644 --- a/ydb/tests/fq/s3/test_s3_1.py +++ b/ydb/tests/fq/s3/test_s3_1.py @@ -481,3 +481,79 @@ def test_huge_source(self, kikimr, s3, client, runtime_listing, unique_prefix): assert result_set.rows[0].items[0].uint64_value == 1024 * 10 # 1024 x 1024 x 10 = 10 MB of raw data + little overhead for header, eols etc assert sum(kikimr.control_plane.get_metering(1)) == 21 + + # it looks like the runtime_listing for v1 doesn't work in case of + # restart of query because the v1 keeps the compiled query in the cache + @yq_all + @pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True) + @pytest.mark.parametrize("runtime_listing", ["false", "true"]) + def test_top_level_listing(self, kikimr, s3, client, runtime_listing, unique_prefix): + resource = boto3.resource( + "s3", endpoint_url=s3.s3_url, aws_access_key_id="key", aws_secret_access_key="secret_key" + ) + + bucket = resource.Bucket("fbucket") + bucket.create(ACL='public-read') + bucket.objects.all().delete() + + s3_client = boto3.client( + "s3", endpoint_url=s3.s3_url, aws_access_key_id="key", aws_secret_access_key="secret_key" + ) + + fruits = '''Fruit,Price,Weight +Banana,3,100 +Apple,2,22 +Pear,15,33''' + s3_client.put_object(Body=fruits, Bucket='fbucket', Key='2024-08-09.csv', ContentType='text/plain') + s3_client.put_object(Body=fruits, Bucket='fbucket', Key='2024-08-08.csv', ContentType='text/plain') + + kikimr.control_plane.wait_bootstrap(1) + storage_connection_name = unique_prefix + "test_top_level_listing" + client.create_storage_connection(storage_connection_name, "fbucket") + + sql = f''' + pragma s3.UseRuntimeListing="{runtime_listing}"; + + SELECT * + FROM `{storage_connection_name}`.`/2024-08-*` + WITH (format=csv_with_names, SCHEMA ( + Fruit String NOT NULL, + Price Int NOT NULL, + Weight Int NOT NULL + ) + ); + ''' + + query_id = client.create_query("simple", sql, type=fq.QueryContent.QueryType.ANALYTICS).result.query_id + client.wait_query_status(query_id, fq.QueryMeta.COMPLETED) + + data = client.get_result_data(query_id) + result_set = data.result.result_set + logging.debug(str(result_set)) + assert len(result_set.columns) == 3 + assert result_set.columns[0].name == "Fruit" + assert result_set.columns[0].type.type_id == ydb.Type.STRING + assert result_set.columns[1].name == "Price" + assert result_set.columns[1].type.type_id == ydb.Type.INT32 + assert result_set.columns[2].name == "Weight" + assert result_set.columns[2].type.type_id == ydb.Type.INT32 + assert len(result_set.rows) == 6 + assert result_set.rows[0].items[0].bytes_value == b"Banana" + assert result_set.rows[0].items[1].int32_value == 3 + assert result_set.rows[0].items[2].int32_value == 100 + assert result_set.rows[1].items[0].bytes_value == b"Apple" + assert result_set.rows[1].items[1].int32_value == 2 + assert result_set.rows[1].items[2].int32_value == 22 + assert result_set.rows[2].items[0].bytes_value == b"Pear" + assert result_set.rows[2].items[1].int32_value == 15 + assert result_set.rows[2].items[2].int32_value == 33 + assert result_set.rows[3].items[0].bytes_value == b"Banana" + assert result_set.rows[3].items[1].int32_value == 3 + assert result_set.rows[3].items[2].int32_value == 100 + assert result_set.rows[4].items[0].bytes_value == b"Apple" + assert result_set.rows[4].items[1].int32_value == 2 + assert result_set.rows[4].items[2].int32_value == 22 + assert result_set.rows[5].items[0].bytes_value == b"Pear" + assert result_set.rows[5].items[1].int32_value == 15 + assert result_set.rows[5].items[2].int32_value == 33 + assert sum(kikimr.control_plane.get_metering(1)) == 10 diff --git a/ydb/tests/tools/fq_runner/kikimr_runner.py b/ydb/tests/tools/fq_runner/kikimr_runner.py index f1ed9a18d6d9..3161591f2c78 100644 --- a/ydb/tests/tools/fq_runner/kikimr_runner.py +++ b/ydb/tests/tools/fq_runner/kikimr_runner.py @@ -484,7 +484,7 @@ def fill_config(self, control_plane): self.config_generator.yaml_config['grpc_config']['skip_scheme_check'] = True self.config_generator.yaml_config['grpc_config']['services'] = ["local_discovery", "yq", "yq_private"] # yq services - fq_config['control_plane_storage']['task_lease_ttl'] = "10s" + fq_config['control_plane_storage']['task_lease_ttl'] = "20s" self.fill_storage_config(fq_config['control_plane_storage']['storage'], "DbPoolStorage_" + self.uuid) else: self.config_generator.yaml_config.pop('grpc_config', None)