Skip to content

Commit 60342a8

Browse files
authored
25-1: Use type-safe actor activity type (#21686)
2 parents bdf32d7 + 6529c2e commit 60342a8

File tree

11 files changed

+128
-81
lines changed

11 files changed

+128
-81
lines changed

ydb/core/actorlib_impl/actor_activity_ut.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Y_UNIT_TEST_SUITE(TActorActivity) {
2929

3030
Y_UNIT_TEST(Basic) {
3131
TAutoPtr<IActor> actor = new TTestActor();
32-
const ui32 activityIndex = actor->GetActivityType();
32+
const ui32 activityIndex = actor->GetActivityType().GetIndex();
3333

3434
UNIT_ASSERT_VALUES_EQUAL(TLocalProcessKeyState<TActorActivityTag>::GetInstance().GetIndexByName("ASYNC_DESTROYER"), activityIndex);
3535

ydb/library/actors/core/actor.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,3 +542,8 @@ namespace NActors {
542542
TlsActivationContext->ExecutorThread.SetOverwrittenTimePerMailboxTs(value);
543543
}
544544
}
545+
546+
template <>
547+
void Out<NActors::TActorActivityType>(IOutputStream& o, const NActors::TActorActivityType& x) {
548+
o << x.GetName();
549+
}

ydb/library/actors/core/actor.h

Lines changed: 107 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,60 @@ namespace NActors {
353353
void DoActorInit() { LastUsageTimestamp = GetCycleCountFast(); }
354354
};
355355

356+
class TActorActivityType {
357+
public:
358+
TActorActivityType()
359+
: TActorActivityType(FromEnum(EInternalActorType::OTHER))
360+
{}
361+
362+
template <typename EEnum>
363+
static TActorActivityType FromEnum(EEnum activityType) requires (std::is_enum_v<EEnum>) {
364+
return FromIndex(TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityType));
365+
}
366+
367+
static TActorActivityType FromName(TStringBuf activityName) {
368+
return FromIndex(TLocalProcessKeyState<TActorActivityTag>::GetInstance().Register(activityName));
369+
}
370+
371+
template <const char* Name>
372+
static TActorActivityType FromStaticName() {
373+
return FromIndex(TLocalProcessKey<TActorActivityTag, Name>::GetIndex());
374+
}
375+
376+
template <typename T>
377+
static TActorActivityType FromTypeName() {
378+
// 200 characters is limit for solomon metric tag length
379+
return FromIndex(TLocalProcessExtKey<TActorActivityTag, T, 200>::GetIndex());
380+
}
381+
382+
static constexpr TActorActivityType FromIndex(size_t index) {
383+
return TActorActivityType(index);
384+
}
385+
386+
constexpr ui32 GetIndex() const {
387+
return Index;
388+
}
389+
390+
TStringBuf GetName() const {
391+
return TLocalProcessKeyState<TActorActivityTag>::GetInstance().GetNameByIndex(Index);
392+
}
393+
394+
friend constexpr bool operator==(TActorActivityType a, TActorActivityType b) = default;
395+
396+
template <typename EEnum>
397+
friend bool operator==(TActorActivityType a, EEnum b) requires (std::is_enum_v<EEnum>) {
398+
return a == FromEnum(b);
399+
}
400+
401+
private:
402+
explicit constexpr TActorActivityType(ui32 index)
403+
: Index(index)
404+
{}
405+
406+
private:
407+
ui32 Index;
408+
};
409+
356410
class IActor
357411
: protected IActorOps
358412
, public TActorUsageImpl<ActorLibCollectUsageStats>
@@ -374,13 +428,6 @@ namespace NActors {
374428
friend class TExecutorPoolBaseMailboxed;
375429
friend class TExecutorThread;
376430

377-
IActor(const ui32 activityType)
378-
: SelfActorId(TActorId())
379-
, ElapsedTicks(0)
380-
, ActivityType(activityType)
381-
, HandledEvents(0) {
382-
}
383-
384431
protected:
385432
TActorCallbackBehaviour CImpl;
386433
public:
@@ -389,29 +436,34 @@ namespace NActors {
389436
/// @sa services.proto NKikimrServices::TActivity::EType
390437
using EActorActivity = EInternalActorType;
391438
using EActivityType = EActorActivity;
392-
ui32 ActivityType;
439+
TActorActivityType ActivityType;
393440

394441
protected:
395442
ui64 HandledEvents;
396443

397-
template <typename EEnum = EActivityType, typename std::enable_if<std::is_enum<EEnum>::value, bool>::type v = true>
398-
IActor(const EEnum activityEnumType = EActivityType::OTHER)
399-
: IActor(TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityEnumType)) {
400-
}
444+
IActor(TActorActivityType activityType = {})
445+
: SelfActorId(TActorId())
446+
, ElapsedTicks(0)
447+
, ActivityType(activityType)
448+
, HandledEvents(0)
449+
{}
401450

402-
IActor(TActorCallbackBehaviour&& cImpl, const ui32 activityType)
451+
IActor(TActorCallbackBehaviour&& cImpl, TActorActivityType activityType = {})
403452
: SelfActorId(TActorId())
404453
, ElapsedTicks(0)
405454
, CImpl(std::move(cImpl))
406455
, ActivityType(activityType)
407456
, HandledEvents(0)
408-
{
409-
}
457+
{}
410458

411-
template <typename EEnum = EActivityType, typename std::enable_if<std::is_enum<EEnum>::value, bool>::type v = true>
412-
IActor(TActorCallbackBehaviour&& cImpl, const EEnum activityEnumType = EActivityType::OTHER)
413-
: IActor(std::move(cImpl), TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityEnumType)) {
414-
}
459+
template <typename EEnum>
460+
IActor(TActorCallbackBehaviour&& cImpl, EEnum activityType) requires (std::is_enum_v<EEnum>)
461+
: IActor(std::move(cImpl), TActorActivityType::FromEnum(activityType))
462+
{}
463+
464+
IActor(TActorCallbackBehaviour&& cImpl, TStringBuf activityName)
465+
: IActor(std::move(cImpl), TActorActivityType::FromName(activityName))
466+
{}
415467

416468
public:
417469
template <class TEventBase>
@@ -463,10 +515,19 @@ namespace NActors {
463515
virtual void PassAway();
464516

465517
protected:
466-
void SetActivityType(ui32 activityType) {
518+
void SetActivityType(TActorActivityType activityType) {
467519
ActivityType = activityType;
468520
}
469521

522+
template <typename EEnum>
523+
void SetActivityType(EEnum activityType) requires (std::is_enum_v<EEnum>) {
524+
ActivityType = TActorActivityType::FromEnum(activityType);
525+
}
526+
527+
void SetActivityType(TStringBuf activityName) {
528+
ActivityType = TActorActivityType::FromName(activityName);
529+
}
530+
470531
public:
471532
class TPassAwayGuard: TMoveOnly {
472533
private:
@@ -531,7 +592,7 @@ namespace NActors {
531592
void AddElapsedTicks(i64 ticks) {
532593
ElapsedTicks += ticks;
533594
}
534-
ui32 GetActivityType() const {
595+
TActorActivityType GetActivityType() const {
535596
return ActivityType;
536597
}
537598
ui64 GetHandledEvents() const {
@@ -639,18 +700,20 @@ namespace NActors {
639700
return TLocalProcessKeyState<TActorActivityTag>::GetInstance().GetNameByIndex(index);
640701
}
641702

703+
inline TStringBuf GetActivityTypeName(TActorActivityType activityType) {
704+
return activityType.GetName();
705+
}
706+
642707
class IActorCallback: public IActor {
643708
protected:
644-
template <class TEnum = IActor::EActivityType>
645-
IActorCallback(TReceiveFunc stateFunc, const TEnum activityType = IActor::EActivityType::OTHER)
646-
: IActor(TActorCallbackBehaviour(stateFunc), activityType) {
647-
648-
}
649-
650-
IActorCallback(TReceiveFunc stateFunc, const ui32 activityType)
651-
: IActor(TActorCallbackBehaviour(stateFunc), activityType) {
709+
IActorCallback(TReceiveFunc stateFunc)
710+
: IActor(TActorCallbackBehaviour(stateFunc))
711+
{}
652712

653-
}
713+
template <typename T>
714+
IActorCallback(TReceiveFunc stateFunc, T&& activityType)
715+
: IActor(TActorCallbackBehaviour(stateFunc), std::forward<T>(activityType))
716+
{}
654717

655718
public:
656719
template <typename T>
@@ -679,49 +742,32 @@ namespace NActors {
679742
private:
680743
using TDerivedReceiveFunc = void (TDerived::*)(TAutoPtr<IEventHandle>& ev);
681744

682-
template <typename T, typename = const char*>
683-
struct HasActorName: std::false_type {};
684-
template <typename T>
685-
struct HasActorName<T, decltype((void)T::ActorName, (const char*)nullptr)>: std::true_type {};
686-
687-
template <typename T, typename = const char*>
688-
struct HasActorActivityType: std::false_type {};
689-
template <typename T>
690-
struct HasActorActivityType<T, decltype((void)T::ActorActivityType, (const char*)nullptr)>: std::true_type {};
691-
692-
static ui32 GetActivityTypeIndexImpl() {
693-
if constexpr(HasActorName<TDerived>::value) {
694-
return TLocalProcessKey<TActorActivityTag, TDerived::ActorName>::GetIndex();
695-
} else if constexpr (HasActorActivityType<TDerived>::value) {
696-
using TActorActivity = decltype(((TDerived*)nullptr)->ActorActivityType());
697-
static_assert(std::is_enum<TActorActivity>::value);
698-
return TEnumProcessKey<TActorActivityTag, TActorActivity>::GetIndex(TDerived::ActorActivityType());
745+
static TActorActivityType GetDefaultActivityTypeImpl() {
746+
if constexpr (requires { TDerived::ActorName; }) {
747+
return TActorActivityType::FromStaticName<TDerived::ActorName>();
748+
} else if constexpr (requires { TDerived::ActorActivityType; }) {
749+
return TActorActivityType::FromEnum(TDerived::ActorActivityType());
699750
} else {
700-
// 200 characters is limit for solomon metric tag length
701-
return TLocalProcessExtKey<TActorActivityTag, TDerived, 200>::GetIndex();
751+
return TActorActivityType::FromTypeName<TDerived>();
702752
}
703753
}
704754

705-
static ui32 GetActivityTypeIndex() {
706-
static const ui32 result = GetActivityTypeIndexImpl();
755+
static TActorActivityType GetDefaultActivityType() {
756+
static const TActorActivityType result = GetDefaultActivityTypeImpl();
707757
return result;
708758
}
709759

710760
protected:
711761
// static constexpr char ActorName[] = "UNNAMED";
712762

713763
TActor(TDerivedReceiveFunc func)
714-
: IActorCallback(static_cast<TReceiveFunc>(func), GetActivityTypeIndex()) {
715-
}
764+
: IActorCallback(static_cast<TReceiveFunc>(func), GetDefaultActivityType())
765+
{}
716766

717-
template <class TEnum = EActivityType>
718-
TActor(TDerivedReceiveFunc func, const TEnum activityEnumType = EActivityType::OTHER)
719-
: IActorCallback(static_cast<TReceiveFunc>(func), activityEnumType) {
720-
}
721-
722-
TActor(TDerivedReceiveFunc func, const TString& actorName)
723-
: IActorCallback(static_cast<TReceiveFunc>(func), TLocalProcessKeyState<TActorActivityTag>::GetInstance().Register(actorName)) {
724-
}
767+
template <typename T>
768+
TActor(TDerivedReceiveFunc func, T&& activityType)
769+
: IActorCallback(static_cast<TReceiveFunc>(func), std::forward<T>(activityType))
770+
{}
725771

726772
public:
727773
typedef TDerived TThis;

ydb/library/actors/core/actor_bootstrapped.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,9 @@ namespace NActors {
3535
: TActor<TDerived>(&TDerived::StateBootstrap) {
3636
}
3737

38-
template <class TEnum>
39-
TActorBootstrapped(const TEnum activityType)
40-
: TActor<TDerived>(&TDerived::StateBootstrap, activityType) {
41-
}
42-
43-
TActorBootstrapped(const TString& activityName)
44-
: TActor<TDerived>(&TDerived::StateBootstrap, activityName) {
38+
template <typename T>
39+
TActorBootstrapped(T&& activityType)
40+
: TActor<TDerived>(&TDerived::StateBootstrap, std::forward<T>(activityType)) {
4541
}
4642
};
4743
}

ydb/library/actors/core/executor_pool_base.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ namespace NActors {
5656
Y_ABORT_UNLESS(actor->StuckIndex == i);
5757
const TDuration delta = now - actor->LastReceiveTimestamp;
5858
if (delta > TDuration::Seconds(30)) {
59-
++stats.StuckActorsByActivity[actor->GetActivityType()];
59+
++stats.StuckActorsByActivity[actor->GetActivityType().GetIndex()];
6060
}
61-
accountUsage(actor->GetActivityType(), actor->GetUsage(GetCycleCountFast()));
61+
accountUsage(actor->GetActivityType().GetIndex(), actor->GetUsage(GetCycleCountFast()));
6262
}
6363
for (const auto& [activityType, usage] : DeadActorsUsage) {
6464
accountUsage(activityType, usage);
@@ -188,7 +188,7 @@ namespace NActors {
188188
NHPTimer::STime hpstart = GetCycleCountFast();
189189
TInternalActorTypeGuard<EInternalActorSystemActivity::ACTOR_SYSTEM_REGISTER, false> activityGuard(hpstart);
190190
#ifdef ACTORSLIB_COLLECT_EXEC_STATS
191-
ui32 at = actor->GetActivityType();
191+
ui32 at = actor->GetActivityType().GetIndex();
192192
Y_DEBUG_ABORT_UNLESS(at < Stats.ActorsAliveByActivity.size());
193193
if (at >= Stats.MaxActivityType()) {
194194
at = TActorTypeOperator::GetActorActivityIncorrectIndex();
@@ -236,7 +236,7 @@ namespace NActors {
236236
NHPTimer::STime hpstart = GetCycleCountFast();
237237
TInternalActorTypeGuard<EInternalActorSystemActivity::ACTOR_SYSTEM_REGISTER, false> activityGuard(hpstart);
238238
#ifdef ACTORSLIB_COLLECT_EXEC_STATS
239-
ui32 at = actor->GetActivityType();
239+
ui32 at = actor->GetActivityType().GetIndex();
240240
if (at >= Stats.MaxActivityType())
241241
at = 0;
242242
AtomicIncrement(Stats.ActorsAliveByActivity[at]);

ydb/library/actors/core/executor_thread.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ namespace NActors {
8888
void TExecutorThread::UnregisterActor(TMailbox* mailbox, TActorId actorId) {
8989
Y_DEBUG_ABORT_UNLESS(actorId.PoolID() == ThreadCtx.PoolId() && ThreadCtx.Pool()->ResolveMailbox(actorId.Hint()) == mailbox);
9090
IActor* actor = mailbox->DetachActor(actorId.LocalId());
91-
ExecutionStats.DecrementActorsAliveByActivity(actor->GetActivityType());
91+
ExecutionStats.DecrementActorsAliveByActivity(actor->GetActivityType().GetIndex());
9292
DyingActors.push_back(THolder(actor));
9393
}
9494

@@ -103,7 +103,7 @@ namespace NActors {
103103
actorPtr = pool->Actors.back();
104104
actorPtr->StuckIndex = i;
105105
pool->Actors.pop_back();
106-
pool->DeadActorsUsage.emplace_back(actor->GetActivityType(), actor->GetUsage(GetCycleCountFast()));
106+
pool->DeadActorsUsage.emplace_back(actor->GetActivityType().GetIndex(), actor->GetUsage(GetCycleCountFast()));
107107
}
108108
}
109109
}
@@ -259,7 +259,7 @@ namespace NActors {
259259

260260
ui32 evTypeForTracing = ev->Type;
261261

262-
ui32 activityType = actor->GetActivityType();
262+
ui32 activityType = actor->GetActivityType().GetIndex();
263263
if (activityType != prevActivityType) {
264264
prevActivityType = activityType;
265265
NProfiling::TMemoryTagScope::Reset(activityType);

ydb/library/actors/core/ut/actor_ut.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ Y_UNIT_TEST_SUITE(TestDecorator) {
570570

571571
void Bootstrap()
572572
{
573-
const auto& activityTypeIndex = GetActivityType();
573+
auto activityTypeIndex = GetActivityType().GetIndex();
574574
Y_ENSURE(activityTypeIndex < GetActivityTypeCount());
575575
Y_ENSURE(GetActivityTypeName(activityTypeIndex) == "TestActor");
576576
PassAway();

ydb/library/actors/testlib/test_runtime.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1599,7 +1599,7 @@ namespace NActors {
15991599
if (!actor) {
16001600
return {};
16011601
}
1602-
return TLocalProcessKeyState<TActorActivityTag>::GetInstance().GetNameByIndex(actor->GetActivityType());
1602+
return actor->GetActivityType().GetName();
16031603
}
16041604

16051605
void TTestActorRuntimeBase::EnableScheduleForActor(const TActorId& actorId, bool allow) {

ydb/library/yql/dq/actors/compute/dq_compute_actor_channels.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ TString InFlightMessagesStr(const TCollection& inFlight) {
4040
} // anonymous namespace
4141

4242
TDqComputeActorChannels::TDqComputeActorChannels(TActorId owner, const TTxId& txId, const TDqTaskSettings& task,
43-
bool retryOnUndelivery, NDqProto::EDqStatsMode statsMode, ui64 channelBufferSize, ICallbacks* cbs, ui32 actorActivityType)
43+
bool retryOnUndelivery, NDqProto::EDqStatsMode statsMode, ui64 channelBufferSize, ICallbacks* cbs, NActors::TActorActivityType actorActivityType)
4444
: TActor(&TDqComputeActorChannels::WorkState, actorActivityType)
4545
, Owner(owner)
4646
, TxId(txId)

ydb/library/yql/dq/actors/compute/dq_compute_actor_channels.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class TDqComputeActorChannels : public NActors::TActor<TDqComputeActorChannels>
8383

8484
public:
8585
TDqComputeActorChannels(NActors::TActorId owner, const TTxId& txId, const TDqTaskSettings& task, bool retryOnUndelivery,
86-
NDqProto::EDqStatsMode statsMode, ui64 channelBufferSize, ICallbacks* cbs, ui32 actorActivityType);
86+
NDqProto::EDqStatsMode statsMode, ui64 channelBufferSize, ICallbacks* cbs, NActors::TActorActivityType actorActivityType);
8787

8888
private:
8989
STATEFN(WorkState);

0 commit comments

Comments
 (0)