mirror of
https://github.com/ansible/awx.git
synced 2026-02-17 11:10:03 -03:30
* Add TASK_MANAGER_LOCK_TIMEOUT `TASK_MANAGER_LOCK_TIMEOUT` controls the `idle_in_transaction_session_timeout` and `idle_session_timeout` configuration for task manager connections and lock in database hope to prevent the situation that the task instance that holds the lock becomes unresponsive and preventing other instance to be able to run task manager * Add session timeout to periodic scheduler and all sub task manager locks
30 lines
1.4 KiB
Python
30 lines
1.4 KiB
Python
# Copyright (c) 2017 Ansible by Red Hat
|
|
# All Rights Reserved.
|
|
|
|
from contextlib import contextmanager
|
|
|
|
from django_pglocks import advisory_lock as django_pglocks_advisory_lock
|
|
from django.db import connection
|
|
|
|
|
|
@contextmanager
|
|
def advisory_lock(*args, lock_session_timeout_milliseconds=0, **kwargs):
|
|
if connection.vendor == 'postgresql':
|
|
cur = None
|
|
idle_in_transaction_session_timeout = None
|
|
idle_session_timeout = None
|
|
if lock_session_timeout_milliseconds > 0:
|
|
with connection.cursor() as cur:
|
|
idle_in_transaction_session_timeout = cur.execute('SHOW idle_in_transaction_session_timeout').fetchone()[0]
|
|
idle_session_timeout = cur.execute('SHOW idle_session_timeout').fetchone()[0]
|
|
cur.execute(f"SET idle_in_transaction_session_timeout = {lock_session_timeout_milliseconds}")
|
|
cur.execute(f"SET idle_session_timeout = {lock_session_timeout_milliseconds}")
|
|
with django_pglocks_advisory_lock(*args, **kwargs) as internal_lock:
|
|
yield internal_lock
|
|
if lock_session_timeout_milliseconds > 0:
|
|
with connection.cursor() as cur:
|
|
cur.execute(f"SET idle_in_transaction_session_timeout = {idle_in_transaction_session_timeout}")
|
|
cur.execute(f"SET idle_session_timeout = {idle_session_timeout}")
|
|
else:
|
|
yield True
|