@@ -138,6 +138,31 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
138138
139139 LOG_T (" ResponseProcessor::Handle(HttpIncomingResponse): got MDB API response: code=" << ev->Get ()->Response ->Status );
140140
141+ try {
142+ HandleResponse (ev, requestIter, errorMessage, result);
143+ } catch (...) {
144+ const TString msg = TStringBuilder () << " error while response processing, params "
145+ << ((requestIter != Requests.end ()) ? requestIter->second .ToDebugString () : TString{" unknown" })
146+ << " , details: " << CurrentExceptionMessage ();
147+ LOG_E (" ResponseProccessor::Handle(TEvHttpIncomingResponse): " << msg);
148+ }
149+
150+ LOG_T (" ResponseProcessor::Handle(HttpIncomingResponse): progress: "
151+ << DatabaseId2Description.size () << " of " << Requests.size () << " requests are done" );
152+
153+ if (HandledIds == Requests.size ()) {
154+ SendResolvedEndpointsAndDie (errorMessage);
155+ }
156+ }
157+
158+ private:
159+
160+ void HandleResponse (
161+ NHttp::TEvHttpProxy::TEvHttpIncomingResponse::TPtr& ev,
162+ const TRequestMap::const_iterator& requestIter,
163+ TString& errorMessage,
164+ TMaybe<TDatabaseDescription>& result)
165+ {
141166 if (ev->Get ()->Error .empty () && (ev->Get ()->Response && ev->Get ()->Response ->Status == " 200" )) {
142167 errorMessage = HandleSuccessfulResponse (ev, requestIter, result);
143168 } else {
@@ -152,34 +177,26 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
152177 auto key = std::make_tuple (params.Id , params.DatabaseType , params.DatabaseAuth );
153178 if (errorMessage) {
154179 LOG_T (" ResponseProcessor::Handle(HttpIncomingResponse): put value in cache"
155- << " ; params: " << params.ToDebugString ()
156- << " , error: " << errorMessage);
180+ << " ; params: " << params.ToDebugString ()
181+ << " , error: " << errorMessage);
157182 Cache.Put (key, errorMessage);
158183 } else {
159184 LOG_T (" ResponseProcessor::Handle(HttpIncomingResponse): put value in cache"
160- << " ; params: " << params.ToDebugString ()
161- << " , result: " << result->ToDebugString ());
185+ << " ; params: " << params.ToDebugString ()
186+ << " , result: " << result->ToDebugString ());
162187 Cache.Put (key, result);
163188 }
164189 }
165-
166- LOG_D (" ResponseProcessor::Handle(HttpIncomingResponse): progress: "
167- << DatabaseId2Description.size () << " of " << Requests.size () << " requests are done" );
168-
169- if (HandledIds == Requests.size ()) {
170- SendResolvedEndpointsAndDie (errorMessage);
171- }
172190 }
173191
174- private:
175192 TString HandleSuccessfulResponse (
176193 NHttp::TEvHttpProxy::TEvHttpIncomingResponse::TPtr& ev,
177194 const TRequestMap::const_iterator& requestIter,
178195 TMaybe<TDatabaseDescription>& result
179196 ) {
180197 if (requestIter == Requests.end ()) {
181198 return " unknown request" ;
182- }
199+ }
183200
184201 NJson::TJsonReaderConfig jsonConfig;
185202 NJson::TJsonValue databaseInfo;
@@ -224,12 +241,7 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
224241 const auto & status = ev->Get ()->Response ->Status ;
225242
226243 if (status == " 403" ) {
227- const auto second = requestIter->second ;
228- auto mdbTypeStr = NYql::DatabaseTypeLowercase (second.DatabaseType );
229-
230- return TStringBuilder () << " You have no permission to resolve database id into database endpoint. " <<
231- " Please check that your service account has role " <<
232- " `managed-" << mdbTypeStr << " .viewer`." ;
244+ return TStringBuilder () << " You have no permission to resolve database id into database endpoint. " + DetailedPermissionsError (requestIter->second );
233245 }
234246
235247 auto errorMessage = ev->Get ()->Error ;
@@ -245,6 +257,17 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
245257 return errorMessage;
246258 }
247259
260+
261+ TString DetailedPermissionsError (const TResolveParams& params) const {
262+
263+ if (params.DatabaseType == EDatabaseType::ClickHouse || params.DatabaseType == EDatabaseType::PostgreSQL) {
264+ auto mdbTypeStr = NYql::DatabaseTypeLowercase (params.DatabaseType );
265+ return TStringBuilder () << " Please check that your service account has role " <<
266+ " `managed-" << mdbTypeStr << " .viewer`." ;
267+ }
268+ return {};
269+ }
270+
248271 const TActorId Sender;
249272 TCache& Cache;
250273 const TRequestMap Requests;
0 commit comments