diff options
author | dinmukhammed <dinmukhammed@yandex-team.ru> | 2022-02-11 20:01:55 +0300 |
---|---|---|
committer | dinmukhammed <dinmukhammed@yandex-team.ru> | 2022-02-11 20:01:55 +0300 |
commit | 2a307bcbf7913175505081578c9f70f76071bd6e (patch) | |
tree | ca9b0542f0c51b6cfbb019f0a2235e95052ad3c6 | |
parent | 3028ff5a15464a1f5b4fe8ad0c4761dbd5272c29 (diff) | |
download | ydb-2a307bcbf7913175505081578c9f70f76071bd6e.tar.gz |
YQ-845 Fixed getting values from cache in DatabaseResolver
Fix getting cache values
ref:347b3b30696f58a6232e453292b1609fe46857d8
-rw-r--r-- | ydb/core/yq/libs/actors/database_resolver.cpp | 41 | ||||
-rw-r--r-- | ydb/core/yq/libs/db_resolver/db_async_resolver_impl.cpp | 4 |
2 files changed, 32 insertions, 13 deletions
diff --git a/ydb/core/yq/libs/actors/database_resolver.cpp b/ydb/core/yq/libs/actors/database_resolver.cpp index db30bd7183b..28402cb7d80 100644 --- a/ydb/core/yq/libs/actors/database_resolver.cpp +++ b/ydb/core/yq/libs/actors/database_resolver.cpp @@ -264,6 +264,20 @@ private: cFunc(NActors::TEvents::TEvPoison::EventType, PassAway); }); + void SendResponse( + const NActors::TActorId& recipient, + THashMap<std::pair<TString, DatabaseType>, TEndpoint>&& ready, + bool success = true, + const TString& errorMessage = "") + { + LOG_D("Reply: Success: " << success << ", Errors: " << (errorMessage ? errorMessage : "no")); + NYql::TIssues issues; + if (errorMessage) + issues.AddIssue(errorMessage); + Send(recipient, + new TEvents::TEvEndpointResponse(TEvents::TDbResolverResponse{std::move(ready), success, issues})); + } + void Handle(TEvents::TEvEndpointRequest::TPtr ev, const TActorContext& ctx) { TraceId = ev->Get()->TraceId; @@ -272,13 +286,21 @@ private: THashMap<std::pair<TString, DatabaseType>, TEndpoint> ready; for (const auto& [p, info] : ev->Get()->DatabaseIds) { const auto& [databaseId, type] = p; - TMaybe<std::variant<TEndpoint, TString>> endpoint; + TMaybe<std::variant<TEndpoint, TString>> cacheVal; auto key = std::make_tuple(databaseId, type, info); - if (Cache.Get(key, &endpoint)) { - if (endpoint) { - ready.insert(std::make_pair(p, - (endpoint->index() == 0 ? std::get<0>(*endpoint) : TEndpoint{}) - )); + if (Cache.Get(key, &cacheVal)) { + switch(cacheVal->index()) { + case 0U: { + ready.insert(std::make_pair(p, std::get<0U>(*cacheVal))); + break; + } + case 1U: { + SendResponse(ev->Sender, {}, false, std::get<1U>(*cacheVal)); + return; + } + default: { + LOG_E("Unsupported cache's value type"); + } } continue; } @@ -302,10 +324,7 @@ private: const TString msg = TStringBuilder() << " Error while preparing to resolve databaseId: " << databaseId << ", details: " << e.what(); LOG_E(msg); Cache.Put(key, msg); - NYql::TIssues issues; - issues.AddIssue(msg); - Send(ev->Sender, - new TEvents::TEvEndpointResponse(TEvents::TDbResolverResponse{{}, /*success=*/false, issues})); + SendResponse(ev->Sender, {}, /*success=*/false, msg); return; } } @@ -318,7 +337,7 @@ private: ctx.Send(new IEventHandle(HttpProxy, helper, new NHttp::TEvHttpProxy::TEvHttpOutgoingRequest(request))); } } else { - Send(ev->Sender, new TEvents::TEvEndpointResponse(TEvents::TDbResolverResponse{std::move(ready), /*success=*/true})); + SendResponse(ev->Sender, std::move(ready)); } } diff --git a/ydb/core/yq/libs/db_resolver/db_async_resolver_impl.cpp b/ydb/core/yq/libs/db_resolver/db_async_resolver_impl.cpp index 62cc1eac90e..d4fcc6e6dcb 100644 --- a/ydb/core/yq/libs/db_resolver/db_async_resolver_impl.cpp +++ b/ydb/core/yq/libs/db_resolver/db_async_resolver_impl.cpp @@ -17,13 +17,13 @@ TDatabaseAsyncResolver::TDatabaseAsyncResolver( NThreading::TFuture<TEvents::TDbResolverResponse> TDatabaseAsyncResolver::ResolveIds(const TResolveParams& params) const { auto promise = NThreading::NewPromise<TEvents::TDbResolverResponse>(); - TDuration timeout = TDuration::Seconds(20); + TDuration timeout = TDuration::Seconds(40); auto callback = MakeHolder<NYql::TRichActorFutureCallback<TEvents::TEvEndpointResponse>>( [promise] (TAutoPtr<NActors::TEventHandle<TEvents::TEvEndpointResponse>>& event) mutable { promise.SetValue(std::move(event->Get()->DbResolverResponse)); }, [promise, timeout] () mutable { - promise.SetException("Couldn't resolve database ids for " + timeout.ToString() + " seconds"); + promise.SetException("Couldn't resolve database ids for " + timeout.ToString()); }, timeout ); |