Skip to content

Commit fce4b10

Browse files
CyberROFLkunga
authored andcommitted
24-4: TDbResolver: store & resend original event (ydb-platform#15082)
1 parent 58053cc commit fce4b10

File tree

2 files changed

+47
-30
lines changed

2 files changed

+47
-30
lines changed

ydb/core/tx/scheme_board/cache.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,11 @@ namespace {
101101
SetError(context, entry, TResolve::EStatus::LookupError, TKeyDesc::EStatus::NotExists);
102102
}
103103

104-
template <typename TRequest, typename TEvRequest, typename TDerived>
104+
template <typename TEvRequest, typename TDerived>
105105
class TDbResolver: public TActorBootstrapped<TDerived> {
106106
void Handle() {
107-
TlsActivationContext->Send(new IEventHandle(Cache, Sender, new TEvRequest(Request.Release())));
107+
Request->Rewrite(Request->GetTypeRewrite(), Cache);
108+
this->Send(Request.Release());
108109
this->PassAway();
109110
}
110111

@@ -113,17 +114,16 @@ namespace {
113114
return NKikimrServices::TActivity::SCHEME_BOARD_DB_RESOLVER;
114115
}
115116

116-
TDbResolver(const TActorId& cache, const TActorId& sender, THolder<TRequest> request, ui64 domainOwnerId)
117+
TDbResolver(const TActorId& cache, typename TEvRequest::TPtr& request, ui64 domainOwnerId)
117118
: Cache(cache)
118-
, Sender(sender)
119-
, Request(std::move(request))
119+
, Request(request)
120120
, DomainOwnerId(domainOwnerId)
121121
{
122122
}
123123

124124
void Bootstrap() {
125125
TNavigate::TEntry entry;
126-
entry.Path = SplitPath(Request->DatabaseName);
126+
entry.Path = SplitPath(Request->Get()->Request->DatabaseName);
127127
entry.Operation = TNavigate::EOp::OpPath;
128128
entry.RedirectRequired = false;
129129

@@ -141,32 +141,31 @@ namespace {
141141
}
142142
}
143143

144-
using TBase = TDbResolver<TRequest, TEvRequest, TDerived>;
144+
using TBase = TDbResolver<TEvRequest, TDerived>;
145145

146146
private:
147147
const TActorId Cache;
148-
const TActorId Sender;
149-
THolder<TRequest> Request;
148+
typename TEvRequest::TPtr Request;
150149
const ui64 DomainOwnerId;
151150

152151
}; // TDbResolver
153152

154-
class TDbResolverNavigate: public TDbResolver<TNavigate, TEvNavigate, TDbResolverNavigate> {
153+
class TDbResolverNavigate: public TDbResolver<TEvNavigate, TDbResolverNavigate> {
155154
public:
156155
using TBase::TBase;
157156
};
158157

159-
class TDbResolverResolve: public TDbResolver<TResolve, TEvResolve, TDbResolverResolve> {
158+
class TDbResolverResolve: public TDbResolver<TEvResolve, TDbResolverResolve> {
160159
public:
161160
using TBase::TBase;
162161
};
163162

164-
IActor* CreateDbResolver(const TActorId& cache, const TActorId& sender, THolder<TNavigate> request, ui64 domainOwnerId) {
165-
return new TDbResolverNavigate(cache, sender, std::move(request), domainOwnerId);
163+
IActor* CreateDbResolver(const TActorId& cache, TEvNavigate::TPtr& request, ui64 domainOwnerId) {
164+
return new TDbResolverNavigate(cache, request, domainOwnerId);
166165
}
167166

168-
IActor* CreateDbResolver(const TActorId& cache, const TActorId& sender, THolder<TResolve> request, ui64 domainOwnerId) {
169-
return new TDbResolverResolve(cache, sender, std::move(request), domainOwnerId);
167+
IActor* CreateDbResolver(const TActorId& cache, TEvResolve::TPtr& request, ui64 domainOwnerId) {
168+
return new TDbResolverResolve(cache, request, domainOwnerId);
170169
}
171170

172171
template <typename TContextPtr, typename TEvResult, typename TDerived>
@@ -2575,7 +2574,7 @@ class TSchemeCache: public TMonitorableActor<TSchemeCache> {
25752574
return false;
25762575
}
25772576

2578-
Register(CreateDbResolver(SelfId(), ev->Sender, THolder(request.Release()), it->second));
2577+
Register(CreateDbResolver(SelfId(), ev, it->second));
25792578
return true;
25802579
}
25812580

ydb/core/tx/scheme_board/cache_ut.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,13 @@ class TCacheTest: public TTestWithSchemeshard {
3131
SchemeCache = Context->Register(CreateSchemeBoardSchemeCache(config.Get()));
3232
Context->EnableScheduleForActor(SchemeCache, true);
3333

34-
TestAlterSubDomain(*Context, 1, "/",
35-
"StoragePools { "
36-
" Name: \"pool-1\" "
37-
" Kind: \"pool-kind-1\" "
38-
"} "
39-
" Name: \"Root\" ");
40-
41-
// Context->SetLogPriority(NKikimrServices::SCHEME_BOARD_REPLICA, NLog::PRI_DEBUG);
42-
// Context->SetLogPriority(NKikimrServices::SCHEME_BOARD_SUBSCRIBER, NLog::PRI_DEBUG);
43-
// Context->SetLogPriority(NKikimrServices::TX_PROXY_SCHEME_CACHE, NLog::PRI_DEBUG);
44-
// Context->SetLogPriority(NKikimrServices::FLAT_TX_SCHEMESHARD, NLog::PRI_DEBUG);
34+
TestAlterSubDomain(*Context, 1, "/", R"(
35+
Name: "Root"
36+
StoragePools {
37+
Name: "pool-1"
38+
Kind: "pool-kind-1"
39+
}
40+
)");
4541
}
4642

4743
UNIT_TEST_SUITE(TCacheTest);
@@ -63,6 +59,7 @@ class TCacheTest: public TTestWithSchemeshard {
6359
UNIT_TEST(MigrationDeletedPathNavigate);
6460
UNIT_TEST(WatchRoot);
6561
UNIT_TEST(PathBelongsToDomain);
62+
UNIT_TEST(CookiesArePreserved);
6663
UNIT_TEST_SUITE_END();
6764

6865
void Navigate();
@@ -83,10 +80,11 @@ class TCacheTest: public TTestWithSchemeshard {
8380
void MigrationDeletedPathNavigate();
8481
void WatchRoot();
8582
void PathBelongsToDomain();
83+
void CookiesArePreserved();
8684

8785
protected:
8886
TNavigate::TEntry TestNavigateImpl(THolder<TNavigate> request, TNavigate::EStatus expectedStatus,
89-
const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired);
87+
const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired, ui64 cookie = 0);
9088

9189
TNavigate::TEntry TestNavigate(const TString& path, TNavigate::EStatus expectedStatus = TNavigate::EStatus::Ok,
9290
const TString& sid = TString(), TNavigate::EOp op = TNavigate::EOp::OpPath,
@@ -374,7 +372,7 @@ void TCacheTest::TableSchemaVersion() {
374372
}
375373

376374
TNavigate::TEntry TCacheTest::TestNavigateImpl(THolder<TNavigate> request, TNavigate::EStatus expectedStatus,
377-
const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired)
375+
const TString& sid, TNavigate::EOp op, bool showPrivatePath, bool redirectRequired, ui64 cookie)
378376
{
379377
auto& entry = request->ResultSet.back();
380378
entry.Operation = op;
@@ -386,10 +384,11 @@ TNavigate::TEntry TCacheTest::TestNavigateImpl(THolder<TNavigate> request, TNavi
386384
}
387385

388386
const TActorId edge = Context->AllocateEdgeActor();
389-
Context->Send(SchemeCache, edge, new TEvTxProxySchemeCache::TEvNavigateKeySet(request.Release()), 0, 0, 0, true);
387+
Context->Send(SchemeCache, edge, new TEvTxProxySchemeCache::TEvNavigateKeySet(request.Release()), 0, cookie, 0, true);
390388
auto ev = Context->GrabEdgeEvent<TEvTxProxySchemeCache::TEvNavigateKeySetResult>(edge);
391389

392390
UNIT_ASSERT(ev->Get());
391+
UNIT_ASSERT_VALUES_EQUAL(ev->Cookie, cookie);
393392
UNIT_ASSERT(!ev->Get()->Request->ResultSet.empty());
394393

395394
const TNavigate::TEntry result = ev->Get()->Request->ResultSet[0];
@@ -997,6 +996,25 @@ void TCacheTest::PathBelongsToDomain() {
997996
}
998997
}
999998

999+
void TCacheTest::CookiesArePreserved() {
1000+
ui64 txId = 100;
1001+
TestCreateSubDomain(*Context, ++txId, "/Root", R"(Name: "SubDomain")");
1002+
TestWaitNotification(*Context, {txId}, CreateNotificationSubscriber(*Context, TTestTxConfig::SchemeShard));
1003+
TestMkDir(*Context, ++txId, "/Root/SubDomain", "DirA");
1004+
1005+
ui64 cookie = 1;
1006+
// first request will run db resolver
1007+
for (int i = 0; i < 2; ++i) {
1008+
auto request = MakeHolder<TNavigate>();
1009+
request->DatabaseName = "/Root/SubDomain";
1010+
auto& entry = request->ResultSet.emplace_back();
1011+
entry.Path = SplitPath("/Root/SubDomain/DirA");
1012+
entry.RequestType = TNavigate::TEntry::ERequestType::ByPath;
1013+
auto result = TestNavigateImpl(std::move(request), TNavigate::EStatus::Ok,
1014+
"", TNavigate::EOp::OpPath, false, true, ++cookie);
1015+
}
1016+
}
1017+
10001018
class TCacheTestWithDrops: public TCacheTest {
10011019
public:
10021020
TTestContext::TEventObserver ObserverFunc() override {

0 commit comments

Comments
 (0)