Rollback invalidated transaction

This commit is contained in:
John Davis
2024-01-12 16:05:40 -05:00
parent fca7e3ab30
commit cb01378faa
3 changed files with 20 additions and 1 deletions
+5 -1
View File
@@ -37,7 +37,10 @@ from galaxy.jobs import (
)
from galaxy.jobs.mapper import JobNotReadyException
from galaxy.managers.jobs import get_jobs_to_check_at_startup
from galaxy.model.base import transaction
from galaxy.model.base import (
check_database_connection,
transaction,
)
from galaxy.structured_app import MinimalManagerApp
from galaxy.util import unicodify
from galaxy.util.custom_logging import get_logger
@@ -400,6 +403,7 @@ class JobHandlerQueue(BaseJobHandlerQueue):
the waiting queue. If the job has dependencies with errors, it is marked as having errors and removed from the
queue. If the job belongs to an inactive user it is ignored. Otherwise, the job is dispatched.
"""
check_database_connection(self.sa_session)
# Pull all new jobs from the queue at once
jobs_to_check = []
resubmit_jobs = []
+3
View File
@@ -50,6 +50,7 @@ from galaxy.jobs.runners import (
AsynchronousJobState,
JobState,
)
from galaxy.model.base import check_database_connection
from galaxy.tool_util.deps import dependencies
from galaxy.util import (
galaxy_directory,
@@ -273,6 +274,7 @@ class PulsarJobRunner(AsynchronousJobRunner):
return JobDestination(runner="pulsar", params=url_to_destination_params(url))
def check_watched_item(self, job_state):
check_database_connection(self.app.model.session())
if self.use_mq:
# Might still need to check pod IPs.
job_wrapper = job_state.job_wrapper
@@ -972,6 +974,7 @@ class PulsarJobRunner(AsynchronousJobRunner):
galaxy_job_id = None
remote_job_id = None
try:
check_database_connection(self.sa_session)
remote_job_id = full_status["job_id"]
if len(remote_job_id) == 32:
# It is a UUID - assign_ids = uuid in destination params...
+12
View File
@@ -58,6 +58,18 @@ def transaction(session: Union[scoped_session, Session, "SessionlessContext"]):
yield
def check_database_connection(session):
"""
In the event of a database disconnect, if there exists an active database
transaction, that transaction becomes invalidated. Accessing the database
will raise sqlalchemy.exc.PendingRollbackError. This handles this situation
by rolling back the invalidated transaction.
Ref: https://docs.sqlalchemy.org/en/14/errors.html#can-t-reconnect-until-invalid-transaction-is-rolled-back
"""
if session and session.connection().invalidated:
session.rollback()
# TODO: Refactor this to be a proper class, not a bunch.
class ModelMapping(Bunch):
def __init__(self, model_modules, engine):