Skip to content

Commit 7e56755

Browse files
authored
25-1: Fix KesusQuoterService reconnect (#20758)
2 parents 1ccfde8 + 6bb4b20 commit 7e56755

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

ydb/core/quoter/kesus_quoter_proxy.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ namespace NQuoter {
4343

4444
namespace TEvKesus = NKesus::TEvKesus;
4545

46+
const ui64 KesusReconnectLimit = 5;
47+
4648
class TKesusQuoterProxy : public TActorBootstrapped<TKesusQuoterProxy> {
4749
struct TResourceState {
4850
const TString Resource;
@@ -797,15 +799,18 @@ class TKesusQuoterProxy : public TActorBootstrapped<TKesusQuoterProxy> {
797799
if (ev->Get()->Status == NKikimrProto::OK) {
798800
KESUS_PROXY_LOG_DEBUG("Successfully connected to tablet");
799801
Connected = true;
802+
KesusReconnectCount = 0;
800803
SubscribeToAllResources();
801804
} else {
802805
if (ev->Get()->Dead) {
803806
KESUS_PROXY_LOG_WARN("Tablet doesn't exist");
804807
SendToService(CreateUpdateEvent(TEvQuota::EUpdateState::Broken));
805808
} else {
806809
KESUS_PROXY_LOG_WARN("Failed to connect to tablet. Status: " << ev->Get()->Status);
807-
if (!ConnectToKesus(true)) {
808-
KESUS_PROXY_LOG_WARN("Too many reconnect attempts, assuming kesus dead");
810+
if (++KesusReconnectCount <= KesusReconnectLimit) {
811+
ConnectToKesus(true);
812+
} else {
813+
KESUS_PROXY_LOG_WARN("Too many reconnect attempts in a row, assuming kesus dead");
809814
SendToService(CreateUpdateEvent(TEvQuota::EUpdateState::Broken));
810815
KesusReconnectCount = 0;
811816
}
@@ -1122,7 +1127,7 @@ class TKesusQuoterProxy : public TActorBootstrapped<TKesusQuoterProxy> {
11221127
return KesusInfo->Description.GetKesusTabletId();
11231128
}
11241129

1125-
NTabletPipe::TClientConfig GetPipeConnectionOptions(bool reconnection) {
1130+
static NTabletPipe::TClientConfig GetPipeConnectionOptions(bool reconnection) {
11261131
NTabletPipe::TClientConfig cfg;
11271132
cfg.RetryPolicy = {
11281133
.RetryLimitCount = 3u,
@@ -1138,13 +1143,9 @@ class TKesusQuoterProxy : public TActorBootstrapped<TKesusQuoterProxy> {
11381143
CookieToResourcePath.clear(); // we will resend all requests with new cookies
11391144
}
11401145

1141-
bool ConnectToKesus(bool reconnection) {
1146+
void ConnectToKesus(bool reconnection) {
11421147
if (reconnection) {
11431148
KESUS_PROXY_LOG_INFO("Reconnecting to kesus");
1144-
++KesusReconnectCount;
1145-
if (KesusReconnectCount > 5) {
1146-
return false;
1147-
}
11481149
} else {
11491150
KESUS_PROXY_LOG_DEBUG("Connecting to kesus");
11501151
}
@@ -1157,7 +1158,6 @@ class TKesusQuoterProxy : public TActorBootstrapped<TKesusQuoterProxy> {
11571158
GetKesusTabletId(),
11581159
GetPipeConnectionOptions(reconnection)));
11591160
Connected = false;
1160-
return true;
11611161
}
11621162

11631163
void PassAway() override {

ydb/core/quoter/kesus_quoter_proxy.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ struct ITabletPipeFactory {
2222
static THolder<ITabletPipeFactory> GetDefaultFactory();
2323
};
2424

25+
extern const ui64 KesusReconnectLimit;
26+
2527
NActors::IActor* CreateKesusQuoterProxy(ui64 quoterId, const NSchemeCache::TSchemeCacheNavigate::TEntry& navEntry, const NActors::TActorId& quoterServiceId, THolder<ITabletPipeFactory> tabletPipeFactory = ITabletPipeFactory::GetDefaultFactory());
2628

2729
class TKesusResourceAllocationStatistics {

ydb/core/quoter/kesus_quoter_ut.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,23 @@ Y_UNIT_TEST_SUITE(KesusProxyTest) {
257257
setup.GetRuntime().SimulateSleep(TDuration::Zero());
258258
}
259259

260+
Y_UNIT_TEST(ReconnectsWithKesusAfterSeveralRetries) {
261+
TKesusProxyTestSetup setup;
262+
auto* pipeMock = setup.GetPipeFactory().ExpectTabletPipeCreation(true);
263+
EXPECT_CALL(*pipeMock, OnPoisonPill());
264+
265+
for (ui32 i = 1; i <= NQuoter::KesusReconnectLimit; ++i) {
266+
setup.SendNotConnected(pipeMock);
267+
setup.WaitConnected();
268+
}
269+
270+
setup.SendDestroyed(pipeMock);
271+
setup.WaitPipesCreated(1 /* initial */ + NQuoter::KesusReconnectLimit + 1 /* last */);
272+
273+
// Dispatch some events to let poison pill reach the mock
274+
setup.GetRuntime().SimulateSleep(TDuration::Zero());
275+
}
276+
260277
Y_UNIT_TEST(RejectsNotCanonizedResourceName) {
261278
TKesusProxyTestSetup setup;
262279

0 commit comments

Comments
 (0)