Skip to content

Commit 2f8e306

Browse files
committed
SNOW-27691: cleaned up SIGINT signal handler
1 parent 0111960 commit 2f8e306

File tree

3 files changed

+44
-37
lines changed

3 files changed

+44
-37
lines changed

connection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
u'role': None, # snowflake
5656
u'session_id': None, # snowflake
5757
u'connect_timeout': None, # snowflake internal connection timeout
58-
u'request_timeout': None, # snowflake internalrequest timeout
58+
u'request_timeout': None, # snowflake internal request timeout
5959
u'login_timeout': 60, # login timeout
6060
u'network_timeout': None, # network timeout (infinite by default)
6161
u'passcode_in_password': False, # Snowflake MFA

cursor.py

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def __init__(self, connection):
6666

6767
self._errorhandler = Error.default_errorhandler
6868
self.messages = []
69-
self.timebomb = None
69+
self._timebomb = None # must be here for abort_exit method
7070
self._description = None
7171
self._column_idx_to_name = None
7272
self._sfqid = None
@@ -278,8 +278,9 @@ def close(self):
278278
def is_closed(self):
279279
return self._connection is None or self._connection.is_closed()
280280

281-
def _execute_helper(self, query, timeout=0, statement_params=None,
282-
is_internal=False, _no_results=False, _is_put_get=None):
281+
def _execute_helper(
282+
self, query, timeout=0, statement_params=None,
283+
is_internal=False, _no_results=False, _is_put_get=None):
283284
del self.messages[:]
284285

285286
if statement_params is not None and not isinstance(
@@ -296,14 +297,6 @@ def _execute_helper(self, query, timeout=0, statement_params=None,
296297
self._sequence_counter = self._connection._next_sequence_counter()
297298
self._request_id = uuid.uuid4()
298299

299-
real_timeout = timeout if timeout and timeout > 0 \
300-
else self._connection.connect_timeout
301-
if real_timeout is not None:
302-
self.timebomb = Timer(real_timeout, self.__cancel_query, [query])
303-
else:
304-
self.timebomb = None
305-
if self.timebomb is not None:
306-
self.timebomb.start()
307300
if self.logger.getEffectiveLevel() <= logging.DEBUG:
308301
self.logger.debug(
309302
u'running query [%s]',
@@ -319,13 +312,24 @@ def _execute_helper(self, query, timeout=0, statement_params=None,
319312
self.logger.debug(u'is_file_transfer: %s',
320313
self._is_file_transfer is not None)
321314

315+
real_timeout = timeout if timeout and timeout > 0 \
316+
else self._connection.request_timeout
317+
318+
if real_timeout is not None:
319+
self._timebomb = Timer(
320+
real_timeout, self.__cancel_query, [query])
321+
self._timebomb.start()
322+
else:
323+
self._timebomb = None
324+
322325
original_sigint = signal.getsignal(signal.SIGINT)
323326

324327
def abort_exit(signum, frame):
325328
signal.signal(signal.SIGINT, signal.SIG_IGN)
326329
try:
327-
if self.timebomb is not None:
328-
self.timebomb.cancel()
330+
if self._timebomb is not None:
331+
self._timebomb.cancel()
332+
self._timebomb = None
329333
self.__cancel_query(query)
330334
finally:
331335
signal.signal(signal.SIGINT, original_sigint)
@@ -334,20 +338,29 @@ def abort_exit(signum, frame):
334338
try:
335339
signal.signal(signal.SIGINT, abort_exit)
336340
except ValueError:
337-
pass
338-
ret = self._connection._cmd_query(
339-
query,
340-
self._sequence_counter,
341-
self._request_id,
342-
is_file_transfer=self._is_file_transfer,
343-
statement_params=statement_params,
344-
is_internal=is_internal,
345-
_no_results=_no_results)
346-
341+
self.logger.info(
342+
u'Failed to set SIGINT handler. '
343+
u'Not in main thread. Ignored...')
347344
try:
348-
signal.signal(signal.SIGINT, original_sigint)
349-
except ValueError:
350-
pass
345+
ret = self._connection._cmd_query(
346+
query,
347+
self._sequence_counter,
348+
self._request_id,
349+
is_file_transfer=self._is_file_transfer,
350+
statement_params=statement_params,
351+
is_internal=is_internal,
352+
_no_results=_no_results)
353+
finally:
354+
try:
355+
signal.signal(signal.SIGINT, original_sigint)
356+
except ValueError:
357+
self.logger.info(
358+
u'Failed to reset SIGINT handler. Not in main '
359+
u'thread. Ignored...')
360+
if self._timebomb is not None:
361+
self._timebomb.cancel()
362+
self.logger.debug(u'cancelled timebomb in finally')
363+
351364
if u'data' in ret and u'parameters' in ret[u'data']:
352365
for kv in ret[u'data'][u'parameters']:
353366
if u'TIMESTAMP_OUTPUT_FORMAT' in kv[u'name']:
@@ -373,10 +386,7 @@ def abort_exit(signum, frame):
373386
self._connection.converter.set_parameters(
374387
ret[u'data'][u'parameters'])
375388

376-
if self.timebomb is not None:
377-
self.timebomb.cancel()
378389
self._sequence_counter = -1
379-
self.logger.debug(u'cancelled timebomb in finally')
380390
return ret
381391

382392
def execute(self, command, params=None, timeout=None,
@@ -770,9 +780,10 @@ def __cancel_query(self, query):
770780
self.logger.debug(u'canceled : %s, %s',
771781
query, self._sequence_counter)
772782
with self._lock_canceling:
773-
self._connection._cancel_query(query,
774-
self._sequence_counter,
775-
self._request_id)
783+
self._connection._cancel_query(
784+
query,
785+
self._sequence_counter,
786+
self._request_id)
776787

777788
def __process_params_dict(self, params):
778789
try:

test/test_cursor.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -823,10 +823,6 @@ def test_execute_after_close(conn_testaccount):
823823
cursor.execute('show tables')
824824

825825

826-
def ctrlc():
827-
raise KeyboardInterrupt("CTRL-C!")
828-
829-
830826
def test_cancel_query(conn_cnx):
831827
with conn_cnx() as cnx:
832828
# run one query first to set the client API version to V2

0 commit comments

Comments
 (0)