Skip to content

Commit bc9616a

Browse files
reverted SNOW-264606 client session keep alive fix (#664)
1 parent b59814d commit bc9616a

File tree

2 files changed

+18
-117
lines changed

2 files changed

+18
-117
lines changed

src/snowflake/connector/connection.py

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@
9494
from .sqlstate import SQLSTATE_CONNECTION_NOT_EXISTS, SQLSTATE_FEATURE_NOT_SUPPORTED
9595
from .telemetry import TelemetryClient
9696
from .telemetry_oob import TelemetryService
97-
from .time_util import HeartBeatTimer, get_time_millis
97+
from .time_util import (
98+
DEFAULT_MASTER_VALIDITY_IN_SECONDS,
99+
HeartBeatTimer,
100+
get_time_millis,
101+
)
98102
from .util_text import construct_hostname, parse_account, split_statements
99103

100104

@@ -154,7 +158,7 @@ def DefaultConverterClass():
154158
"inject_client_pause": (0, int), # snowflake internal
155159
"session_parameters": (None, (type(None), dict)), # snowflake session parameters
156160
"autocommit": (None, (type(None), bool)), # snowflake
157-
"client_session_keep_alive": (None, (type(None), bool)), # snowflake
161+
"client_session_keep_alive": (False, bool), # snowflake
158162
"client_session_keep_alive_heartbeat_frequency": (
159163
None,
160164
(type(None), int),
@@ -359,11 +363,15 @@ def client_session_keep_alive(self):
359363

360364
@client_session_keep_alive.setter
361365
def client_session_keep_alive(self, value):
362-
self._client_session_keep_alive = value
366+
self._client_session_keep_alive = True if value else False
363367

364368
@property
365369
def client_session_keep_alive_heartbeat_frequency(self):
366-
return self._client_session_keep_alive_heartbeat_frequency
370+
return (
371+
self._client_session_keep_alive_heartbeat_frequency
372+
if self._client_session_keep_alive_heartbeat_frequency
373+
else DEFAULT_MASTER_VALIDITY_IN_SECONDS / 16
374+
)
367375

368376
@client_session_keep_alive_heartbeat_frequency.setter
369377
def client_session_keep_alive_heartbeat_frequency(self, value):
@@ -665,12 +673,10 @@ def __open_connection(self):
665673
PARAMETER_CLIENT_VALIDATE_DEFAULT_PARAMETERS
666674
] = True
667675

668-
if self.client_session_keep_alive is not None:
669-
self._session_parameters[
670-
PARAMETER_CLIENT_SESSION_KEEP_ALIVE
671-
] = self._client_session_keep_alive
676+
if self.client_session_keep_alive:
677+
self._session_parameters[PARAMETER_CLIENT_SESSION_KEEP_ALIVE] = True
672678

673-
if self.client_session_keep_alive_heartbeat_frequency is not None:
679+
if self.client_session_keep_alive_heartbeat_frequency:
674680
self._session_parameters[
675681
PARAMETER_CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY
676682
] = self._validate_client_session_keep_alive_heartbeat_frequency()
@@ -698,9 +704,6 @@ def __open_connection(self):
698704
self._password = None # ensure password won't persist
699705

700706
if self.client_session_keep_alive:
701-
# This will be called after the heartbeat frequency has actually been set.
702-
# By this point it should have been decided if the heartbeat has to be enabled
703-
# and what would the heartbeat frequency be
704707
self._add_heartbeat()
705708

706709
def __preprocess_auth_instance(self, auth_instance):
@@ -1176,10 +1179,7 @@ def _validate_client_session_keep_alive_heartbeat_frequency(self):
11761179
"""Validate and return heartbeat frequency in seconds."""
11771180
real_max = int(self.rest.master_validity_in_seconds / 4)
11781181
real_min = int(real_max / 4)
1179-
if self.client_session_keep_alive_heartbeat_frequency is None:
1180-
# This is an unlikely scenario but covering it just in case.
1181-
self._client_session_keep_alive_heartbeat_frequency = real_min
1182-
elif self.client_session_keep_alive_heartbeat_frequency > real_max:
1182+
if self.client_session_keep_alive_heartbeat_frequency > real_max:
11831183
self._client_session_keep_alive_heartbeat_frequency = real_max
11841184
elif self.client_session_keep_alive_heartbeat_frequency < real_min:
11851185
self._client_session_keep_alive_heartbeat_frequency = real_min
@@ -1215,15 +1215,8 @@ def _update_parameters(
12151215
else:
12161216
TelemetryService.get_instance().disable()
12171217
elif PARAMETER_CLIENT_SESSION_KEEP_ALIVE == name:
1218-
# Only set if the local config is None.
1219-
# Always give preference to user config.
1220-
if self.client_session_keep_alive is None:
1221-
self.client_session_keep_alive = value
1222-
elif (
1223-
PARAMETER_CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY == name
1224-
and self.client_session_keep_alive_heartbeat_frequency is None
1225-
):
1226-
# Only set if local value hasn't been set already.
1218+
self.client_session_keep_alive = value
1219+
elif PARAMETER_CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY == name:
12271220
self.client_session_keep_alive_heartbeat_frequency = value
12281221
elif PARAMETER_SERVICE_NAME == name:
12291222
self.service_name = value

test/integ/test_session_parameters.py

Lines changed: 0 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,8 @@
44
# Copyright (c) 2012-2021 Snowflake Computing Inc. All right reserved.
55
#
66

7-
import pytest
8-
97
import snowflake.connector
108

11-
try: # pragma: no cover
12-
from parameters import CONNECTION_PARAMETERS_ADMIN
13-
except ImportError:
14-
CONNECTION_PARAMETERS_ADMIN = {}
15-
169

1710
def test_session_parameters(db_parameters):
1811
"""Sets the session parameters in connection time."""
@@ -29,88 +22,3 @@ def test_session_parameters(db_parameters):
2922
)
3023
ret = connection.cursor().execute("show parameters like 'TIMEZONE'").fetchone()
3124
assert ret[1] == "UTC"
32-
33-
34-
@pytest.mark.skipif(
35-
not CONNECTION_PARAMETERS_ADMIN,
36-
reason="Snowflake admin required to setup parameter.",
37-
)
38-
def test_client_session_keep_alive(db_parameters, conn_cnx):
39-
"""Tests client_session_keep_alive setting.
40-
41-
Ensures that client's explicit config for client_session_keep_alive
42-
session parameter is always honored and given higher precedence over
43-
user and account level backend configuration.
44-
"""
45-
admin_cnxn = snowflake.connector.connect(
46-
protocol=db_parameters["sf_protocol"],
47-
account=db_parameters["sf_account"],
48-
user=db_parameters["sf_user"],
49-
password=db_parameters["sf_password"],
50-
host=db_parameters["sf_host"],
51-
port=db_parameters["sf_port"],
52-
)
53-
54-
# Ensure backend parameter is set to False
55-
set_backend_client_session_keep_alive(db_parameters, admin_cnxn, False)
56-
with conn_cnx(client_session_keep_alive=True) as connection:
57-
ret = (
58-
connection.cursor()
59-
.execute("show parameters like 'CLIENT_SESSION_KEEP_ALIVE'")
60-
.fetchone()
61-
)
62-
assert ret[1] == "true"
63-
64-
# Set backend parameter to True
65-
set_backend_client_session_keep_alive(db_parameters, admin_cnxn, True)
66-
67-
# Set session parameter to False
68-
with conn_cnx(client_session_keep_alive=False) as connection:
69-
ret = (
70-
connection.cursor()
71-
.execute("show parameters like 'CLIENT_SESSION_KEEP_ALIVE'")
72-
.fetchone()
73-
)
74-
assert ret[1] == "false"
75-
76-
# Set session parameter to None backend parameter continues to be True
77-
with conn_cnx(client_session_keep_alive=None) as connection:
78-
ret = (
79-
connection.cursor()
80-
.execute("show parameters like 'CLIENT_SESSION_KEEP_ALIVE'")
81-
.fetchone()
82-
)
83-
assert ret[1] == "true"
84-
85-
admin_cnxn.close()
86-
87-
88-
def create_client_connection(db_parameters: object, val: bool) -> object:
89-
"""Create connection with client session keep alive set to specific value."""
90-
connection = snowflake.connector.connect(
91-
protocol=db_parameters["protocol"],
92-
account=db_parameters["account"],
93-
user=db_parameters["user"],
94-
password=db_parameters["password"],
95-
host=db_parameters["host"],
96-
port=db_parameters["port"],
97-
database=db_parameters["database"],
98-
schema=db_parameters["schema"],
99-
client_session_keep_alive=val,
100-
)
101-
return connection
102-
103-
104-
def set_backend_client_session_keep_alive(
105-
db_parameters: object, admin_cnx: object, val: bool
106-
) -> None:
107-
"""Set both at Account level and User level."""
108-
query = "alter account {} set CLIENT_SESSION_KEEP_ALIVE={}".format(
109-
db_parameters["account"], str(val)
110-
)
111-
admin_cnx.cursor().execute(query)
112-
113-
query = "alter user {}.{} set CLIENT_SESSION_KEEP_ALIVE={}".format(
114-
db_parameters["account"], db_parameters["user"], str(val)
115-
)
116-
admin_cnx.cursor().execute(query)

0 commit comments

Comments
 (0)