diff options
author | ivanmorozov <[email protected]> | 2022-10-18 16:56:45 +0300 |
---|---|---|
committer | ivanmorozov <[email protected]> | 2022-10-18 16:56:45 +0300 |
commit | dafdfd006bf375ec29372727503fd7d707c7d9dd (patch) | |
tree | 273f9393d7fc5cbde017f704a6faff0f9ccc0c43 | |
parent | 55db30fd8a67561f343be996098d7c29de84f3cd (diff) |
actors object model
28 files changed, 279 insertions, 89 deletions
diff --git a/library/cpp/actors/core/CMakeLists.txt b/library/cpp/actors/core/CMakeLists.txt index 385c419b3a5..ee3cc959912 100644 --- a/library/cpp/actors/core/CMakeLists.txt +++ b/library/cpp/actors/core/CMakeLists.txt @@ -25,11 +25,14 @@ target_link_libraries(cpp-actors-core PUBLIC cpp-threading-future ) target_sources(cpp-actors-core PRIVATE + ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/actor_bootstrapped.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/actor_coroutine.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/actor.cpp + ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/actor_virtual.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/actorid.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/actorsystem.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/ask.cpp + ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/av_bootstrapped.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/balancer.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/buffer.cpp ${CMAKE_SOURCE_DIR}/library/cpp/actors/core/callstack.cpp diff --git a/library/cpp/actors/core/actor.cpp b/library/cpp/actors/core/actor.cpp index 42b47f38215..865eea89515 100644 --- a/library/cpp/actors/core/actor.cpp +++ b/library/cpp/actors/core/actor.cpp @@ -1,4 +1,5 @@ #include "actor.h" +#include "actor_virtual.h" #include "executor_thread.h" #include <library/cpp/actors/util/datetime.h> @@ -180,4 +181,16 @@ namespace NActors { double IActor::GetElapsedTicksAsSeconds() const { return NHPTimer::GetSeconds(ElapsedTicks); } + + void TActorCallbackBehaviour::Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) { + (actor->*StateFunc)(ev, ctx); + } + + void TActorVirtualBehaviour::Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) { + Y_VERIFY(!!ev); + Y_ASSERT(dynamic_cast<IEventBehavioral*>(ev->GetBase())); + IEventBehavioral* eActor = static_cast<IEventBehavioral*>(ev->GetBase()); + eActor->Execute(actor, ev, ctx); + } + } diff --git a/library/cpp/actors/core/actor.h b/library/cpp/actors/core/actor.h index 267107da846..66451712a54 100644 --- a/library/cpp/actors/core/actor.h +++ b/library/cpp/actors/core/actor.h @@ -220,20 +220,58 @@ namespace NActors { class TDecorator; - class IActor : protected IActorOps { + class TActorVirtualBehaviour { public: - typedef void (IActor::*TReceiveFunc)(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx); + static void Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx); + public: + }; + + class TActorCallbackBehaviour { + private: + using TBase = IActor; + friend class TDecorator; + public: + typedef void (IActor::* TReceiveFunc)(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx); private: TReceiveFunc StateFunc; + public: + TActorCallbackBehaviour() = default; + TActorCallbackBehaviour(TReceiveFunc stateFunc) + : StateFunc(stateFunc) { + } + // NOTE: exceptions must not escape state function but if an exception hasn't be caught + // by the actor then we want to crash an see the stack + void Receive(IActor* actor, TAutoPtr<IEventHandle>& ev, const TActorContext& ctx); + + template <typename T> + void Become(T stateFunc) { + StateFunc = static_cast<TReceiveFunc>(stateFunc); + } + + template <typename T, typename... TArgs> + void Become(T stateFunc, const TActorContext& ctx, TArgs&&... args) { + StateFunc = static_cast<TReceiveFunc>(stateFunc); + ctx.Schedule(std::forward<TArgs>(args)...); + } + + TReceiveFunc CurrentStateFunc() const { + return StateFunc; + } + + }; + + class IActor: protected IActorOps { + private: TActorIdentity SelfActorId; i64 ElapsedTicks; - ui64 HandledEvents; - friend void DoActorInit(TActorSystem*, IActor*, const TActorId&, const TActorId&); friend class TDecorator; - + const bool VirtualUsage = false; + protected: + TActorCallbackBehaviour CImpl; public: + using TReceiveFunc = TActorCallbackBehaviour::TReceiveFunc; /// @sa services.proto NKikimrServices::TActivity::EType enum EActorActivity { OTHER = 0, @@ -264,13 +302,22 @@ namespace NActors { ui32 ActivityType; protected: - IActor(TReceiveFunc stateFunc, ui32 activityType = OTHER) - : StateFunc(stateFunc) - , SelfActorId(TActorId()) + ui64 HandledEvents; + + IActor(TActorCallbackBehaviour&& cImpl, ui32 activityType = OTHER) + : SelfActorId(TActorId()) , ElapsedTicks(0) - , HandledEvents(0) + , CImpl(std::move(cImpl)) , ActivityType(activityType) - { + , HandledEvents(0) { + } + + IActor(ui32 activityType = OTHER) + : SelfActorId(TActorId()) + , ElapsedTicks(0) + , VirtualUsage(true) + , ActivityType(activityType) + , HandledEvents(0) { } public: @@ -281,51 +328,21 @@ namespace NActors { virtual void Die(const TActorContext& ctx); // would unregister actor so call exactly once and only from inside of message processing virtual void PassAway(); - public: - template <typename T> - void Become(T stateFunc) { - StateFunc = static_cast<TReceiveFunc>(stateFunc); - } - - template <typename T, typename... TArgs> - void Become(T stateFunc, const TActorContext& ctx, TArgs&&... args) { - StateFunc = static_cast<TReceiveFunc>(stateFunc); - ctx.Schedule(std::forward<TArgs>(args)...); - } - - template <typename T, typename... TArgs> - void Become(T stateFunc, TArgs&&... args) { - StateFunc = static_cast<TReceiveFunc>(stateFunc); - Schedule(std::forward<TArgs>(args)...); - } - protected: void SetActivityType(ui32 activityType) { ActivityType = activityType; } public: - TReceiveFunc CurrentStateFunc() const { - return StateFunc; - } - - // NOTE: exceptions must not escape state function but if an exception hasn't be caught - // by the actor then we want to crash an see the stack - void Receive(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) { - (this->*StateFunc)(ev, ctx); - HandledEvents++; - } - // must be called to wrap any call trasitions from one actor to another template<typename TActor, typename TMethod, typename... TArgs> static decltype((std::declval<TActor>().*std::declval<TMethod>())(std::declval<TArgs>()...)) - InvokeOtherActor(TActor& actor, TMethod&& method, TArgs&&... args) { - struct TRecurseContext : TActorContext { - TActivationContext *Prev; + InvokeOtherActor(TActor& actor, TMethod&& method, TArgs&&... args) { + struct TRecurseContext: TActorContext { + TActivationContext* Prev; TRecurseContext(const TActorId& actorId) : TActorContext(TActivationContext::ActorContextFor(actorId)) - , Prev(TlsActivationContext) - { + , Prev(TlsActivationContext) { TlsActivationContext = this; } ~TRecurseContext() { @@ -350,7 +367,7 @@ namespace NActors { void AddElapsedTicks(i64 ticks) { ElapsedTicks += ticks; } - auto GetActivityType() const { + ui32 GetActivityType() const { return ActivityType; } ui64 GetHandledEvents() const { @@ -359,6 +376,14 @@ namespace NActors { TActorIdentity SelfId() const { return SelfActorId; } + void Receive(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx) { + ++HandledEvents; + if (Y_UNLIKELY(VirtualUsage)) { + TActorVirtualBehaviour::Receive(this, ev, ctx); + } else { + CImpl.Receive(this, ev, ctx); + } + } protected: void Describe(IOutputStream&) const noexcept override; @@ -383,7 +408,7 @@ namespace NActors { // Register new actor in ActorSystem on same _mailbox_ as current actor. // There is one thread per mailbox to execute actor, which mean // no _cpu core scalability_ for such actors. - // This method of registration can be usefull if multiple actors share + // This method of registration can be useful if multiple actors share // some memory. TActorId RegisterWithSameMailbox(IActor* actor) const noexcept final; @@ -405,8 +430,44 @@ namespace NActors { return TLocalProcessKeyState<TActorActivityTag>::GetInstance().GetNameByIndex(index); } + class IActorCallback: public IActor { + public: + IActorCallback(TReceiveFunc stateFunc, ui32 activityType = OTHER) + : IActor(TActorCallbackBehaviour(stateFunc), activityType) { + + } + + template <typename T> + void Become(T stateFunc) { + CImpl.Become(stateFunc); + } + + template <typename T, typename... TArgs> + void Become(T stateFunc, const TActorContext& ctx, TArgs&&... args) { + CImpl.Become(stateFunc, ctx, std::forward<TArgs>(args)...); + } + + template <typename T, typename... TArgs> + void Become(T stateFunc, TArgs&&... args) { + CImpl.Become(stateFunc); + Schedule(std::forward<TArgs>(args)...); + } + + TReceiveFunc CurrentStateFunc() const { + return CImpl.CurrentStateFunc(); + } + }; + + class IActorVirtual: public IActor { + public: + IActorVirtual(ui32 activityType = OTHER) + : IActor(activityType) { + + } + }; + template <typename TDerived> - class TActor: public IActor { + class TActor: public IActorCallback { private: template <typename T, typename = const char*> struct HasActorName: std::false_type { }; @@ -438,7 +499,7 @@ namespace NActors { // static constexpr char ActorName[] = "UNNAMED"; TActor(void (TDerived::*func)(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx), ui32 activityType = GetActivityTypeIndex()) - : IActor(static_cast<TReceiveFunc>(func), activityType) + : IActorCallback(static_cast<TReceiveFunc>(func), activityType) { } public: @@ -486,13 +547,13 @@ namespace NActors { return TActorContext(tls.Mailbox, tls.ExecutorThread, tls.EventStart, id); } - class TDecorator : public IActor { + class TDecorator : public IActorCallback { protected: THolder<IActor> Actor; public: TDecorator(THolder<IActor>&& actor) - : IActor(static_cast<TReceiveFunc>(&TDecorator::State), actor->GetActivityType()) + : IActorCallback(static_cast<TReceiveFunc>(&TDecorator::State), actor->GetActivityType()) , Actor(std::move(actor)) { } diff --git a/library/cpp/actors/core/actor_bootstrapped.cpp b/library/cpp/actors/core/actor_bootstrapped.cpp new file mode 100644 index 00000000000..8c1effcd5d5 --- /dev/null +++ b/library/cpp/actors/core/actor_bootstrapped.cpp @@ -0,0 +1,4 @@ +#include "actor_bootstrapped.h" + +namespace NActors { +} diff --git a/library/cpp/actors/core/actor_bootstrapped.h b/library/cpp/actors/core/actor_bootstrapped.h index a37887c9398..46266fea78e 100644 --- a/library/cpp/actors/core/actor_bootstrapped.h +++ b/library/cpp/actors/core/actor_bootstrapped.h @@ -2,12 +2,13 @@ #include "actor.h" #include "events.h" +#include <util/generic/noncopyable.h> namespace NActors { template<typename T> struct dependent_false : std::false_type {}; template<typename TDerived> - class TActorBootstrapped : public TActor<TDerived> { + class TActorBootstrapped: public TActor<TDerived> { protected: TAutoPtr<IEventHandle> AfterRegister(const TActorId& self, const TActorId& parentId) override { return new IEventHandle(TEvents::TSystem::Bootstrap, 0, self, parentId, {}, 0); @@ -31,7 +32,7 @@ namespace NActors { } TActorBootstrapped() - : TActor<TDerived>(&TDerived::StateBootstrap) - {} + : TActor<TDerived>(&TDerived::StateBootstrap) { + } }; } diff --git a/library/cpp/actors/core/actor_coroutine.h b/library/cpp/actors/core/actor_coroutine.h index a2e2863c910..9aac2433030 100644 --- a/library/cpp/actors/core/actor_coroutine.h +++ b/library/cpp/actors/core/actor_coroutine.h @@ -150,12 +150,12 @@ namespace NActors { void DoRun() override final; }; - class TActorCoro : public IActor { + class TActorCoro : public IActorCallback { THolder<TActorCoroImpl> Impl; public: TActorCoro(THolder<TActorCoroImpl> impl, ui32 activityType = IActor::ACTOR_COROUTINE) - : IActor(static_cast<TReceiveFunc>(&TActorCoro::StateFunc), activityType) + : IActorCallback(static_cast<TReceiveFunc>(&TActorCoro::StateFunc), activityType) , Impl(std::move(impl)) {} diff --git a/library/cpp/actors/core/actor_virtual.cpp b/library/cpp/actors/core/actor_virtual.cpp new file mode 100644 index 00000000000..709cd7be15e --- /dev/null +++ b/library/cpp/actors/core/actor_virtual.cpp @@ -0,0 +1,6 @@ +#include "actor_virtual.h" + +namespace NActors { +
+
+} diff --git a/library/cpp/actors/core/actor_virtual.h b/library/cpp/actors/core/actor_virtual.h new file mode 100644 index 00000000000..c8c2aebd7eb --- /dev/null +++ b/library/cpp/actors/core/actor_virtual.h @@ -0,0 +1,62 @@ +#pragma once +#include "event.h" +#include "actor.h" + +namespace NActors { + +class IEventBehavioral: public IEventBase { +protected: + virtual bool DoExecute(IActor* actor, TAutoPtr<IEventHandle>& eventPtr, const NActors::TActorContext& ctx) = 0; +public: + bool Execute(IActor* actor, TAutoPtr<IEventHandle>& eventPtr, const NActors::TActorContext& ctx) { + return DoExecute(actor, eventPtr, ctx); + } +}; + +template <class TEvent, class TExpectedActor> +class IEventForActor: public IEventBehavioral { +protected: + virtual bool DoExecute(IActor* actor, TAutoPtr<IEventHandle>& eventPtr, const NActors::TActorContext& ctx) override { + Y_ASSERT(dynamic_cast<TExpectedActor*>(actor)); + Y_ASSERT(dynamic_cast<TEvent*>(eventPtr->GetBase())); + auto* actorCorrect = static_cast<TExpectedActor*>(actor); + TEvent* evPtrLocal(static_cast<TEvent*>(eventPtr->GetBase())); + actorCorrect->ProcessEvent(evPtrLocal, eventPtr, ctx); + return true; + } +public: +}; + +template <class TEvent, class TActor> +class TEventLocalForActor: public IEventForActor<TEvent, TActor> { +private: + using TBase = IEventForActor<TEvent, TActor>; + static TString GetClassTitle() { + return TStringBuilder() << typeid(TEvent).name() << "->" << typeid(TActor).name(); + } + static i64 LocalClassId; +public: + virtual ui32 Type() const override { + return LocalClassId; + } + virtual TString ToStringHeader() const override { + return GetClassTitle(); + } + + virtual bool SerializeToArcadiaStream(TChunkSerializer* /*serializer*/) const override { + Y_FAIL("Serialization of local event %s->%s", typeid(TEvent).name(), typeid(TActor).name()); + } + + virtual bool IsSerializable() const override { + return false; + } + + static IEventBase* Load(TEventSerializedData*) { + Y_FAIL("Loading of local event %s->%s", typeid(TEvent).name(), typeid(TActor).name()); + } +}; + +template <class TEvent, class TActor> +i64 TEventLocalForActor<TEvent, TActor>::LocalClassId = Singleton<TAtomicCounter>()->Inc(); + +} diff --git a/library/cpp/actors/core/actorsystem.h b/library/cpp/actors/core/actorsystem.h index dc0bdc370fa..b24e923e085 100644 --- a/library/cpp/actors/core/actorsystem.h +++ b/library/cpp/actors/core/actorsystem.h @@ -270,6 +270,11 @@ namespace NActors { bool SendWithContinuousExecution(TAutoPtr<IEventHandle> ev) const; bool Send(const TActorId& recipient, IEventBase* ev, ui32 flags = 0) const; + template <class TEvent, class... Types> + bool SendToActorId(const TActorId& recipient, Types... args) const { + return Send(recipient, new TEvent(args...), 0); + } + /** * Schedule one-shot event that will be send at given time point in the future. * diff --git a/library/cpp/actors/core/av_bootstrapped.cpp b/library/cpp/actors/core/av_bootstrapped.cpp new file mode 100644 index 00000000000..ec37611d987 --- /dev/null +++ b/library/cpp/actors/core/av_bootstrapped.cpp @@ -0,0 +1,17 @@ +#include "av_bootstrapped.h" + +namespace NActors { + +class TEventForStart: public TEventLocalForActor<TEventForStart, TActorAutoStart> { +public: +}; + +TAutoPtr<NActors::IEventHandle> TActorAutoStart::AfterRegister(const TActorId& self, const TActorId& parentId) { + return new IEventHandle(self, parentId, new TEventForStart, 0); +} + +void TActorAutoStart::ProcessEvent(TEventForStart* /*ev*/, TAutoPtr<IEventHandle>& handle, const NActors::TActorContext& ctx) { + DoOnStart(handle->Sender, ctx); +} + +} diff --git a/library/cpp/actors/core/av_bootstrapped.h b/library/cpp/actors/core/av_bootstrapped.h new file mode 100644 index 00000000000..16c110d4bea --- /dev/null +++ b/library/cpp/actors/core/av_bootstrapped.h @@ -0,0 +1,18 @@ +#pragma once +#include "actor_virtual.h" + +namespace NActors { + +class TEventForStart; + +class TActorAutoStart: public IActorVirtual { +protected: + virtual void DoOnStart(const TActorId& senderActorId, const ::NActors::TActorContext& ctx) = 0; + TAutoPtr<IEventHandle> AfterRegister(const TActorId& self, const TActorId& parentId) override; +public: + void ProcessEvent(TEventForStart* ev, TAutoPtr<IEventHandle>& handle, const NActors::TActorContext& ctx); + + TActorAutoStart() { + } +}; +} diff --git a/library/cpp/actors/core/executor_pool_basic_ut.cpp b/library/cpp/actors/core/executor_pool_basic_ut.cpp index 76dff693af5..3ef5808d725 100644 --- a/library/cpp/actors/core/executor_pool_basic_ut.cpp +++ b/library/cpp/actors/core/executor_pool_basic_ut.cpp @@ -18,7 +18,7 @@ struct TEvMsg : public NActors::TEventBase<TEvMsg, 10347> { //////////////////////////////////////////////////////////////////////////////// -class TTestSenderActor : public IActor { +class TTestSenderActor : public IActorCallback { private: using EActivityType = IActor::EActivityType ; using EActorActivity = IActor::EActorActivity; @@ -32,7 +32,7 @@ private: public: TTestSenderActor(std::function<void(void)> action = [](){}, EActivityType activityType = EActorActivity::OTHER) - : IActor(static_cast<TReceiveFunc>(&TTestSenderActor::Execute), activityType) + : IActorCallback(static_cast<TReceiveFunc>(&TTestSenderActor::Execute), activityType) , Action(action) {} diff --git a/library/cpp/actors/core/executor_pool_united_ut.cpp b/library/cpp/actors/core/executor_pool_united_ut.cpp index a1595d85883..8a59bef9743 100644 --- a/library/cpp/actors/core/executor_pool_united_ut.cpp +++ b/library/cpp/actors/core/executor_pool_united_ut.cpp @@ -30,7 +30,7 @@ inline ui64 DoTimedWork(ui64 workUs) { return nowUs - startUs; } -class TTestSenderActor : public IActor { +class TTestSenderActor : public IActorCallback { private: using EActivityType = IActor::EActivityType ; using EActorActivity = IActor::EActorActivity; @@ -44,7 +44,7 @@ private: public: TTestSenderActor(std::function<void(void)> action = [](){}, EActivityType activityType = EActorActivity::OTHER) - : IActor(static_cast<TReceiveFunc>(&TTestSenderActor::Execute), activityType) + : IActorCallback(static_cast<TReceiveFunc>(&TTestSenderActor::Execute), activityType) , Action(action) {} diff --git a/library/cpp/actors/helpers/flow_controlled_queue.cpp b/library/cpp/actors/helpers/flow_controlled_queue.cpp index d75cc540236..41e0944c628 100644 --- a/library/cpp/actors/helpers/flow_controlled_queue.cpp +++ b/library/cpp/actors/helpers/flow_controlled_queue.cpp @@ -12,7 +12,7 @@ namespace NActors { class TFlowControlledRequestQueue; -class TFlowControlledRequestActor : public IActor { +class TFlowControlledRequestActor : public IActorCallback { TFlowControlledRequestQueue * const QueueActor; void HandleReply(TAutoPtr<IEventHandle> &ev); @@ -24,7 +24,7 @@ public: const ui64 StartCounter; TFlowControlledRequestActor(ui32 activity, TFlowControlledRequestQueue *queue, TActorId source, ui64 cookie, ui32 flags) - : IActor(static_cast<TReceiveFunc>(&TFlowControlledRequestActor::StateWait), activity) + : IActorCallback(static_cast<TReceiveFunc>(&TFlowControlledRequestActor::StateWait), activity) , QueueActor(queue) , Source(source) , Cookie(cookie) @@ -48,7 +48,7 @@ public: using IActor::PassAway; }; -class TFlowControlledRequestQueue : public IActor { +class TFlowControlledRequestQueue : public IActorCallback { const TActorId Target; const TFlowControlledQueueConfig Config; @@ -154,7 +154,7 @@ class TFlowControlledRequestQueue : public IActor { } public: TFlowControlledRequestQueue(TActorId target, ui32 activity, const TFlowControlledQueueConfig &config) - : IActor(static_cast<TReceiveFunc>(&TFlowControlledRequestQueue::StateWork), activity) + : IActorCallback(static_cast<TReceiveFunc>(&TFlowControlledRequestQueue::StateWork), activity) , Target(target) , Config(config) , MinimalSeenLatency(TDuration::Seconds(1)) diff --git a/library/cpp/actors/interconnect/interconnect_proxy_wrapper.cpp b/library/cpp/actors/interconnect/interconnect_proxy_wrapper.cpp index 1c44b4c59b4..a450d168719 100644 --- a/library/cpp/actors/interconnect/interconnect_proxy_wrapper.cpp +++ b/library/cpp/actors/interconnect/interconnect_proxy_wrapper.cpp @@ -4,7 +4,7 @@ namespace NActors { - class TInterconnectProxyWrapper : public IActor { + class TInterconnectProxyWrapper : public IActorCallback { TIntrusivePtr<TInterconnectProxyCommon> Common; const ui32 NodeId; TInterconnectMock *Mock; @@ -12,7 +12,7 @@ namespace NActors { public: TInterconnectProxyWrapper(TIntrusivePtr<TInterconnectProxyCommon> common, ui32 nodeId, TInterconnectMock *mock) - : IActor(static_cast<TReceiveFunc>(&TInterconnectProxyWrapper::StateFunc), INTERCONNECT_PROXY_WRAPPER) + : IActorCallback(static_cast<TReceiveFunc>(&TInterconnectProxyWrapper::StateFunc), INTERCONNECT_PROXY_WRAPPER) , Common(std::move(common)) , NodeId(nodeId) , Mock(mock) diff --git a/ydb/core/actorlib_impl/actor_tracker.h b/ydb/core/actorlib_impl/actor_tracker.h index 66e953740d4..84ca8bc9487 100644 --- a/ydb/core/actorlib_impl/actor_tracker.h +++ b/ydb/core/actorlib_impl/actor_tracker.h @@ -79,14 +79,14 @@ namespace NActors { void SendUntrack(const TActorContext& ctx); }; - class TTrackedActorBase : public IActor { + class TTrackedActorBase : public IActorCallback { // plain pointer to tracker; tracker always lives longer than the tracked actors, so it is safe to reference // it in this way; the reference is filled in when RegisterSubactor is called TActorTracker *Tracker = nullptr; protected: TTrackedActorBase() - : IActor(static_cast<TReceiveFunc>(&TTrackedActorBase::InitialReceiveFunc)) + : IActorCallback(static_cast<TReceiveFunc>(&TTrackedActorBase::InitialReceiveFunc)) {} // subactor registration helpers diff --git a/ydb/core/tablet_flat/flat_bio_actor.cpp b/ydb/core/tablet_flat/flat_bio_actor.cpp index 6a866fb3956..311545d0fd6 100644 --- a/ydb/core/tablet_flat/flat_bio_actor.cpp +++ b/ydb/core/tablet_flat/flat_bio_actor.cpp @@ -14,7 +14,7 @@ using TEvGet = TEvBlobStorage::TEvGet; struct TBlockIO::TLoaded : public TEvBlobStorage::TEvGetResult::TResponse{ }; TBlockIO::TBlockIO(TActorId service, ui64 cookie) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TBlockIO::Inbox), NKikimrServices::TActivity::SAUSAGE_BIO_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TBlockIO::Inbox), NKikimrServices::TActivity::SAUSAGE_BIO_A) , Service(service) , Cookie(cookie) { diff --git a/ydb/core/tablet_flat/flat_bio_actor.h b/ydb/core/tablet_flat/flat_bio_actor.h index 6de0926223a..34866316bec 100644 --- a/ydb/core/tablet_flat/flat_bio_actor.h +++ b/ydb/core/tablet_flat/flat_bio_actor.h @@ -9,7 +9,7 @@ namespace NKikimr { namespace NTabletFlatExecutor { namespace NBlockIO { - class TBlockIO : public ::NActors::IActor { + class TBlockIO : public ::NActors::IActorCallback { using TEventHandlePtr = TAutoPtr<::NActors::IEventHandle>; using ELnLev = NUtil::ELnLev; using EStatus = NKikimrProto::EReplyStatus; diff --git a/ydb/core/tablet_flat/flat_ops_compact.h b/ydb/core/tablet_flat/flat_ops_compact.h index 3e00fbc393d..07d2af93da4 100644 --- a/ydb/core/tablet_flat/flat_ops_compact.h +++ b/ydb/core/tablet_flat/flat_ops_compact.h @@ -51,7 +51,7 @@ namespace NTabletFlatExecutor { TVector<ui32> YellowStopChannels; }; - class TOpsCompact: private ::NActors::IActor, public NTable::IVersionScan { + class TOpsCompact: private ::NActors::IActorCallback, public NTable::IVersionScan { using TEvPut = TEvBlobStorage::TEvPut; using TEvPutResult = TEvBlobStorage::TEvPutResult; using TScheme = NTable::TRowScheme; @@ -65,7 +65,7 @@ namespace NTabletFlatExecutor { constexpr static ui64 MaxFlight = 20ll * (1ll << 20); TOpsCompact(TActorId owner, TLogoBlobID mask, TAutoPtr<TCompactCfg> conf) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TOpsCompact::Inbox), NKikimrServices::TActivity::OPS_COMPACT_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TOpsCompact::Inbox), NKikimrServices::TActivity::OPS_COMPACT_A) , Mask(mask) , Owner(owner) , Conf(std::move(conf)) diff --git a/ydb/core/tablet_flat/test/libs/exec/dummy.h b/ydb/core/tablet_flat/test/libs/exec/dummy.h index 5c6e2f5b4f1..3cea54ac9fb 100644 --- a/ydb/core/tablet_flat/test/libs/exec/dummy.h +++ b/ydb/core/tablet_flat/test/libs/exec/dummy.h @@ -15,7 +15,7 @@ namespace NFake { virtual NFake::TEvExecute* OnFinished() = 0; }; - class TDummy : public ::NActors::IActor, public TExecuted { + class TDummy : public ::NActors::IActorCallback, public TExecuted { enum EState { Boot = 1, Work = 2, @@ -34,7 +34,7 @@ namespace NFake { TDummy(const TActorId &tablet, TInfo *info, const TActorId& owner, ui32 flags = 0 /* ORed EFlg enum */) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TDummy::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TDummy::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) , TTabletExecutedFlat(info, tablet, nullptr) , Owner(owner) , Flags(flags) diff --git a/ydb/core/tablet_flat/test/libs/exec/leader.h b/ydb/core/tablet_flat/test/libs/exec/leader.h index f964c4b33c3..61f03869af8 100644 --- a/ydb/core/tablet_flat/test/libs/exec/leader.h +++ b/ydb/core/tablet_flat/test/libs/exec/leader.h @@ -11,7 +11,7 @@ namespace NKikimr { namespace NFake { - class TLeader: public ::NActors::IActor { + class TLeader: public ::NActors::IActorCallback { enum class EState { Lock = 0, /* Do not start shutdown process */ Free = 1, /* Start to shut as Head will gone */ @@ -23,7 +23,7 @@ namespace NFake { using ELnLev = NUtil::ELnLev; TLeader(ui32 head, TAtomic &stopped) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TLeader::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TLeader::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) , Time(TAppData::TimeProvider.Get()) , Edge(head) /* Live until this runlevel exists */ , Stopped(stopped) diff --git a/ydb/core/tablet_flat/test/libs/exec/logger.h b/ydb/core/tablet_flat/test/libs/exec/logger.h index 471f00b8441..b8ca46b3dd7 100644 --- a/ydb/core/tablet_flat/test/libs/exec/logger.h +++ b/ydb/core/tablet_flat/test/libs/exec/logger.h @@ -112,13 +112,13 @@ namespace NFake { }; - class TLogFwd : public ::NActors::IActor { + class TLogFwd : public ::NActors::IActorCallback { public: using TEventHandlePtr = TAutoPtr<::NActors::IEventHandle>; using ELnLev = NUtil::ELnLev; TLogFwd(TIntrusivePtr<TSink> sink) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TLogFwd::Inbox), IActor::LOG_ACTOR) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TLogFwd::Inbox), IActor::LOG_ACTOR) , Sink(std::move(sink)) { } diff --git a/ydb/core/tablet_flat/test/libs/exec/nanny.h b/ydb/core/tablet_flat/test/libs/exec/nanny.h index 9b00928c8e4..b888da4ce6f 100644 --- a/ydb/core/tablet_flat/test/libs/exec/nanny.h +++ b/ydb/core/tablet_flat/test/libs/exec/nanny.h @@ -66,7 +66,7 @@ namespace NFake { }; - class TNanny : public ::NActors::IActor { + class TNanny : public ::NActors::IActorCallback { using TEventHandlePtr = TAutoPtr<::NActors::IEventHandle>; public: @@ -79,7 +79,7 @@ namespace NFake { }; TNanny() - : ::NActors::IActor(static_cast<TReceiveFunc>(&TNanny::Inbox)) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TNanny::Inbox)) , Fake(NTable::CreateFakeDb()) { Fake->Init(NTable::TScheme()); diff --git a/ydb/core/tablet_flat/test/libs/exec/owner.h b/ydb/core/tablet_flat/test/libs/exec/owner.h index 492d2541c52..015e42cc448 100644 --- a/ydb/core/tablet_flat/test/libs/exec/owner.h +++ b/ydb/core/tablet_flat/test/libs/exec/owner.h @@ -16,7 +16,7 @@ namespace NKikimr { namespace NFake { - class TOwner final : public ::NActors::IActor { + class TOwner final : public ::NActors::IActorCallback { public: using TEventHandlePtr = TAutoPtr<::NActors::IEventHandle>; using ELnLev = NUtil::ELnLev; @@ -24,7 +24,7 @@ namespace NFake { using TSetup = TTabletSetupInfo; TOwner(TActorId user, ui32 limit, TIntrusivePtr<TInfo> info, TIntrusivePtr<TSetup> setup, ui32 followerId) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TOwner::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TOwner::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) , Info(std::move(info)) , Setup(std::move(setup)) , User(user) diff --git a/ydb/core/tablet_flat/test/libs/exec/storage.h b/ydb/core/tablet_flat/test/libs/exec/storage.h index 76a937c4f8b..71a29ba92a7 100644 --- a/ydb/core/tablet_flat/test/libs/exec/storage.h +++ b/ydb/core/tablet_flat/test/libs/exec/storage.h @@ -7,14 +7,14 @@ namespace NKikimr { namespace NFake { - class TStorage : public ::NActors::IActor { + class TStorage : public ::NActors::IActorCallback { public: using TEventHandlePtr = TAutoPtr<::NActors::IEventHandle>; using ELnLev = NUtil::ELnLev; using NStore = TEvBlobStorage; TStorage(ui32 group) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TStorage::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TStorage::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) , Group(group) , Model(new NFake::TProxyDS) { diff --git a/ydb/core/tablet_flat/test/libs/exec/warden.h b/ydb/core/tablet_flat/test/libs/exec/warden.h index cc2afbde883..63b4a2526a1 100644 --- a/ydb/core/tablet_flat/test/libs/exec/warden.h +++ b/ydb/core/tablet_flat/test/libs/exec/warden.h @@ -13,7 +13,7 @@ namespace NKikimr { namespace NFake { - class TWarden : public ::NActors::IActor { + class TWarden : public ::NActors::IActorCallback { enum class EState : ui8 { Forbid = 0, @@ -28,7 +28,7 @@ namespace NFake { using ELnLev = NUtil::ELnLev; TWarden(ui32 groups) - : ::NActors::IActor(static_cast<TReceiveFunc>(&TWarden::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) + : ::NActors::IActorCallback(static_cast<TReceiveFunc>(&TWarden::Inbox), NKikimrServices::TActivity::FAKE_ENV_A) { Y_VERIFY(groups < State.size(), "Too many groups requested"); diff --git a/ydb/core/tx/datashard/datashard__conditional_erase_rows.cpp b/ydb/core/tx/datashard/datashard__conditional_erase_rows.cpp index 7f10ef955e3..8860e32f54a 100644 --- a/ydb/core/tx/datashard/datashard__conditional_erase_rows.cpp +++ b/ydb/core/tx/datashard/datashard__conditional_erase_rows.cpp @@ -32,7 +32,7 @@ protected: virtual void CloseEraser() = 0; }; -class TCondEraseScan: public IActor, public IScan, public IEraserOps { +class TCondEraseScan: public IActorCallback, public IScan, public IEraserOps { struct TDataShardId { TActorId ActorId; ui64 TabletId; @@ -215,7 +215,7 @@ class TCondEraseScan: public IActor, public IScan, public IEraserOps { public: explicit TCondEraseScan(TDataShard* ds, const TActorId& replyTo, const TTableId& tableId, ui64 txId, THolder<IEraseRowsCondition> condition, const TLimits& limits) - : IActor(static_cast<TReceiveFunc>(&TCondEraseScan::StateWork), NKikimrServices::TActivity::CONDITIONAL_ERASE_ROWS_SCAN_ACTOR) + : IActorCallback(static_cast<TReceiveFunc>(&TCondEraseScan::StateWork), NKikimrServices::TActivity::CONDITIONAL_ERASE_ROWS_SCAN_ACTOR) , TableId(tableId) , DataShard{ds->SelfId(), ds->TabletID()} , ReplyTo(replyTo) diff --git a/ydb/core/tx/datashard/export_scan.cpp b/ydb/core/tx/datashard/export_scan.cpp index c0a5901aefa..0538e88b856 100644 --- a/ydb/core/tx/datashard/export_scan.cpp +++ b/ydb/core/tx/datashard/export_scan.cpp @@ -17,7 +17,7 @@ using namespace NActors; using namespace NExportScan; using namespace NTable; -class TExportScan: private NActors::IActor, public NTable::IScan { +class TExportScan: private NActors::IActorCallback, public NTable::IScan { enum EStateBits { ES_REGISTERED = 0, // Actor is registered ES_INITIALIZED, // Seek(...) was called @@ -154,7 +154,7 @@ public: } explicit TExportScan(std::function<IActor*()>&& createUploaderFn, IBuffer::TPtr buffer) - : IActor(static_cast<TReceiveFunc>(&TExportScan::StateWork), NKikimrServices::TActivity::EXPORT_SCAN_ACTOR) + : IActorCallback(static_cast<TReceiveFunc>(&TExportScan::StateWork), NKikimrServices::TActivity::EXPORT_SCAN_ACTOR) , CreateUploaderFn(std::move(createUploaderFn)) , Buffer(std::move(buffer)) , Stats(new TStats) |