Skip to content

Commit f58d015

Browse files
authored
fix redirects for serverless databases (#13856)
1 parent 1d7f86d commit f58d015

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

ydb/core/viewer/json_pipe_req.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -803,11 +803,15 @@ void TViewerPipeClient::RequestDone(ui32 requests) {
803803
if (!DelayedRequests.empty()) {
804804
SendDelayedRequests();
805805
}
806-
if (Requests == 0) {
806+
if (Requests == 0 && !PassedAway) {
807807
ReplyAndPassAway();
808808
}
809809
}
810810

811+
void TViewerPipeClient::CancelAllRequests() {
812+
DelayedRequests.clear();
813+
}
814+
811815
void TViewerPipeClient::Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
812816
if (ev->Get()->Status != NKikimrProto::OK) {
813817
ui32 requests = FailPipeConnect(ev->Get()->TabletId);
@@ -826,12 +830,14 @@ void TViewerPipeClient::HandleResolveResource(TEvTxProxySchemeCache::TEvNavigate
826830
Bootstrap(); // retry bootstrap without redirect this time
827831
} else {
828832
DatabaseBoardInfoResponse = MakeRequestStateStorageEndpointsLookup(SharedDatabase);
833+
--Requests; // don't count this request
829834
}
830835
} else {
831-
return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "Failed to resolve database - shared database not found"));
836+
AddEvent("Failed to resolve database - shared database not found");
837+
Direct = true;
838+
Bootstrap(); // retry bootstrap without redirect this time
832839
}
833840
}
834-
RequestDone();
835841
}
836842

837843
void TViewerPipeClient::HandleResolveDatabase(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
@@ -841,15 +847,18 @@ void TViewerPipeClient::HandleResolveDatabase(TEvTxProxySchemeCache::TEvNavigate
841847
TSchemeCacheNavigate::TEntry& entry(DatabaseNavigateResponse->Get()->Request->ResultSet.front());
842848
if (entry.DomainInfo && entry.DomainInfo->ResourcesDomainKey && entry.DomainInfo->DomainKey != entry.DomainInfo->ResourcesDomainKey) {
843849
ResourceNavigateResponse = MakeRequestSchemeCacheNavigate(TPathId(entry.DomainInfo->ResourcesDomainKey));
850+
--Requests; // don't count this request
844851
Become(&TViewerPipeClient::StateResolveResource);
845852
} else {
846853
DatabaseBoardInfoResponse = MakeRequestStateStorageEndpointsLookup(CanonizePath(entry.Path));
854+
--Requests; // don't count this request
847855
}
848856
} else {
849-
return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "Failed to resolve database - not found"));
857+
AddEvent("Failed to resolve database - not found");
858+
Direct = true;
859+
Bootstrap(); // retry bootstrap without redirect this time
850860
}
851861
}
852-
RequestDone();
853862
}
854863

855864
void TViewerPipeClient::HandleResolve(TEvStateStorage::TEvBoardInfo::TPtr& ev) {
@@ -858,11 +867,11 @@ void TViewerPipeClient::HandleResolve(TEvStateStorage::TEvBoardInfo::TPtr& ev) {
858867
if (DatabaseBoardInfoResponse->IsOk()) {
859868
return ReplyAndPassAway(MakeForward(GetNodesFromBoardReply(DatabaseBoardInfoResponse->GetRef())));
860869
} else {
870+
AddEvent("Failed to resolve database nodes");
861871
Direct = true;
862872
Bootstrap(); // retry bootstrap without redirect this time
863873
}
864874
}
865-
RequestDone();
866875
}
867876

868877
void TViewerPipeClient::HandleTimeout() {
@@ -887,6 +896,7 @@ STATEFN(TViewerPipeClient::StateResolveResource) {
887896

888897
void TViewerPipeClient::RedirectToDatabase(const TString& database) {
889898
DatabaseNavigateResponse = MakeRequestSchemeCacheNavigate(database);
899+
--Requests; // don't count this request
890900
Become(&TViewerPipeClient::StateResolveDatabase);
891901
}
892902

@@ -913,6 +923,8 @@ void TViewerPipeClient::PassAway() {
913923
Send(TActivationContext::InterconnectProxy(nodeId), new TEvents::TEvUnsubscribe());
914924
}
915925
ClosePipes();
926+
CancelAllRequests();
927+
PassedAway = true;
916928
TBase::PassAway();
917929
}
918930

ydb/core/viewer/json_pipe_req.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
4343
TString SharedDatabase;
4444
bool Direct = false;
4545
ui32 Requests = 0;
46+
bool PassedAway = false;
4647
ui32 MaxRequestsInFlight = 200;
4748
NWilson::TSpan Span;
4849
IViewer* Viewer = nullptr;
@@ -308,6 +309,7 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
308309
TString MakeForward(const std::vector<ui32>& nodes);
309310

310311
void RequestDone(ui32 requests = 1);
312+
void CancelAllRequests();
311313
void AddEvent(const TString& name);
312314
void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev);
313315
void HandleResolveDatabase(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev);

0 commit comments

Comments
 (0)