diff options
| author | Pisarenko Grigoriy <[email protected]> | 2025-09-26 17:37:57 +0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-26 15:37:57 +0300 |
| commit | 24eae22a6dca53c86ffbb77a942e7f2dac840df0 (patch) | |
| tree | 472ca31400d96369bb635e2d9b4499072cfbe2f3 | |
| parent | 04c1916b565e8afaa7301b9798b828701db9aef1 (diff) | |
YQ-4664 used AS threads in topic sdk IO operations (#25668)
6 files changed, 146 insertions, 49 deletions
diff --git a/ydb/core/fq/libs/row_dispatcher/topic_session.cpp b/ydb/core/fq/libs/row_dispatcher/topic_session.cpp index dd5b739c495..635c349deaa 100644 --- a/ydb/core/fq/libs/row_dispatcher/topic_session.cpp +++ b/ydb/core/fq/libs/row_dispatcher/topic_session.cpp @@ -5,13 +5,11 @@ #include <ydb/core/fq/libs/row_dispatcher/events/data_plane.h> #include <ydb/core/fq/libs/row_dispatcher/format_handler/format_handler.h> #include <ydb/core/protos/config.pb.h> - #include <ydb/library/actors/core/actor_bootstrapped.h> #include <ydb/library/actors/core/hfunc.h> #include <ydb/library/yql/dq/actors/dq.h> - +#include <ydb/library/yql/providers/pq/common/pq_events_processor.h> #include <ydb/public/sdk/cpp/adapters/issue/issue.h> - #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/client.h> #include <util/generic/queue.h> @@ -62,6 +60,7 @@ struct TEvPrivate { EvCreateSession, EvSendStatistic, EvReconnectSession, + EvExecuteTopicEvent, EvEnd }; static_assert(EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TEvents::ES_PRIVATE)"); @@ -71,13 +70,16 @@ struct TEvPrivate { struct TEvCreateSession : public TEventLocal<TEvCreateSession, EvCreateSession> {}; struct TEvSendStatistic : public TEventLocal<TEvSendStatistic, EvSendStatistic> {}; struct TEvReconnectSession : public TEventLocal<TEvReconnectSession, EvReconnectSession> {}; + struct TEvExecuteTopicEvent : public NYql::TTopicEventBase<TEvExecuteTopicEvent, EvExecuteTopicEvent> { + using TTopicEventBase::TTopicEventBase; + }; }; constexpr ui64 SendStatisticPeriodSec = 2; constexpr ui64 MaxHandledEventsCount = 1000; constexpr ui64 MaxHandledEventsSize = 1000000; -class TTopicSession : public TActorBootstrapped<TTopicSession> { +class TTopicSession : public TActorBootstrapped<TTopicSession>, NYql::TTopicEventProcessor<TEvPrivate::TEvExecuteTopicEvent> { private: using TBase = TActorBootstrapped<TTopicSession>; @@ -315,7 +317,7 @@ public: [[maybe_unused]] static constexpr char ActorName[] = "FQ_ROW_DISPATCHER_SESSION"; private: - NYdb::NTopic::TTopicClientSettings GetTopicClientSettings(bool useSsl) const; + NYdb::NTopic::TTopicClientSettings GetTopicClientSettings(bool useSsl); NYql::ITopicClient& GetTopicClient(bool useSsl); NYdb::NTopic::TReadSessionSettings GetReadSessionSettings(const TString& consumerName) const; void CreateTopicSession(); @@ -351,6 +353,7 @@ private: private: STRICT_STFUNC_EXC(StateFunc, + hFunc(TEvPrivate::TEvExecuteTopicEvent, HandleTopicEvent); hFunc(NFq::TEvPrivate::TEvPqEventsReady, Handle); hFunc(NFq::TEvPrivate::TEvCreateSession, Handle); hFunc(NFq::TEvPrivate::TEvSendStatistic, Handle); @@ -364,6 +367,7 @@ private: STRICT_STFUNC_EXC(ErrorState, cFunc(TEvents::TEvPoisonPill::EventType, PassAway); + hFunc(TEvPrivate::TEvExecuteTopicEvent, HandleTopicEvent); IgnoreFunc(NFq::TEvPrivate::TEvPqEventsReady); IgnoreFunc(NFq::TEvPrivate::TEvCreateSession); IgnoreFunc(TEvRowDispatcher::TEvGetNextBatch); @@ -446,12 +450,16 @@ void TTopicSession::SubscribeOnNextEvent() { }); } -NYdb::NTopic::TTopicClientSettings TTopicSession::GetTopicClientSettings(bool useSsl) const { - return PqGateway->GetTopicClientSettings() - .Database(Database) +NYdb::NTopic::TTopicClientSettings TTopicSession::GetTopicClientSettings(bool useSsl) { + auto opts = PqGateway->GetTopicClientSettings(); + SetupTopicClientSettings(ActorContext().ActorSystem(), SelfId(), opts); + + opts.Database(Database) .DiscoveryEndpoint(Endpoint) .SslCredentials(NYdb::TSslCredentials(useSsl)) .CredentialsProviderFactory(CredentialsProviderFactory); + + return opts; } NYql::ITopicClient& TTopicSession::GetTopicClient(bool useSsl) { @@ -983,7 +991,7 @@ void TTopicSession::RefreshParsers() { } } -} // anonymous namespace +} // anonymous namespace //////////////////////////////////////////////////////////////////////////////// @@ -1006,4 +1014,4 @@ std::unique_ptr<IActor> NewTopicSession( return std::unique_ptr<IActor>(new TTopicSession(readGroup, topicPath, endpoint, database, config, functionRegistry, rowDispatcherActorId, compileServiceActorId, partitionId, std::move(driver), credentialsProviderFactory, counters, countersRoot, pqGateway, maxBufferSize)); } -} // namespace NFq +} // namespace NFq diff --git a/ydb/core/fq/libs/row_dispatcher/ya.make b/ydb/core/fq/libs/row_dispatcher/ya.make index 73a6aad5493..f5ce290ff23 100644 --- a/ydb/core/fq/libs/row_dispatcher/ya.make +++ b/ydb/core/fq/libs/row_dispatcher/ya.make @@ -29,6 +29,7 @@ PEERDIR( ydb/library/yql/dq/actors/common ydb/library/yql/dq/actors/compute ydb/library/yql/dq/proto + ydb/library/yql/providers/pq/common ydb/library/yql/providers/pq/provider ydb/public/sdk/cpp/adapters/issue diff --git a/ydb/library/yql/providers/pq/async_io/dq_pq_read_actor.cpp b/ydb/library/yql/providers/pq/async_io/dq_pq_read_actor.cpp index cf91eef3065..c8d5c4f489a 100644 --- a/ydb/library/yql/providers/pq/async_io/dq_pq_read_actor.cpp +++ b/ydb/library/yql/providers/pq/async_io/dq_pq_read_actor.cpp @@ -1,47 +1,44 @@ #include "dq_pq_read_actor.h" +#include "dq_pq_meta_extractor.h" +#include "dq_pq_rd_read_actor.h" +#include "dq_pq_read_actor_base.h" #include "probes.h" +#include <ydb/core/fq/libs/row_dispatcher/events/data_plane.h> +#include <ydb/library/actors/core/actor.h> +#include <ydb/library/actors/core/event_local.h> +#include <ydb/library/actors/core/events.h> +#include <ydb/library/actors/core/hfunc.h> +#include <ydb/library/actors/core/log.h> +#include <ydb/library/actors/log_backend/actor_log_backend.h> #include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io_factory.h> #include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io.h> #include <ydb/library/yql/dq/actors/compute/dq_source_watermark_tracker.h> #include <ydb/library/yql/dq/actors/protos/dq_events.pb.h> #include <ydb/library/yql/dq/common/dq_common.h> #include <ydb/library/yql/dq/actors/compute/dq_checkpoints_states.h> - -#include <yql/essentials/minikql/comp_nodes/mkql_saveload.h> -#include <yql/essentials/minikql/mkql_alloc.h> -#include <yql/essentials/minikql/mkql_string_util.h> -#include <ydb/library/yql/providers/pq/async_io/dq_pq_meta_extractor.h> -#include <ydb/library/yql/providers/pq/async_io/dq_pq_rd_read_actor.h> -#include <ydb/library/yql/providers/pq/async_io/dq_pq_read_actor_base.h> +#include <ydb/library/yql/providers/pq/common/pq_events_processor.h> #include <ydb/library/yql/providers/pq/common/pq_meta_fields.h> #include <ydb/library/yql/providers/pq/common/pq_partition_key.h> #include <ydb/library/yql/providers/pq/proto/dq_io_state.pb.h> -#include <yql/essentials/utils/log/log.h> -#include <yql/essentials/utils/yql_panic.h> - +#include <ydb/public/sdk/cpp/adapters/issue/issue.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/federated_topic/federated_topic.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/client.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/credentials/credentials.h> -#include <ydb/library/actors/core/actor.h> -#include <ydb/library/actors/core/event_local.h> -#include <ydb/library/actors/core/events.h> -#include <ydb/library/actors/core/hfunc.h> -#include <ydb/library/actors/core/log.h> -#include <ydb/library/actors/log_backend/actor_log_backend.h> -#include <library/cpp/lwtrace/mon/mon_lwtrace.h> - -#include <ydb/core/fq/libs/row_dispatcher/events/data_plane.h> +#include <yql/essentials/minikql/comp_nodes/mkql_saveload.h> +#include <yql/essentials/minikql/mkql_alloc.h> +#include <yql/essentials/minikql/mkql_string_util.h> +#include <yql/essentials/utils/log/log.h> +#include <yql/essentials/utils/yql_panic.h> -#include <ydb/public/sdk/cpp/adapters/issue/issue.h> +#include <library/cpp/lwtrace/mon/mon_lwtrace.h> #include <util/generic/algorithm.h> #include <util/generic/hash.h> #include <util/generic/utility.h> #include <util/string/join.h> - #include <queue> #include <variant> @@ -81,6 +78,7 @@ struct TEvPrivate { EvReconnectSession, EvReceivedClusters, EvDescribeTopicResult, + EvExecuteTopicEvent, EvEnd }; @@ -116,10 +114,14 @@ struct TEvPrivate { ui32 PartitionsCount; TMaybe<NYdb::TStatus> Status; }; + struct TEvExecuteTopicEvent : public TTopicEventBase<TEvExecuteTopicEvent, EvExecuteTopicEvent> { + using TTopicEventBase::TTopicEventBase; + }; }; -} // namespace -class TDqPqReadActor : public NActors::TActor<TDqPqReadActor>, public NYql::NDq::NInternal::TDqPqReadActorBase { +} // anonymous namespace + +class TDqPqReadActor : public NActors::TActor<TDqPqReadActor>, public NYql::NDq::NInternal::TDqPqReadActorBase, TTopicEventProcessor<TEvPrivate::TEvExecuteTopicEvent> { static constexpr bool StaticDiscovery = true; struct TMetrics { TMetrics( @@ -232,8 +234,10 @@ public: return opts; } - NYdb::NTopic::TTopicClientSettings GetTopicClientSettings(TClusterState& state) const { + NYdb::NTopic::TTopicClientSettings GetTopicClientSettings(TClusterState& state) { NYdb::NTopic::TTopicClientSettings opts = PqGateway->GetTopicClientSettings(); + SetupTopicClientSettings(ActorContext().ActorSystem(), SelfId(), opts); + opts.Database(SourceParams.GetDatabase()) .DiscoveryEndpoint(SourceParams.GetEndpoint()) .SslCredentials(NYdb::TSslCredentials(SourceParams.GetUseSsl())) @@ -330,6 +334,7 @@ private: hFunc(TEvPrivate::TEvReconnectSession, Handle); hFunc(TEvPrivate::TEvReceivedClusters, Handle); hFunc(TEvPrivate::TEvDescribeTopicResult, Handle); + hFunc(TEvPrivate::TEvExecuteTopicEvent, HandleTopicEvent); ) void Handle(TEvPrivate::TEvSourceDataReady::TPtr& ev) { diff --git a/ydb/library/yql/providers/pq/async_io/dq_pq_write_actor.cpp b/ydb/library/yql/providers/pq/async_io/dq_pq_write_actor.cpp index 56c422a6f96..3590f3eeb22 100644 --- a/ydb/library/yql/providers/pq/async_io/dq_pq_write_actor.cpp +++ b/ydb/library/yql/providers/pq/async_io/dq_pq_write_actor.cpp @@ -1,27 +1,27 @@ #include "dq_pq_write_actor.h" #include "probes.h" +#include <ydb/library/actors/core/actor.h> +#include <ydb/library/actors/core/event_local.h> +#include <ydb/library/actors/core/events.h> +#include <ydb/library/actors/core/hfunc.h> +#include <ydb/library/actors/core/log.h> +#include <ydb/library/yql/dq/actors/compute/dq_checkpoints_states.h> #include <ydb/library/yql/dq/actors/compute/dq_compute_actor_async_io.h> #include <ydb/library/yql/dq/actors/protos/dq_events.pb.h> #include <ydb/library/yql/dq/common/dq_common.h> -#include <ydb/library/yql/dq/actors/compute/dq_checkpoints_states.h> +#include <ydb/library/yql/providers/pq/common/pq_events_processor.h> +#include <ydb/library/yql/providers/pq/proto/dq_io_state.pb.h> +#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/client.h> +#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/federated_topic/federated_topic.h> +#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/credentials/credentials.h> -#include <yql/essentials/utils/log/log.h> #include <yql/essentials/minikql/comp_nodes/mkql_saveload.h> #include <yql/essentials/minikql/mkql_alloc.h> #include <yql/essentials/minikql/mkql_string_util.h> -#include <ydb/library/yql/providers/pq/proto/dq_io_state.pb.h> +#include <yql/essentials/utils/log/log.h> #include <yql/essentials/utils/yql_panic.h> -#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/client.h> -#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/federated_topic/federated_topic.h> -#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/credentials/credentials.h> - -#include <ydb/library/actors/core/actor.h> -#include <ydb/library/actors/core/event_local.h> -#include <ydb/library/actors/core/events.h> -#include <ydb/library/actors/core/hfunc.h> -#include <ydb/library/actors/core/log.h> #include <library/cpp/lwtrace/mon/mon_lwtrace.h> #include <util/generic/algorithm.h> @@ -78,6 +78,7 @@ struct TEvPrivate { EvBegin = EventSpaceBegin(NActors::TEvents::ES_PRIVATE), EvPqEventsReady = EvBegin, + EvExecuteTopicEvent, EvEnd }; @@ -87,15 +88,19 @@ struct TEvPrivate { // Events struct TEvPqEventsReady : public TEventLocal<TEvPqEventsReady, EvPqEventsReady> {}; + + struct TEvExecuteTopicEvent : public TTopicEventBase<TEvExecuteTopicEvent, EvExecuteTopicEvent> { + using TTopicEventBase::TTopicEventBase; + }; }; TString MakeStringForLog(const NDqProto::TCheckpoint& checkpoint) { return TStringBuilder() << "[Checkpoint " << checkpoint.GetGeneration() << "." << checkpoint.GetId() << "] "; } -} // namespace +} // anonymous namespace -class TDqPqWriteActor : public NActors::TActor<TDqPqWriteActor>, public IDqComputeActorAsyncOutput { +class TDqPqWriteActor : public NActors::TActor<TDqPqWriteActor>, public IDqComputeActorAsyncOutput, TTopicEventProcessor<TEvPrivate::TEvExecuteTopicEvent> { struct TMetrics { TMetrics(const TTxId& txId, ui64 taskId, const ::NMonitoring::TDynamicCounterPtr& counters) : TxId(std::visit([](auto arg) { return ToString(arg); }, txId)) @@ -282,6 +287,7 @@ public: private: STRICT_STFUNC(StateFunc, hFunc(TEvPrivate::TEvPqEventsReady, Handle); + hFunc(TEvPrivate::TEvExecuteTopicEvent, HandleTopicEvent); ) void Handle(TEvPrivate::TEvPqEventsReady::TPtr&) { @@ -329,8 +335,10 @@ private: return *FederatedTopicClient; } - NYdb::NFederatedTopic::TFederatedTopicClientSettings GetFederatedTopicClientSettings() const { + NYdb::NFederatedTopic::TFederatedTopicClientSettings GetFederatedTopicClientSettings() { NYdb::NFederatedTopic::TFederatedTopicClientSettings opts = PqGateway->GetFederatedTopicClientSettings(); + SetupTopicClientSettings(ActorContext().ActorSystem(), SelfId(), opts); + opts.Database(SinkParams.GetDatabase()) .DiscoveryEndpoint(SinkParams.GetEndpoint()) .SslCredentials(NYdb::TSslCredentials(SinkParams.GetUseSsl())) diff --git a/ydb/library/yql/providers/pq/common/pq_events_processor.h b/ydb/library/yql/providers/pq/common/pq_events_processor.h new file mode 100644 index 00000000000..ee013a27a3e --- /dev/null +++ b/ydb/library/yql/providers/pq/common/pq_events_processor.h @@ -0,0 +1,73 @@ +#pragma once + +#include <ydb/library/actors/core/actorid.h> +#include <ydb/library/actors/core/actorsystem.h> +#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/client.h> +#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/executor.h> + +namespace NYql { + +template <typename TEv, ui32 TEventType> +class TTopicEventBase : public NActors::TEventLocal<TEv, TEventType> { +public: + explicit TTopicEventBase(NYdb::NTopic::IExecutor::TFunction&& f) + : Function(std::move(f)) + {} + + void Execute() { + Function(); + } + +private: + NYdb::NTopic::IExecutor::TFunction Function; +}; + +template <typename TTopicEvent> +class TTopicEventProcessor { + class TEventProxy final : public NYdb::NTopic::IExecutor { + public: + TEventProxy(NActors::TActorSystem* actorSystem, const NActors::TActorId& executerId) + : ActorSystem(actorSystem) + , ExecuterId(executerId) + { + Y_ENSURE(actorSystem); + } + + bool IsAsync() const final { + return true; + } + + void Post(TFunction&& f) final { + ActorSystem->Send(ExecuterId, new TTopicEvent(std::move(f))); + } + + private: + void DoStart() final { + } + + private: + NActors::TActorSystem* ActorSystem = nullptr; + const NActors::TActorId ExecuterId; + }; + +public: + template <typename TSettings> + void SetupTopicClientSettings(NActors::TActorSystem* actorSystem, const NActors::TActorId& selfId, TSettings& settings) { + if (!ExecuterProxy) { + ExecuterProxy = MakeIntrusive<TEventProxy>(actorSystem, selfId); + } + + settings.DefaultHandlersExecutor(ExecuterProxy); + settings.DefaultCompressionExecutor(ExecuterProxy); + } + +protected: + void HandleTopicEvent(TTopicEvent::TPtr& event) { + event->Get()->Execute(); + } + +private: + NYdb::NTopic::IExecutor::TPtr ExecuterProxy; +}; + +} // namespace NYql diff --git a/ydb/library/yql/providers/pq/common/ya.make b/ydb/library/yql/providers/pq/common/ya.make index e2dbc03f530..380338c2d62 100644 --- a/ydb/library/yql/providers/pq/common/ya.make +++ b/ydb/library/yql/providers/pq/common/ya.make @@ -7,6 +7,8 @@ SRCS( ) PEERDIR( + ydb/library/actors/core + ydb/public/sdk/cpp/src/client/topic yql/essentials/public/types ) |
