@@ -138,6 +138,31 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
138
138
139
139
LOG_T (" ResponseProcessor::Handle(HttpIncomingResponse): got MDB API response: code=" << ev->Get ()->Response ->Status );
140
140
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
+ {
141
166
if (ev->Get ()->Error .empty () && (ev->Get ()->Response && ev->Get ()->Response ->Status == " 200" )) {
142
167
errorMessage = HandleSuccessfulResponse (ev, requestIter, result);
143
168
} else {
@@ -152,34 +177,26 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
152
177
auto key = std::make_tuple (params.Id , params.DatabaseType , params.DatabaseAuth );
153
178
if (errorMessage) {
154
179
LOG_T (" ResponseProcessor::Handle(HttpIncomingResponse): put value in cache"
155
- << " ; params: " << params.ToDebugString ()
156
- << " , error: " << errorMessage);
180
+ << " ; params: " << params.ToDebugString ()
181
+ << " , error: " << errorMessage);
157
182
Cache.Put (key, errorMessage);
158
183
} else {
159
184
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 ());
162
187
Cache.Put (key, result);
163
188
}
164
189
}
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
- }
172
190
}
173
191
174
- private:
175
192
TString HandleSuccessfulResponse (
176
193
NHttp::TEvHttpProxy::TEvHttpIncomingResponse::TPtr& ev,
177
194
const TRequestMap::const_iterator& requestIter,
178
195
TMaybe<TDatabaseDescription>& result
179
196
) {
180
197
if (requestIter == Requests.end ()) {
181
198
return " unknown request" ;
182
- }
199
+ }
183
200
184
201
NJson::TJsonReaderConfig jsonConfig;
185
202
NJson::TJsonValue databaseInfo;
@@ -224,12 +241,7 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
224
241
const auto & status = ev->Get ()->Response ->Status ;
225
242
226
243
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 );
233
245
}
234
246
235
247
auto errorMessage = ev->Get ()->Error ;
@@ -245,6 +257,17 @@ class TResponseProcessor : public TActorBootstrapped<TResponseProcessor>
245
257
return errorMessage;
246
258
}
247
259
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
+
248
271
const TActorId Sender;
249
272
TCache& Cache;
250
273
const TRequestMap Requests;
0 commit comments