From 09c3cadfa08a0b9d107aef425ae77894e1824d93 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Mon, 15 Jul 2024 17:44:50 +0300 Subject: [PATCH] 24.3: Fix null dereference in node broker (KIKIMR-21693) (#6516) (#6623) --- ydb/core/mind/node_broker.cpp | 18 +++++++++----- ydb/core/mind/node_broker__register_node.cpp | 15 +++++------- ydb/core/mind/node_broker_impl.h | 24 ++++++++++++++++--- ydb/public/lib/ydb_cli/commands/ydb_tools.cpp | 2 +- 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/ydb/core/mind/node_broker.cpp b/ydb/core/mind/node_broker.cpp index 27f96e66ca40..865daaee8527 100644 --- a/ydb/core/mind/node_broker.cpp +++ b/ydb/core/mind/node_broker.cpp @@ -860,9 +860,9 @@ void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, LOG_TRACE_S(ctx, NKikimrServices::NODE_BROKER, "Handle TEvNodeBroker::TEvRegistrationRequest" << ": request# " << ev->Get()->Record.ShortDebugString()); - class TRegisterNodeActor : public TActorBootstrapped { + class TResolveTenantActor : public TActorBootstrapped { TEvNodeBroker::TEvRegistrationRequest::TPtr Ev; - TNodeBroker *Self; + TActorId ReplyTo; NActors::TScopeId ScopeId; TSubDomainKey ServicedSubDomain; @@ -871,9 +871,9 @@ void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, return NKikimrServices::TActivity::NODE_BROKER_ACTOR; } - TRegisterNodeActor(TEvNodeBroker::TEvRegistrationRequest::TPtr& ev, TNodeBroker *self) + TResolveTenantActor(TEvNodeBroker::TEvRegistrationRequest::TPtr& ev, TActorId replyTo) : Ev(ev) - , Self(self) + , ReplyTo(replyTo) {} void Bootstrap(const TActorContext& ctx) { @@ -930,7 +930,7 @@ void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, << ": scope id# " << ScopeIdToString(ScopeId) << ": serviced subdomain# " << ServicedSubDomain); - Self->ProcessTx(Self->CreateTxRegisterNode(Ev, ScopeId, ServicedSubDomain), ctx); + Send(ReplyTo, new TEvPrivate::TEvResolvedRegistrationRequest(Ev, ScopeId, ServicedSubDomain)); Die(ctx); } @@ -939,7 +939,7 @@ void TNodeBroker::Handle(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, CFunc(TEvents::TSystem::Undelivered, HandleUndelivered) }) }; - ctx.RegisterWithSameMailbox(new TRegisterNodeActor(ev, this)); + ctx.RegisterWithSameMailbox(new TResolveTenantActor(ev, SelfId())); } void TNodeBroker::Handle(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev, @@ -989,6 +989,12 @@ void TNodeBroker::Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev, ProcessTx(CreateTxUpdateEpoch(), ctx); } +void TNodeBroker::Handle(TEvPrivate::TEvResolvedRegistrationRequest::TPtr &ev, + const TActorContext &ctx) +{ + ProcessTx(CreateTxRegisterNode(ev), ctx); +} + IActor *CreateNodeBroker(const TActorId &tablet, TTabletStorageInfo *info) { diff --git a/ydb/core/mind/node_broker__register_node.cpp b/ydb/core/mind/node_broker__register_node.cpp index 1b4ea33e47b0..04691ecf1b2d 100644 --- a/ydb/core/mind/node_broker__register_node.cpp +++ b/ydb/core/mind/node_broker__register_node.cpp @@ -10,12 +10,11 @@ using namespace NKikimrNodeBroker; class TNodeBroker::TTxRegisterNode : public TTransactionBase { public: - TTxRegisterNode(TNodeBroker *self, TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, - const NActors::TScopeId& scopeId, const TSubDomainKey& servicedSubDomain) + TTxRegisterNode(TNodeBroker *self, TEvPrivate::TEvResolvedRegistrationRequest::TPtr &resolvedEv) : TBase(self) - , Event(ev) - , ScopeId(scopeId) - , ServicedSubDomain(servicedSubDomain) + , Event(resolvedEv->Get()->Request) + , ScopeId(resolvedEv->Get()->ScopeId) + , ServicedSubDomain(resolvedEv->Get()->ServicedSubDomain) , NodeId(0) , ExtendLease(false) , FixNodeId(false) @@ -186,11 +185,9 @@ class TNodeBroker::TTxRegisterNode : public TTransactionBase { bool FixNodeId; }; -ITransaction *TNodeBroker::CreateTxRegisterNode(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, - const NActors::TScopeId& scopeId, - const TSubDomainKey& servicedSubDomain) +ITransaction *TNodeBroker::CreateTxRegisterNode(TEvPrivate::TEvResolvedRegistrationRequest::TPtr &ev) { - return new TTxRegisterNode(this, ev, scopeId, servicedSubDomain); + return new TTxRegisterNode(this, ev); } } // NNodeBroker diff --git a/ydb/core/mind/node_broker_impl.h b/ydb/core/mind/node_broker_impl.h index 9efe587947b2..ae18b17b5ef5 100644 --- a/ydb/core/mind/node_broker_impl.h +++ b/ydb/core/mind/node_broker_impl.h @@ -46,6 +46,7 @@ class TNodeBroker : public TActor struct TEvPrivate { enum EEv { EvUpdateEpoch = EventSpaceBegin(TEvents::ES_PRIVATE), + EvResolvedRegistrationRequest, EvEnd }; @@ -53,6 +54,22 @@ class TNodeBroker : public TActor static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_PRIVATE)"); struct TEvUpdateEpoch : public TEventLocal {}; + + struct TEvResolvedRegistrationRequest : public TEventLocal { + + TEvResolvedRegistrationRequest( + TEvNodeBroker::TEvRegistrationRequest::TPtr request, + NActors::TScopeId scopeId, + TSubDomainKey servicedSubDomain) + : Request(request) + , ScopeId(scopeId) + , ServicedSubDomain(servicedSubDomain) + {} + + TEvNodeBroker::TEvRegistrationRequest::TPtr Request; + NActors::TScopeId ScopeId; + TSubDomainKey ServicedSubDomain; + }; }; private: @@ -138,9 +155,7 @@ class TNodeBroker : public TActor ITransaction *CreateTxExtendLease(TEvNodeBroker::TEvExtendLeaseRequest::TPtr &ev); ITransaction *CreateTxInitScheme(); ITransaction *CreateTxLoadState(); - ITransaction *CreateTxRegisterNode(TEvNodeBroker::TEvRegistrationRequest::TPtr &ev, - const NActors::TScopeId& scopeId, - const TSubDomainKey& servicedSubDomain); + ITransaction *CreateTxRegisterNode(TEvPrivate::TEvResolvedRegistrationRequest::TPtr &ev); ITransaction *CreateTxUpdateConfig(TEvConsole::TEvConfigNotificationRequest::TPtr &ev); ITransaction *CreateTxUpdateConfig(TEvNodeBroker::TEvSetConfigRequest::TPtr &ev); ITransaction *CreateTxUpdateConfigSubscription(TEvConsole::TEvReplaceConfigSubscriptionsResponse::TPtr &ev); @@ -192,6 +207,7 @@ class TNodeBroker : public TActor HFuncTraced(TEvNodeBroker::TEvGetConfigRequest, Handle); HFuncTraced(TEvNodeBroker::TEvSetConfigRequest, Handle); HFuncTraced(TEvPrivate::TEvUpdateEpoch, Handle); + HFuncTraced(TEvPrivate::TEvResolvedRegistrationRequest, Handle); IgnoreFunc(TEvTabletPipe::TEvServerConnected); IgnoreFunc(TEvTabletPipe::TEvServerDisconnected); IgnoreFunc(NConsole::TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse); @@ -293,6 +309,8 @@ class TNodeBroker : public TActor const TActorContext &ctx); void Handle(TEvPrivate::TEvUpdateEpoch::TPtr &ev, const TActorContext &ctx); + void Handle(TEvPrivate::TEvResolvedRegistrationRequest::TPtr &ev, + const TActorContext &ctx); // All registered dynamic nodes. THashMap Nodes; diff --git a/ydb/public/lib/ydb_cli/commands/ydb_tools.cpp b/ydb/public/lib/ydb_cli/commands/ydb_tools.cpp index a96b7935faf5..50da7150c17a 100644 --- a/ydb/public/lib/ydb_cli/commands/ydb_tools.cpp +++ b/ydb/public/lib/ydb_cli/commands/ydb_tools.cpp @@ -295,7 +295,7 @@ int TCommandCopy::Run(TConfig& config) { //////////////////////////////////////////////////////////////////////////////// TCommandRename::TCommandRename() - : TTableCommand("rename", {}, "Rename or repalce table(s)") + : TTableCommand("rename", {}, "Rename or replace table(s)") { TItem::DefineFields({ {"Source", {{"source", "src"}, "Source table path", true}},