summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPisarenko Grigoriy <[email protected]>2025-09-26 17:37:57 +0500
committerGitHub <[email protected]>2025-09-26 15:37:57 +0300
commit24eae22a6dca53c86ffbb77a942e7f2dac840df0 (patch)
tree472ca31400d96369bb635e2d9b4499072cfbe2f3
parent04c1916b565e8afaa7301b9798b828701db9aef1 (diff)
YQ-4664 used AS threads in topic sdk IO operations (#25668)
-rw-r--r--ydb/core/fq/libs/row_dispatcher/topic_session.cpp28
-rw-r--r--ydb/core/fq/libs/row_dispatcher/ya.make1
-rw-r--r--ydb/library/yql/providers/pq/async_io/dq_pq_read_actor.cpp53
-rw-r--r--ydb/library/yql/providers/pq/async_io/dq_pq_write_actor.cpp38
-rw-r--r--ydb/library/yql/providers/pq/common/pq_events_processor.h73
-rw-r--r--ydb/library/yql/providers/pq/common/ya.make2
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
)