diff options
author | a-sumin <a-sumin@yandex-team.com> | 2023-06-07 15:51:22 +0300 |
---|---|---|
committer | a-sumin <a-sumin@yandex-team.com> | 2023-06-07 15:51:22 +0300 |
commit | 668b4b0738d0884b52e9212ea4ea1b78e5056937 (patch) | |
tree | def96e2a92e5e116fa2975d9c8fdcb519649d4e9 /library/cpp | |
parent | cb91ffc1454a6cc69c96fbba4f532454dc4cf747 (diff) | |
download | ydb-668b4b0738d0884b52e9212ea4ea1b78e5056937.tar.gz |
Fix memory leak in TActorSystem
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/core/actor.h | 2 | ||||
-rw-r--r-- | library/cpp/actors/core/actorsystem.cpp | 41 | ||||
-rw-r--r-- | library/cpp/actors/core/actorsystem.h | 29 | ||||
-rw-r--r-- | library/cpp/actors/interconnect/poller_actor.cpp | 2 | ||||
-rw-r--r-- | library/cpp/actors/testlib/test_runtime.cpp | 14 | ||||
-rw-r--r-- | library/cpp/actors/testlib/test_runtime.h | 24 |
6 files changed, 80 insertions, 32 deletions
diff --git a/library/cpp/actors/core/actor.h b/library/cpp/actors/core/actor.h index d12266b0c51..32d9d0c6aff 100644 --- a/library/cpp/actors/core/actor.h +++ b/library/cpp/actors/core/actor.h @@ -876,6 +876,7 @@ namespace NActors { template <ESendingType SendingType> TActorId IActor::Register(IActor* actor, TMailboxType::EType mailboxType, ui32 poolId) const noexcept { + Y_VERIFY(actor); return TlsActivationContext->ExecutorThread.RegisterActor<SendingType>(actor, mailboxType, poolId, SelfActorId); } @@ -883,6 +884,7 @@ namespace NActors { template <ESendingType SendingType> TActorId TActorSystem::Register(IActor* actor, TMailboxType::EType mailboxType, ui32 executorPool, ui64 revolvingCounter, const TActorId& parentId) { + Y_VERIFY(actor); Y_VERIFY(executorPool < ExecutorPoolCount, "executorPool# %" PRIu32 ", ExecutorPoolCount# %" PRIu32, (ui32)executorPool, (ui32)ExecutorPoolCount); if constexpr (SendingType == ESendingType::Common) { diff --git a/library/cpp/actors/core/actorsystem.cpp b/library/cpp/actors/core/actorsystem.cpp index e6df9c2ee0a..81a2dd6446e 100644 --- a/library/cpp/actors/core/actorsystem.cpp +++ b/library/cpp/actors/core/actorsystem.cpp @@ -20,6 +20,37 @@ namespace NActors { LWTRACE_USING(ACTORLIB_PROVIDER); + TActorSetupCmd::TActorSetupCmd() + : MailboxType(TMailboxType::HTSwap) + , PoolId(0) + , Actor(nullptr) + { + } + + TActorSetupCmd::TActorSetupCmd(TActorSetupCmd&&) = default; + TActorSetupCmd& TActorSetupCmd::operator=(TActorSetupCmd&&) = default; + TActorSetupCmd::~TActorSetupCmd() = default; + + TActorSetupCmd::TActorSetupCmd(IActor* actor, TMailboxType::EType mailboxType, ui32 poolId) + : MailboxType(mailboxType) + , PoolId(poolId) + , Actor(actor) + { + } + + TActorSetupCmd::TActorSetupCmd(std::unique_ptr<IActor> actor, TMailboxType::EType mailboxType, ui32 poolId) + : MailboxType(mailboxType) + , PoolId(poolId) + , Actor(std::move(actor)) + { + } + + void TActorSetupCmd::Set(std::unique_ptr<IActor> actor, TMailboxType::EType mailboxType, ui32 poolId) { + MailboxType = mailboxType; + PoolId = poolId; + Actor = std::move(actor); + } + struct TActorSystem::TServiceMap : TNonCopyable { NActors::TServiceMap<TActorId, TActorId, TActorId::THash> LocalMap; TTicketLock Lock; @@ -236,12 +267,12 @@ namespace NActors { // setup interconnect proxies { - const TInterconnectSetup& setup = SystemSetup->Interconnect; + TInterconnectSetup& setup = SystemSetup->Interconnect; Interconnect.Reset(new TActorId[InterconnectCount + 1]); for (ui32 i = 0, e = InterconnectCount; i != e; ++i) { - const TActorSetupCmd& x = setup.ProxyActors[i]; + TActorSetupCmd& x = setup.ProxyActors[i]; if (x.Actor) { - Interconnect[i] = Register(x.Actor, x.MailboxType, x.PoolId, i); + Interconnect[i] = Register(x.Actor.release(), x.MailboxType, x.PoolId, i); Y_VERIFY(!!Interconnect[i]); } } @@ -251,8 +282,8 @@ namespace NActors { // setup local services { for (ui32 i = 0, e = (ui32)SystemSetup->LocalServices.size(); i != e; ++i) { - const std::pair<TActorId, TActorSetupCmd>& x = SystemSetup->LocalServices[i]; - const TActorId xid = Register(x.second.Actor, x.second.MailboxType, x.second.PoolId, i); + std::pair<TActorId, TActorSetupCmd>& x = SystemSetup->LocalServices[i]; + const TActorId xid = Register(x.second.Actor.release(), x.second.MailboxType, x.second.PoolId, i); Y_VERIFY(!!xid); if (!!x.first) RegisterLocalService(x.first, xid); diff --git a/library/cpp/actors/core/actorsystem.h b/library/cpp/actors/core/actorsystem.h index 9db3075ccf6..0740c70b137 100644 --- a/library/cpp/actors/core/actorsystem.h +++ b/library/cpp/actors/core/actorsystem.h @@ -64,27 +64,20 @@ namespace NActors { struct TActorSetupCmd { TMailboxType::EType MailboxType; ui32 PoolId; - IActor* Actor; + std::unique_ptr<IActor> Actor; - TActorSetupCmd() - : MailboxType(TMailboxType::HTSwap) - , PoolId(0) - , Actor(nullptr) - { - } + TActorSetupCmd(); + TActorSetupCmd(const TActorSetupCmd&) = delete; + TActorSetupCmd(TActorSetupCmd&&); + TActorSetupCmd& operator=(const TActorSetupCmd&) = delete; + TActorSetupCmd& operator=(TActorSetupCmd&&); + TActorSetupCmd(std::unique_ptr<IActor> actor, TMailboxType::EType mailboxType, ui32 poolId); + ~TActorSetupCmd(); - TActorSetupCmd(IActor* actor, TMailboxType::EType mailboxType, ui32 poolId) - : MailboxType(mailboxType) - , PoolId(poolId) - , Actor(actor) - { - } + // For legacy code, please do not use + TActorSetupCmd(IActor* actor, TMailboxType::EType mailboxType, ui32 poolId); - void Set(IActor* actor, TMailboxType::EType mailboxType, ui32 poolId) { - MailboxType = mailboxType; - PoolId = poolId; - Actor = actor; - } + void Set(std::unique_ptr<IActor> actor, TMailboxType::EType mailboxType, ui32 poolId); }; using TProxyWrapperFactory = std::function<TActorId(TActorSystem*, ui32)>; diff --git a/library/cpp/actors/interconnect/poller_actor.cpp b/library/cpp/actors/interconnect/poller_actor.cpp index 04e17c24ab3..1646aa7016f 100644 --- a/library/cpp/actors/interconnect/poller_actor.cpp +++ b/library/cpp/actors/interconnect/poller_actor.cpp @@ -288,7 +288,7 @@ namespace NActors { } IActor* CreatePollerActor() { - return new TPollerActor; + return new TPollerActor(); } } diff --git a/library/cpp/actors/testlib/test_runtime.cpp b/library/cpp/actors/testlib/test_runtime.cpp index 6fedca1cd22..e093b2e6bf4 100644 --- a/library/cpp/actors/testlib/test_runtime.cpp +++ b/library/cpp/actors/testlib/test_runtime.cpp @@ -751,7 +751,7 @@ namespace NActors { VERBOSE = verbose; } - void TTestActorRuntimeBase::AddLocalService(const TActorId& actorId, const TActorSetupCmd& cmd, ui32 nodeIndex) { + void TTestActorRuntimeBase::AddLocalService(const TActorId& actorId, TActorSetupCmd cmd, ui32 nodeIndex) { Y_VERIFY(!IsInitialized); Y_VERIFY(nodeIndex < NodeCount); auto node = Nodes[nodeIndex + FirstNodeId]; @@ -760,8 +760,8 @@ namespace NActors { Nodes[nodeIndex + FirstNodeId] = node; } - node->LocalServicesActors[actorId] = cmd.Actor; - node->LocalServices.push_back(std::make_pair(actorId, cmd)); + node->LocalServicesActors[actorId] = cmd.Actor.get(); + node->LocalServices.push_back(std::make_pair(actorId, TTestActorSetupCmd(std::move(cmd)))); } void TTestActorRuntimeBase::InitNodes() { @@ -1684,7 +1684,9 @@ namespace NActors { const auto& interconnectCounters = GetCountersForComponent(node->DynamicCounters, "interconnect"); - setup->LocalServices = node->LocalServices; + for (const auto& cmd : node->LocalServices) { + setup->LocalServices.emplace_back(cmd.first, TActorSetupCmd(cmd.second.Actor, cmd.second.MailboxType, cmd.second.PoolId)); + } setup->Interconnect.ProxyActors.resize(FirstNodeId + NodeCount); const TActorId nameserviceId = GetNameserviceActorId(); @@ -1734,8 +1736,8 @@ namespace NActors { NActors::TLoggerActor *loggerActor = new NActors::TLoggerActor(node->LogSettings, logBackend, GetCountersForComponent(node->DynamicCounters, "utils")); NActors::TActorSetupCmd loggerActorCmd(loggerActor, NActors::TMailboxType::Simple, node->GetLoggerPoolId()); - std::pair<NActors::TActorId, NActors::TActorSetupCmd> loggerActorPair(node->LogSettings->LoggerActorId, loggerActorCmd); - setup->LocalServices.push_back(loggerActorPair); + std::pair<NActors::TActorId, NActors::TActorSetupCmd> loggerActorPair(node->LogSettings->LoggerActorId, std::move(loggerActorCmd)); + setup->LocalServices.push_back(std::move(loggerActorPair)); } return THolder<TActorSystem>(new TActorSystem(setup, node->GetAppData(), node->LogSettings)); diff --git a/library/cpp/actors/testlib/test_runtime.h b/library/cpp/actors/testlib/test_runtime.h index 0c1e4207cc7..12c99ba8e64 100644 --- a/library/cpp/actors/testlib/test_runtime.h +++ b/library/cpp/actors/testlib/test_runtime.h @@ -42,6 +42,26 @@ const TDuration DEFAULT_DISPATCH_TIMEOUT = NSan::PlainOrUnderSanitizer( namespace NActors { struct THeSingleSystemEnv { }; + struct TTestActorSetupCmd { // like TActorSetupCmd, but not owning the Actor + TTestActorSetupCmd(IActor* actor, TMailboxType::EType mailboxType, ui32 poolId) + : MailboxType(mailboxType) + , PoolId(poolId) + , Actor(actor) + { + } + + TTestActorSetupCmd(TActorSetupCmd cmd) + : MailboxType(cmd.MailboxType) + , PoolId(cmd.PoolId) + , Actor(cmd.Actor.release()) + { + } + + TMailboxType::EType MailboxType; + ui32 PoolId; + IActor* Actor; + }; + struct TEventMailboxId { TEventMailboxId() : NodeId(0) @@ -236,7 +256,7 @@ namespace NActors { TMonotonic GetCurrentMonotonicTime() const; void UpdateCurrentTime(TInstant newTime); void AdvanceCurrentTime(TDuration duration); - void AddLocalService(const TActorId& actorId, const TActorSetupCmd& cmd, ui32 nodeIndex = 0); + void AddLocalService(const TActorId& actorId, TActorSetupCmd cmd, ui32 nodeIndex = 0); virtual void Initialize(); ui32 GetNodeId(ui32 index = 0) const; ui32 GetNodeCount() const; @@ -574,7 +594,7 @@ namespace NActors { TIntrusivePtr<NInterconnect::TPollerThreads> Poller; volatile ui64* ActorSystemTimestamp; volatile ui64* ActorSystemMonotonic; - TVector<std::pair<TActorId, TActorSetupCmd> > LocalServices; + TVector<std::pair<TActorId, TTestActorSetupCmd>> LocalServices; TMap<TActorId, IActor*> LocalServicesActors; TMap<IActor*, TActorId> ActorToActorId; THolder<TMailboxTable> MailboxTable; |