diff options
author | Ilnaz Nizametdinov <ilnaz@ydb.tech> | 2025-02-21 17:00:21 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-21 14:00:21 +0000 |
commit | f330cca7de504d6e71b4d4f76945a2ab817cfaaa (patch) | |
tree | fc538ef98272a2e42798431b3c4915679ccaaa54 | |
parent | 147c972fc3a3eabca9f89df5473016a0afe338b8 (diff) | |
download | ydb-f330cca7de504d6e71b4d4f76945a2ab817cfaaa.tar.gz |
TDbResolver: store & resend original event (#14883)
-rw-r--r-- | ydb/core/tx/scheme_board/cache.cpp | 31 | ||||
-rw-r--r-- | ydb/core/tx/scheme_board/cache_ut.cpp | 46 |
2 files changed, 47 insertions, 30 deletions
diff --git a/ydb/core/tx/scheme_board/cache.cpp b/ydb/core/tx/scheme_board/cache.cpp index 3491af1ac8..ffd18d9b05 100644 --- a/ydb/core/tx/scheme_board/cache.cpp +++ b/ydb/core/tx/scheme_board/cache.cpp @@ -100,10 +100,11 @@ namespace { SetError(context, entry, TResolve::EStatus::LookupError, TKeyDesc::EStatus::NotExists); } - template <typename TRequest, typename TEvRequest, typename TDerived> + template <typename TEvRequest, typename TDerived> class TDbResolver: public TActorBootstrapped<TDerived> { void Handle() { - TlsActivationContext->Send(new IEventHandle(Cache, Sender, new TEvRequest(Request.Release()))); + Request->Rewrite(Request->GetTypeRewrite(), Cache); + this->Send(Request.Release()); this->PassAway(); } @@ -112,17 +113,16 @@ namespace { return NKikimrServices::TActivity::SCHEME_BOARD_DB_RESOLVER; } - TDbResolver(const TActorId& cache, const TActorId& sender, THolder<TRequest> request, ui64 domainOwnerId) + TDbResolver(const TActorId& cache, typename TEvRequest::TPtr& request, ui64 domainOwnerId) : Cache(cache) - , Sender(sender) - , Request(std::move(request)) + , Request(request) , DomainOwnerId(domainOwnerId) { } void Bootstrap() { TNavigate::TEntry entry; - entry.Path = SplitPath(Request->DatabaseName); + entry.Path = SplitPath(Request->Get()->Request->DatabaseName); entry.Operation = TNavigate::EOp::OpPath; entry.RedirectRequired = false; @@ -140,32 +140,31 @@ namespace { } } - using TBase = TDbResolver<TRequest, TEvRequest, TDerived>; + using TBase = TDbResolver<TEvRequest, TDerived>; private: const TActorId Cache; - const TActorId Sender; - THolder<TRequest> Request; + typename TEvRequest::TPtr Request; const ui64 DomainOwnerId; }; // TDbResolver - class TDbResolverNavigate: public TDbResolver<TNavigate, TEvNavigate, TDbResolverNavigate> { + class TDbResolverNavigate: public TDbResolver<TEvNavigate, TDbResolverNavigate> { public: using TBase::TBase; }; - class TDbResolverResolve: public TDbResolver<TResolve, TEvResolve, TDbResolverResolve> { + class TDbResolverResolve: public TDbResolver<TEvResolve, TDbResolverResolve> { public: using TBase::TBase; }; - IActor* CreateDbResolver(const TActorId& cache, const TActorId& sender, THolder<TNavigate> request, ui64 domainOwnerId) { - return new TDbResolverNavigate(cache, sender, std::move(request), domainOwnerId); + IActor* CreateDbResolver(const TActorId& cache, TEvNavigate::TPtr& request, ui64 domainOwnerId) { + return new TDbResolverNavigate(cache, request, domainOwnerId); } - IActor* CreateDbResolver(const TActorId& cache, const TActorId& sender, THolder<TResolve> request, ui64 domainOwnerId) { - return new TDbResolverResolve(cache, sender, std::move(request), domainOwnerId); + IActor* CreateDbResolver(const TActorId& cache, TEvResolve::TPtr& request, ui64 domainOwnerId) { + return new TDbResolverResolve(cache, request, domainOwnerId); } template <typename TContextPtr, typename TEvResult, typename TDerived> @@ -2618,7 +2617,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> { return false; } - Register(CreateDbResolver(SelfId(), ev->Sender, THolder(request.Release()), it->second)); + Register(CreateDbResolver(SelfId(), ev, it->second)); return true; } diff --git a/ydb/core/tx/scheme_board/cache_ut.cpp b/ydb/core/tx/scheme_board/cache_ut.cpp index 18a0a781cd..6cb711f3b4 100644 --- a/ydb/core/tx/scheme_board/cache_ut.cpp +++ b/ydb/core/tx/scheme_board/cache_ut.cpp @@ -31,17 +31,13 @@ public: SchemeCache = Context->Register(CreateSchemeBoardSchemeCache(config.Get())); Context->EnableScheduleForActor(SchemeCache, true); - TestAlterSubDomain(*Context, 1, "/", - "StoragePools { " - " Name: \"pool-1\" " - " Kind: \"pool-kind-1\" " - "} " - " Name: \"Root\" "); - - // Context->SetLogPriority(NKikimrServices::SCHEME_BOARD_REPLICA, NLog::PRI_DEBUG); - // Context->SetLogPriority(NKikimrServices::SCHEME_BOARD_SUBSCRIBER, NLog::PRI_DEBUG); - // Context->SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NLog::PRI_DEBUG); - // Context->SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NLog::PRI_DEBUG); + TestAlterSubDomain(*Context, 1, "/", R"( + Name: "Root" + StoragePools { + Name: "pool-1" + Kind: "pool-kind-1" + } + )"); } UNIT_TEST_SUITE(TCacheTest); @@ -63,6 +59,7 @@ public: UNIT_TEST(MigrationDeletedPathNavigate); UNIT_TEST(WatchRoot); UNIT_TEST(PathBelongsToDomain); + UNIT_TEST(CookiesArePreserved); UNIT_TEST_SUITE_END(); void Navigate(); @@ -83,10 +80,11 @@ public: void MigrationDeletedPathNavigate(); void WatchRoot(); void PathBelongsToDomain(); + void CookiesArePreserved(); protected: TNavigate::TEntry TestNavigateImpl(THolder<TNavigate> request, TNavigate::EStatus expectedStatus, - const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired); + const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired, ui64 cookie = 0); TNavigate::TEntry TestNavigate(const TString& path, TNavigate::EStatus expectedStatus = TNavigate::EStatus::Ok, const TString& sid = TString(), TNavigate::EOp op = TNavigate::EOp::OpPath, @@ -374,7 +372,7 @@ void TCacheTest::TableSchemaVersion() { } TNavigate::TEntry TCacheTest::TestNavigateImpl(THolder<TNavigate> request, TNavigate::EStatus expectedStatus, - const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired) + const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired, ui64 cookie) { auto& entry = request->ResultSet.back(); entry.Operation = op; @@ -386,10 +384,11 @@ TNavigate::TEntry TCacheTest::TestNavigateImpl(THolder<TNavigate> request, TNavi } const TActorId edge = Context->AllocateEdgeActor(); - Context->Send(SchemeCache, edge, new TEvTxProxySchemeCache::TEvNavigateKeySet(request.Release()), 0, 0, 0, true); + Context->Send(SchemeCache, edge, new TEvTxProxySchemeCache::TEvNavigateKeySet(request.Release()), 0, cookie, 0, true); auto ev = Context->GrabEdgeEvent<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(edge); UNIT_ASSERT(ev->Get()); + UNIT_ASSERT_VALUES_EQUAL(ev->Cookie, cookie); UNIT_ASSERT(!ev->Get()->Request->ResultSet.empty()); const TNavigate::TEntry result = ev->Get()->Request->ResultSet[0]; @@ -997,6 +996,25 @@ void TCacheTest::PathBelongsToDomain() { } } +void TCacheTest::CookiesArePreserved() { + ui64 txId = 100; + TestCreateSubDomain(*Context, ++txId, "/Root", R"(Name: "SubDomain")"); + TestWaitNotification(*Context, {txId}, CreateNotificationSubscriber(*Context, TTestTxConfig::SchemeShard)); + TestMkDir(*Context, ++txId, "/Root/SubDomain", "DirA"); + + ui64 cookie = 1; + // first request will run db resolver + for (int i = 0; i < 2; ++i) { + auto request = MakeHolder<TNavigate>(); + request->DatabaseName = "/Root/SubDomain"; + auto& entry = request->ResultSet.emplace_back(); + entry.Path = SplitPath("/Root/SubDomain/DirA"); + entry.RequestType = TNavigate::TEntry::ERequestType::ByPath; + auto result = TestNavigateImpl(std::move(request), TNavigate::EStatus::Ok, + "", TNavigate::EOp::OpPath, false, true, ++cookie); + } +} + class TCacheTestWithDrops: public TCacheTest { public: TTestContext::TEventObserver ObserverFunc() override { |