Skip to content

Commit c07d0ff

Browse files
committed
fix redirects for serverless databases (#13856)
1 parent 3bcab71 commit c07d0ff

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
@@ -754,11 +754,15 @@ void TViewerPipeClient::RequestDone(ui32 requests) {
754754
if (!DelayedRequests.empty()) {
755755
SendDelayedRequests();
756756
}
757-
if (Requests == 0) {
757+
if (Requests == 0 && !PassedAway) {
758758
ReplyAndPassAway();
759759
}
760760
}
761761

762+
void TViewerPipeClient::CancelAllRequests() {
763+
DelayedRequests.clear();
764+
}
765+
762766
void TViewerPipeClient::Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
763767
if (ev->Get()->Status != NKikimrProto::OK) {
764768
ui32 requests = FailPipeConnect(ev->Get()->TabletId);
@@ -777,12 +781,14 @@ void TViewerPipeClient::HandleResolveResource(TEvTxProxySchemeCache::TEvNavigate
777781
Bootstrap(); // retry bootstrap without redirect this time
778782
} else {
779783
DatabaseBoardInfoResponse = MakeRequestStateStorageEndpointsLookup(SharedDatabase);
784+
--Requests; // don't count this request
780785
}
781786
} else {
782-
return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "Failed to resolve database - shared database not found"));
787+
AddEvent("Failed to resolve database - shared database not found");
788+
Direct = true;
789+
Bootstrap(); // retry bootstrap without redirect this time
783790
}
784791
}
785-
RequestDone();
786792
}
787793

788794
void TViewerPipeClient::HandleResolveDatabase(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
@@ -792,15 +798,18 @@ void TViewerPipeClient::HandleResolveDatabase(TEvTxProxySchemeCache::TEvNavigate
792798
TSchemeCacheNavigate::TEntry& entry(DatabaseNavigateResponse->Get()->Request->ResultSet.front());
793799
if (entry.DomainInfo && entry.DomainInfo->ResourcesDomainKey && entry.DomainInfo->DomainKey != entry.DomainInfo->ResourcesDomainKey) {
794800
ResourceNavigateResponse = MakeRequestSchemeCacheNavigate(TPathId(entry.DomainInfo->ResourcesDomainKey));
801+
--Requests; // don't count this request
795802
Become(&TViewerPipeClient::StateResolveResource);
796803
} else {
797804
DatabaseBoardInfoResponse = MakeRequestStateStorageEndpointsLookup(CanonizePath(entry.Path));
805+
--Requests; // don't count this request
798806
}
799807
} else {
800-
return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "Failed to resolve database - not found"));
808+
AddEvent("Failed to resolve database - not found");
809+
Direct = true;
810+
Bootstrap(); // retry bootstrap without redirect this time
801811
}
802812
}
803-
RequestDone();
804813
}
805814

806815
void TViewerPipeClient::HandleResolve(TEvStateStorage::TEvBoardInfo::TPtr& ev) {
@@ -809,11 +818,11 @@ void TViewerPipeClient::HandleResolve(TEvStateStorage::TEvBoardInfo::TPtr& ev) {
809818
if (DatabaseBoardInfoResponse->IsOk()) {
810819
return ReplyAndPassAway(MakeForward(GetNodesFromBoardReply(DatabaseBoardInfoResponse->GetRef())));
811820
} else {
821+
AddEvent("Failed to resolve database nodes");
812822
Direct = true;
813823
Bootstrap(); // retry bootstrap without redirect this time
814824
}
815825
}
816-
RequestDone();
817826
}
818827

819828
void TViewerPipeClient::HandleTimeout() {
@@ -838,6 +847,7 @@ STATEFN(TViewerPipeClient::StateResolveResource) {
838847

839848
void TViewerPipeClient::RedirectToDatabase(const TString& database) {
840849
DatabaseNavigateResponse = MakeRequestSchemeCacheNavigate(database);
850+
--Requests; // don't count this request
841851
Become(&TViewerPipeClient::StateResolveDatabase);
842852
}
843853

@@ -860,6 +870,8 @@ void TViewerPipeClient::PassAway() {
860870
Send(TActivationContext::InterconnectProxy(nodeId), new TEvents::TEvUnsubscribe());
861871
}
862872
ClosePipes();
873+
CancelAllRequests();
874+
PassedAway = true;
863875
TBase::PassAway();
864876
}
865877

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;
@@ -303,6 +304,7 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
303304
TString MakeForward(const std::vector<ui32>& nodes);
304305

305306
void RequestDone(ui32 requests = 1);
307+
void CancelAllRequests();
306308
void AddEvent(const TString& name);
307309
void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev);
308310
void HandleResolveDatabase(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev);

0 commit comments

Comments
 (0)