Skip to content

Commit 40cb259

Browse files
authored
Fix unnecessary tablet resolver negative caching on pipe disconnects (#21621)
1 parent 5654d22 commit 40cb259

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

ydb/core/tablet/tablet_pipe_ut.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,11 @@ Y_UNIT_TEST_SUITE(TTabletPipeTest) {
13661366
}
13671367

13681368
auto sender2 = runtime.AllocateEdgeActor();
1369+
for (int i = 0; i < 30; ++i) {
1370+
// overload tablet resolver with unrelated queries
1371+
runtime.Send(new IEventHandle(MakeTabletResolverID(), TActorId(),
1372+
new TEvTabletResolver::TEvForward(TTestTxConfig::TxTablet0 + 1 + i, nullptr, {})));
1373+
}
13691374
auto client2 = runtime.Register(NTabletPipe::CreateClient(sender2, TTestTxConfig::TxTablet0, NTabletPipe::TClientConfig{
13701375
.ExpectShutdown = true,
13711376
.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithoutRetries(),
@@ -1442,6 +1447,11 @@ Y_UNIT_TEST_SUITE(TTabletPipeTest) {
14421447
}
14431448

14441449
auto sender2 = runtime.AllocateEdgeActor();
1450+
for (int i = 0; i < 30; ++i) {
1451+
// overload tablet resolver with unrelated queries
1452+
runtime.Send(new IEventHandle(MakeTabletResolverID(), TActorId(),
1453+
new TEvTabletResolver::TEvForward(TTestTxConfig::TxTablet0 + 1 + i, nullptr, {})));
1454+
}
14451455
auto client2 = runtime.Register(NTabletPipe::CreateClient(sender2, TTestTxConfig::TxTablet0, NTabletPipe::TClientConfig{
14461456
.RetryPolicy = NTabletPipe::TClientRetryPolicy::WithoutRetries(),
14471457
}));

ydb/core/tablet/tablet_resolver.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ class TTabletResolver : public TActorBootstrapped<TTabletResolver> {
352352
SendQueued(msg.TabletID, entry, ctx);
353353
}
354354

355-
void DropEntry(ui64 tabletId, TEntry& entry, const TActorContext &ctx) {
355+
void DropEntry(ui64 tabletId, TEntry& entry, bool cacheNegative, const TActorContext &ctx) {
356356
LOG_DEBUG(ctx, NKikimrServices::TABLET_RESOLVER,
357357
"DropEntry tabletId: %" PRIu64 " followers: %" PRIu64,
358358
tabletId, entry.KnownFollowers.size());
@@ -363,12 +363,16 @@ class TTabletResolver : public TActorBootstrapped<TTabletResolver> {
363363
ResolvedTablets.Erase(tabletId);
364364
UnresolvedTablets.Erase(tabletId);
365365

366-
if (TabletResolverNegativeCacheTimeout) {
366+
if (TabletResolverNegativeCacheTimeout && cacheNegative) {
367367
if (TabletsOnStopList.emplace(tabletId).second)
368368
Schedule(TabletResolverNegativeCacheTimeout, new TEvPrivate::TEvStopListRemoval(tabletId));
369369
}
370370
}
371371

372+
void DropEntry(ui64 tabletId, TEntry& entry, const TActorContext &ctx) {
373+
DropEntry(tabletId, entry, true, ctx);
374+
}
375+
372376
TAutoPtr<TEntry>& GetEntry(ui64 tabletId, const TActorContext &ctx) {
373377
TAutoPtr<TEntry>* entryPtr;
374378
if (!ResolvedTablets.Find(tabletId, entryPtr)) {
@@ -425,7 +429,7 @@ class TTabletResolver : public TActorBootstrapped<TTabletResolver> {
425429
" leader: %s by NodeId", tabletId, entry.KnownLeader.ToString().c_str());
426430
if (entry.KnownFollowers.empty()) {
427431
// Avoid resolving preemptively until the next request
428-
DropEntry(tabletId, entry, ctx);
432+
DropEntry(tabletId, entry, /* cacheNegative */ false, ctx);
429433
return;
430434
}
431435
ResolveRequest(tabletId, ctx);
@@ -544,7 +548,7 @@ class TTabletResolver : public TActorBootstrapped<TTabletResolver> {
544548
if (!msg->Actor || entry.KnownLeader == msg->Actor || entry.KnownLeaderTablet == msg->Actor) {
545549
if (entry.KnownFollowers.empty()) {
546550
// Avoid resolving preemptively until the next request
547-
DropEntry(tabletId, entry, ctx);
551+
DropEntry(tabletId, entry, /* cacheNegative */ false, ctx);
548552
return;
549553
}
550554
ResolveRequest(tabletId, ctx);

0 commit comments

Comments
 (0)