aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authora-sumin <a-sumin@yandex-team.com>2023-06-07 15:51:22 +0300
committera-sumin <a-sumin@yandex-team.com>2023-06-07 15:51:22 +0300
commit668b4b0738d0884b52e9212ea4ea1b78e5056937 (patch)
treedef96e2a92e5e116fa2975d9c8fdcb519649d4e9 /library/cpp
parentcb91ffc1454a6cc69c96fbba4f532454dc4cf747 (diff)
downloadydb-668b4b0738d0884b52e9212ea4ea1b78e5056937.tar.gz
Fix memory leak in TActorSystem
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/core/actor.h2
-rw-r--r--library/cpp/actors/core/actorsystem.cpp41
-rw-r--r--library/cpp/actors/core/actorsystem.h29
-rw-r--r--library/cpp/actors/interconnect/poller_actor.cpp2
-rw-r--r--library/cpp/actors/testlib/test_runtime.cpp14
-rw-r--r--library/cpp/actors/testlib/test_runtime.h24
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;