Skip to content

Commit baeba85

Browse files
committed
refactor: rely on connector default for _respect_server_retry_after_header
The connector already defaults this parameter to False, so the setdefault in credentials.py was redundant. Users opt in via connection_parameters directly. Also fix the parameter name (was renamed during connector PR review) and tighten upper bound to <4.1.6. Co-authored-by: Isaac
1 parent 89188a8 commit baeba85

4 files changed

Lines changed: 7 additions & 64 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
- Fix column order mismatch in microbatch and replace_where incremental strategies by using INSERT BY NAME syntax ([#1338](https://github.com/databricks/dbt-databricks/issues/1338))
1212
- Fix `dbt run --empty` failing with inline `ref()` / `source()` aliases ([dbt-labs/dbt-adapters#660](https://github.com/dbt-labs/dbt-adapters/issues/660))
1313

14+
### Under the Hood
15+
16+
- Bump `databricks-sql-connector` upper bound to `<4.1.6`, enabling users to opt into `_respect_server_retry_after_header` (available in connector 4.1.5) for server-directed retry behavior via `connection_parameters` ([#1363](https://github.com/databricks/dbt-databricks/pull/1363))
17+
1418
## dbt-databricks 1.11.6 (Mar 10, 2026)
1519

1620
### Features

dbt/adapters/databricks/credentials.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ def __pre_deserialize__(cls, data: dict[Any, Any]) -> dict[Any, Any]:
7373
data.setdefault("connection_parameters", {})
7474
data["connection_parameters"].setdefault("_retry_stop_after_attempts_count", 30)
7575
data["connection_parameters"].setdefault("_retry_delay_max", 60)
76-
data["connection_parameters"].setdefault("_retry_server_directed_only", False)
7776
return data
7877

7978
def __post_init__(self) -> None:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ classifiers = [
2424
dependencies = [
2525
"click>=8.2.0, <9.0.0",
2626
"databricks-sdk>=0.68.0, <0.78.0",
27-
"databricks-sql-connector[pyarrow]>=4.1.5, <4.2.0",
27+
"databricks-sql-connector[pyarrow]>=4.1.1, <4.1.6",
2828
"dbt-adapters>=1.22.0, <1.23.0",
2929
"dbt-common>=1.37.0, <1.38.0",
3030
"dbt-core>=1.11.2, <1.11.7",

tests/unit/test_adapter.py

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ def _connect_func(
242242
expected_http_headers=None,
243243
expected_no_token=None,
244244
expected_client_creds=None,
245-
expected_retry_params=None,
246245
):
247246
def connect(
248247
server_hostname,
@@ -281,9 +280,6 @@ def connect(
281280
assert http_headers is None
282281
else:
283282
assert http_headers == expected_http_headers
284-
if expected_retry_params is not None:
285-
for key, value in expected_retry_params.items():
286-
assert kwargs.get(key) == value
287283
return Mock()
288284

289285
return connect
@@ -359,40 +355,6 @@ def _test_databricks_sql_connector_http_header_connection(self, http_headers, co
359355
assert connection.credentials.token == "dapiXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
360356
assert connection.credentials.schema == "analytics"
361357

362-
def test_databricks_sql_connector_default_retry_params(self):
363-
"""Verify default retry parameters are passed through to dbsql.connect().
364-
365-
Ensures _retry_stop_after_attempts_count, _retry_delay_max, and
366-
_retry_server_directed_only defaults from __pre_deserialize__ reach
367-
the connector.
368-
"""
369-
self._test_databricks_sql_connector_connection(
370-
self._connect_func(
371-
expected_retry_params={
372-
"_retry_stop_after_attempts_count": 30,
373-
"_retry_delay_max": 60,
374-
"_retry_server_directed_only": False,
375-
}
376-
)
377-
)
378-
379-
def test_databricks_sql_connector_retry_server_directed_only_opt_in(self):
380-
"""Verify user can opt in to _retry_server_directed_only via connection_parameters.
381-
382-
When a user sets _retry_server_directed_only: true in their profile,
383-
the connector should only retry requests when the server includes a
384-
Retry-After header, preventing duplicate writes from blind retries.
385-
"""
386-
config = self._get_config(connection_parameters={"_retry_server_directed_only": True})
387-
adapter = DatabricksAdapter(config, get_context("spawn"))
388-
389-
connect = self._connect_func(expected_retry_params={"_retry_server_directed_only": True})
390-
with patch("dbt.adapters.databricks.handle.dbsql.connect", new=connect):
391-
connection = adapter.acquire_connection("dummy")
392-
connection.handle # trigger lazy-load
393-
394-
assert connection.state == "open"
395-
396358
@patch("dbt.adapters.databricks.api_client.DatabricksApiClient")
397359
def test_list_relations_without_caching__no_relations(self, _):
398360
with patch.object(DatabricksAdapter, "get_relations_without_caching") as mocked:
@@ -1396,39 +1358,18 @@ class TestDatabricksCredentialsPreDeserialize:
13961358
"""Tests for DatabricksCredentials.__pre_deserialize__ retry defaults."""
13971359

13981360
def test_pre_deserialize__default_retry_params(self):
1399-
"""Verify all retry defaults are set when connection_parameters is empty."""
1361+
"""Verify retry defaults are set when connection_parameters is empty."""
14001362
data = {"connection_parameters": {}}
14011363
result = DatabricksCredentials.__pre_deserialize__(data)
14021364
assert result["connection_parameters"]["_retry_stop_after_attempts_count"] == 30
14031365
assert result["connection_parameters"]["_retry_delay_max"] == 60
1404-
assert result["connection_parameters"]["_retry_server_directed_only"] is False
14051366

14061367
def test_pre_deserialize__missing_connection_parameters(self):
14071368
"""Verify retry defaults are set even when connection_parameters key is absent."""
1408-
data = {}
1369+
data: dict[Any, Any] = {}
14091370
result = DatabricksCredentials.__pre_deserialize__(data)
14101371
assert result["connection_parameters"]["_retry_stop_after_attempts_count"] == 30
14111372
assert result["connection_parameters"]["_retry_delay_max"] == 60
1412-
assert result["connection_parameters"]["_retry_server_directed_only"] is False
1413-
1414-
def test_pre_deserialize__user_override_retry_server_directed_only(self):
1415-
"""Verify user-provided _retry_server_directed_only is not overridden by default."""
1416-
data = {"connection_parameters": {"_retry_server_directed_only": True}}
1417-
result = DatabricksCredentials.__pre_deserialize__(data)
1418-
assert result["connection_parameters"]["_retry_server_directed_only"] is True
1419-
1420-
def test_pre_deserialize__user_override_preserves_other_defaults(self):
1421-
"""Verify overriding one retry param does not affect the others."""
1422-
data = {
1423-
"connection_parameters": {
1424-
"_retry_stop_after_attempts_count": 5,
1425-
"_retry_server_directed_only": True,
1426-
}
1427-
}
1428-
result = DatabricksCredentials.__pre_deserialize__(data)
1429-
assert result["connection_parameters"]["_retry_stop_after_attempts_count"] == 5
1430-
assert result["connection_parameters"]["_retry_delay_max"] == 60
1431-
assert result["connection_parameters"]["_retry_server_directed_only"] is True
14321373

14331374
def test_pre_deserialize__custom_params_preserve_retry_defaults(self):
14341375
"""Verify unrelated connection_parameters don't interfere with retry defaults."""
@@ -1437,4 +1378,3 @@ def test_pre_deserialize__custom_params_preserve_retry_defaults(self):
14371378
assert result["connection_parameters"]["custom_param"] == "value"
14381379
assert result["connection_parameters"]["_retry_stop_after_attempts_count"] == 30
14391380
assert result["connection_parameters"]["_retry_delay_max"] == 60
1440-
assert result["connection_parameters"]["_retry_server_directed_only"] is False

0 commit comments

Comments
 (0)