Skip to content

Commit d389316

Browse files
prevent catching of MaxRetryError and HttpError in client
Signed-off-by: varun-edachali-dbx <varun.edachali@databricks.com>
1 parent 11bc165 commit d389316

File tree

1 file changed

+39
-71
lines changed

1 file changed

+39
-71
lines changed

src/databricks/sql/backend/sea/utils/http_client.py

Lines changed: 39 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from urllib.parse import urljoin
88

99
from urllib3 import HTTPConnectionPool, HTTPSConnectionPool, ProxyManager
10-
from urllib3.exceptions import HTTPError, MaxRetryError
1110
from urllib3.util import make_headers
1211

1312
from databricks.sql.auth.authenticators import AuthProvider
@@ -227,77 +226,46 @@ def _make_request(
227226

228227
logger.debug(f"Making {method} request to {url}")
229228

230-
try:
231-
response = self._pool.request(
232-
method=method.upper(),
233-
url=url,
234-
body=body,
235-
headers=headers,
236-
preload_content=True,
237-
retries=self.retry_policy,
238-
)
229+
# When v3 retries are enabled, urllib3 handles retries internally via DatabricksRetryPolicy
230+
# When disabled, we let exceptions bubble up (similar to Thrift backend approach)
231+
response = self._pool.request(
232+
method=method.upper(),
233+
url=url,
234+
body=body,
235+
headers=headers,
236+
preload_content=True,
237+
retries=self.retry_policy,
238+
)
239239

240-
logger.debug(f"Response status: {response.status}")
241-
242-
# Handle successful responses
243-
if 200 <= response.status < 300:
244-
if response.data:
245-
try:
246-
result = json.loads(response.data.decode("utf-8"))
247-
logger.debug("Successfully parsed JSON response")
248-
return result
249-
except (json.JSONDecodeError, UnicodeDecodeError) as e:
250-
logger.error(f"Failed to parse JSON response: {e}")
251-
raise RequestError(f"Invalid JSON response: {e}", e)
252-
return {}
253-
254-
# Handle error responses
255-
error_message = f"SEA HTTP request failed with status {response.status}"
256-
257-
try:
258-
if response.data:
259-
error_details = json.loads(response.data.decode("utf-8"))
260-
if isinstance(error_details, dict) and "message" in error_details:
261-
error_message = f"{error_message}: {error_details['message']}"
262-
logger.error(f"Request failed: {error_details}")
263-
except (json.JSONDecodeError, UnicodeDecodeError):
264-
# Log raw response if we can't parse JSON
265-
content = response.data.decode("utf-8", errors="replace") if response.data else ""
266-
logger.error(f"Request failed with non-JSON response: {content}")
267-
268-
raise RequestError(error_message, None)
269-
270-
except MaxRetryError as e:
271-
# Extract the most recent error from the retry history
272-
error_message = f"SEA request failed after retries: {str(e)}"
273-
274-
if hasattr(e, "reason") and e.reason:
275-
if hasattr(e.reason, "response"):
276-
# Extract status code and body from the final failed response
277-
response = e.reason.response
278-
error_message = f"SEA request failed after retries (status {response.status})"
279-
try:
280-
if response.data:
281-
error_details = json.loads(response.data.decode("utf-8"))
282-
if isinstance(error_details, dict) and "message" in error_details:
283-
error_message = f"{error_message}: {error_details['message']}"
284-
except (json.JSONDecodeError, UnicodeDecodeError):
285-
pass
286-
else:
287-
error_message = f"SEA request failed after retries: {str(e.reason)}"
288-
289-
logger.error(error_message)
290-
raise RequestError(error_message, e)
291-
292-
except HTTPError as e:
293-
error_message = f"SEA HTTP error: {str(e)}"
294-
logger.error(error_message)
295-
raise RequestError(error_message, e)
296-
297-
except Exception as e:
298-
error_message = f"Unexpected error in SEA request: {str(e)}"
299-
logger.error(error_message)
300-
raise RequestError(error_message, e)
240+
logger.debug(f"Response status: {response.status}")
241+
242+
# Handle successful responses
243+
if 200 <= response.status < 300:
244+
if response.data:
245+
try:
246+
result = json.loads(response.data.decode("utf-8"))
247+
logger.debug("Successfully parsed JSON response")
248+
return result
249+
except (json.JSONDecodeError, UnicodeDecodeError) as e:
250+
logger.error(f"Failed to parse JSON response: {e}")
251+
raise RequestError(f"Invalid JSON response: {e}", e)
252+
return {}
253+
254+
# Handle error responses
255+
error_message = f"SEA HTTP request failed with status {response.status}"
256+
257+
try:
258+
if response.data:
259+
error_details = json.loads(response.data.decode("utf-8"))
260+
if isinstance(error_details, dict) and "message" in error_details:
261+
error_message = f"{error_message}: {error_details['message']}"
262+
logger.error(f"Request failed: {error_details}")
263+
except (json.JSONDecodeError, UnicodeDecodeError):
264+
# Log raw response if we can't parse JSON
265+
content = response.data.decode("utf-8", errors="replace") if response.data else ""
266+
logger.error(f"Request failed with non-JSON response: {content}")
267+
268+
raise RequestError(error_message, None)
301269

302270
def _get_command_type_from_path(self, path: str, method: str) -> CommandType:
303271
"""

0 commit comments

Comments
 (0)