split schedule_task_manager into 3

each call to schedule_task_manager becomes one of

ScheduleTaskManager
ScheduleDependencyManager
ScheduleWorkflowManager
This commit is contained in:
Seth Foster
2022-07-07 23:23:01 -04:00
parent b3eb9e0193
commit 0a47d05d26
7 changed files with 88 additions and 73 deletions

View File

@@ -78,8 +78,9 @@ __all__ = [
'IllegalArgumentError',
'get_custom_venv_choices',
'get_external_account',
'task_manager_bulk_reschedule',
'schedule_task_manager',
'ScheduleTaskManager',
'ScheduleDependencyManager',
'ScheduleWorkflowManager',
'classproperty',
'create_temporary_fifo',
'truncate_stdout',
@@ -846,6 +847,59 @@ def get_mem_effective_capacity(mem_bytes):
_inventory_updates = threading.local()
_task_manager = threading.local()
_dependency_manager = threading.local()
_workflow_manager = threading.local()
class ScheduleManager:
def __init__(self, manager, manager_threading_local):
self.manager = manager
self.manager_threading_local = manager_threading_local
def schedule(self):
if getattr(self.manager_threading_local, 'bulk_reschedule', False):
self.manager_threading_local.needs_scheduling = True
return
from django.db import connection
# runs right away if not in transaction
connection.on_commit(lambda: self.manager.delay())
@contextlib.contextmanager
def task_manager_bulk_reschedule(self):
"""Context manager to avoid submitting task multiple times."""
try:
previous_flag = getattr(self.manager_threading_local, 'bulk_reschedule', False)
previous_value = getattr(self.manager_threading_local, 'needs_scheduling', False)
self.manager_threading_local.bulk_reschedule = True
self.manager_threading_local.needs_scheduling = False
yield
finally:
self.manager_threading_local.bulk_reschedule = previous_flag
if self.manager_threading_local.needs_scheduling:
self.schedule()
self.manager_threading_local.needs_scheduling = previous_value
class ScheduleTaskManager(ScheduleManager):
def __init__(self):
from awx.main.scheduler.tasks import task_manager
super().__init__(task_manager, _task_manager)
class ScheduleDependencyManager(ScheduleManager):
def __init__(self):
from awx.main.scheduler.tasks import dependency_manager
super().__init__(dependency_manager, _dependency_manager)
class ScheduleWorkflowManager(ScheduleManager):
def __init__(self):
from awx.main.scheduler.tasks import workflow_manager
super().__init__(workflow_manager, _workflow_manager)
@contextlib.contextmanager
@@ -861,39 +915,6 @@ def ignore_inventory_computed_fields():
_inventory_updates.is_updating = previous_value
def _schedule_task_manager():
from awx.main.scheduler.tasks import task_manager, dependency_manager, workflow_manager
from django.db import connection
# runs right away if not in transaction
connection.on_commit(lambda: task_manager.delay())
connection.on_commit(lambda: dependency_manager.delay())
connection.on_commit(lambda: workflow_manager.delay())
@contextlib.contextmanager
def task_manager_bulk_reschedule():
"""Context manager to avoid submitting task multiple times."""
try:
previous_flag = getattr(_task_manager, 'bulk_reschedule', False)
previous_value = getattr(_task_manager, 'needs_scheduling', False)
_task_manager.bulk_reschedule = True
_task_manager.needs_scheduling = False
yield
finally:
_task_manager.bulk_reschedule = previous_flag
if _task_manager.needs_scheduling:
_schedule_task_manager()
_task_manager.needs_scheduling = previous_value
def schedule_task_manager():
if getattr(_task_manager, 'bulk_reschedule', False):
_task_manager.needs_scheduling = True
return
_schedule_task_manager()
@contextlib.contextmanager
def ignore_inventory_group_removal():
"""