From b0ff2692f96321419c0da92ad0edd1cb56058ca2 Mon Sep 17 00:00:00 2001 From: Will James Date: Fri, 3 Oct 2025 13:52:01 -0500 Subject: [PATCH 1/7] Set client prefetch threads to 1 to prevent deadlock at exit --- dbt-snowflake/src/dbt/adapters/snowflake/connections.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py index b83032a76..814dc5c75 100644 --- a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py +++ b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py @@ -394,6 +394,7 @@ def connect(): application="dbt", insecure_mode=creds.insecure_mode, session_parameters=session_parameters, + client_prefetch_threads=1, # disable client prefetch because it can cause deadlock at exit, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 **creds.auth_args(), ) From da152e694df5d65e4e91c0003989a773b19b3436 Mon Sep 17 00:00:00 2001 From: Will James Date: Fri, 3 Oct 2025 14:00:38 -0500 Subject: [PATCH 2/7] Add changelog entry --- .../.changes/unreleased/Fixes-20251003-140016.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 dbt-snowflake/.changes/unreleased/Fixes-20251003-140016.yaml diff --git a/dbt-snowflake/.changes/unreleased/Fixes-20251003-140016.yaml b/dbt-snowflake/.changes/unreleased/Fixes-20251003-140016.yaml new file mode 100644 index 000000000..a26807230 --- /dev/null +++ b/dbt-snowflake/.changes/unreleased/Fixes-20251003-140016.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Set client prefetch threads to 1 to prevent deadlock at exit +time: 2025-10-03T14:00:16.074315-05:00 +custom: + Author: wiggzz + Issue: "1368" From 696b46eccff3188f8cadd5ebb3fa270a3b19e8cb Mon Sep 17 00:00:00 2001 From: Will James Date: Fri, 3 Oct 2025 14:29:41 -0500 Subject: [PATCH 3/7] Lint --- dbt-snowflake/src/dbt/adapters/snowflake/connections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py index 814dc5c75..3eef81b04 100644 --- a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py +++ b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py @@ -394,7 +394,7 @@ def connect(): application="dbt", insecure_mode=creds.insecure_mode, session_parameters=session_parameters, - client_prefetch_threads=1, # disable client prefetch because it can cause deadlock at exit, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 + client_prefetch_threads=1, # disable client prefetch because it can cause deadlock at exit, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 **creds.auth_args(), ) From f60fb980f927f6b1e304b8016e385930e573cc70 Mon Sep 17 00:00:00 2001 From: Will James Date: Mon, 6 Oct 2025 13:47:09 -0500 Subject: [PATCH 4/7] Update tests --- dbt-snowflake/tests/unit/test_snowflake_adapter.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dbt-snowflake/tests/unit/test_snowflake_adapter.py b/dbt-snowflake/tests/unit/test_snowflake_adapter.py index 3a7cac5be..16b779b2b 100644 --- a/dbt-snowflake/tests/unit/test_snowflake_adapter.py +++ b/dbt-snowflake/tests/unit/test_snowflake_adapter.py @@ -292,6 +292,7 @@ def test_client_session_keep_alive_false_by_default(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ), ] ) @@ -325,6 +326,7 @@ def test_client_session_keep_alive_true(self): insecure_mode=False, session_parameters={}, reuse_connections=None, + client_prefetch_threads=1, ) ] ) @@ -352,6 +354,7 @@ def test_client_has_query_tag(self): application="dbt", insecure_mode=False, session_parameters={"QUERY_TAG": "test_query_tag"}, + client_prefetch_threads=1, ) ] ) @@ -387,6 +390,7 @@ def test_user_pass_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -421,6 +425,7 @@ def test_authenticator_user_pass_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -451,6 +456,7 @@ def test_authenticator_externalbrowser_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -485,6 +491,7 @@ def test_authenticator_oauth_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -519,6 +526,7 @@ def test_authenticator_private_key_authentication(self, mock_get_private_key): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -553,6 +561,7 @@ def test_authenticator_private_key_authentication_no_passphrase(self, mock_get_p insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -585,6 +594,7 @@ def test_authenticator_jwt_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -615,6 +625,7 @@ def test_query_tag(self): insecure_mode=False, session_parameters={"QUERY_TAG": "test_query_tag"}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -644,6 +655,7 @@ def test_reuse_connections_with_keep_alive(self): insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -678,6 +690,7 @@ def test_authenticator_private_key_string_authentication(self, mock_get_private_ insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) @@ -714,6 +727,7 @@ def test_authenticator_private_key_string_authentication_no_passphrase( insecure_mode=False, session_parameters={}, reuse_connections=True, + client_prefetch_threads=1, ) ] ) From 6047713ae2ed25581982a664c0cbf4e512dce5cc Mon Sep 17 00:00:00 2001 From: Will James Date: Fri, 10 Oct 2025 09:54:08 -0500 Subject: [PATCH 5/7] Upgrade to snowflake-connector-python 4.0.0 and use ocsp_root_certs_dict_lock_timeout=10 --- dbt-snowflake/pyproject.toml | 2 +- .../src/dbt/adapters/snowflake/connections.py | 2 +- .../tests/unit/test_snowflake_adapter.py | 28 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/dbt-snowflake/pyproject.toml b/dbt-snowflake/pyproject.toml index 572b78f35..bebfccad9 100644 --- a/dbt-snowflake/pyproject.toml +++ b/dbt-snowflake/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "dbt-common>=1.10,<2.0", "dbt-adapters>=1.16.6,<2.0", # lower bound pin due to CVE-2025-24794 - "snowflake-connector-python[secure-local-storage]>=3.13.1,<4.0.0", + "snowflake-connector-python[secure-local-storage]>=4.0.0,<5.0.0", "certifi<2025.4.26", # add dbt-core to ensure backwards compatibility of installation, this is not a functional dependency "dbt-core>=1.10.0rc0", diff --git a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py index 3eef81b04..b9e2fd393 100644 --- a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py +++ b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py @@ -394,7 +394,7 @@ def connect(): application="dbt", insecure_mode=creds.insecure_mode, session_parameters=session_parameters, - client_prefetch_threads=1, # disable client prefetch because it can cause deadlock at exit, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 + ocsp_root_certs_dict_lock_timeout=10, # cert lock can cause deadlock without timeout, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 **creds.auth_args(), ) diff --git a/dbt-snowflake/tests/unit/test_snowflake_adapter.py b/dbt-snowflake/tests/unit/test_snowflake_adapter.py index 16b779b2b..c3d83df4f 100644 --- a/dbt-snowflake/tests/unit/test_snowflake_adapter.py +++ b/dbt-snowflake/tests/unit/test_snowflake_adapter.py @@ -292,7 +292,7 @@ def test_client_session_keep_alive_false_by_default(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ), ] ) @@ -326,7 +326,7 @@ def test_client_session_keep_alive_true(self): insecure_mode=False, session_parameters={}, reuse_connections=None, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -354,7 +354,7 @@ def test_client_has_query_tag(self): application="dbt", insecure_mode=False, session_parameters={"QUERY_TAG": "test_query_tag"}, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -390,7 +390,7 @@ def test_user_pass_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -425,7 +425,7 @@ def test_authenticator_user_pass_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -456,7 +456,7 @@ def test_authenticator_externalbrowser_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -491,7 +491,7 @@ def test_authenticator_oauth_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -526,7 +526,7 @@ def test_authenticator_private_key_authentication(self, mock_get_private_key): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -561,7 +561,7 @@ def test_authenticator_private_key_authentication_no_passphrase(self, mock_get_p insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -594,7 +594,7 @@ def test_authenticator_jwt_authentication(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -625,7 +625,7 @@ def test_query_tag(self): insecure_mode=False, session_parameters={"QUERY_TAG": "test_query_tag"}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -655,7 +655,7 @@ def test_reuse_connections_with_keep_alive(self): insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -690,7 +690,7 @@ def test_authenticator_private_key_string_authentication(self, mock_get_private_ insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) @@ -727,7 +727,7 @@ def test_authenticator_private_key_string_authentication_no_passphrase( insecure_mode=False, session_parameters={}, reuse_connections=True, - client_prefetch_threads=1, + ocsp_root_certs_dict_lock_timeout=10, ) ] ) From 49d318e326d1c8ec40e9ec9c1a9bb978e8de95d7 Mon Sep 17 00:00:00 2001 From: Will James Date: Fri, 10 Oct 2025 09:55:15 -0500 Subject: [PATCH 6/7] Add changleog entry --- .../.changes/unreleased/Dependencies-20251010-095457.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 dbt-snowflake/.changes/unreleased/Dependencies-20251010-095457.yaml diff --git a/dbt-snowflake/.changes/unreleased/Dependencies-20251010-095457.yaml b/dbt-snowflake/.changes/unreleased/Dependencies-20251010-095457.yaml new file mode 100644 index 000000000..2ef19bfe0 --- /dev/null +++ b/dbt-snowflake/.changes/unreleased/Dependencies-20251010-095457.yaml @@ -0,0 +1,6 @@ +kind: Dependencies +body: Upgrade snowflake-connector-python to 4.0.0 +time: 2025-10-10T09:54:57.268488-05:00 +custom: + Author: wiggzz + PR: "1368" From b380f8fdb02fa23c449ae32b7061be56471799c6 Mon Sep 17 00:00:00 2001 From: Will James Date: Fri, 10 Oct 2025 10:01:49 -0500 Subject: [PATCH 7/7] lint --- dbt-snowflake/src/dbt/adapters/snowflake/connections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py index b9e2fd393..a1c173ea4 100644 --- a/dbt-snowflake/src/dbt/adapters/snowflake/connections.py +++ b/dbt-snowflake/src/dbt/adapters/snowflake/connections.py @@ -394,7 +394,7 @@ def connect(): application="dbt", insecure_mode=creds.insecure_mode, session_parameters=session_parameters, - ocsp_root_certs_dict_lock_timeout=10, # cert lock can cause deadlock without timeout, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 + ocsp_root_certs_dict_lock_timeout=10, # cert lock can cause deadlock without timeout, see https://github.com/snowflakedb/snowflake-connector-python/issues/2213 **creds.auth_args(), )