Unify the database connection lifecycle across all workers

This commit is contained in:
Jake Moshenko 2015-12-04 15:51:53 -05:00
parent 38cb63d195
commit 2f626f2691
7 changed files with 111 additions and 130 deletions

View file

@ -1,19 +1,11 @@
import logging
import json
import signal
import sys
from threading import Event, Lock
from datetime import datetime, timedelta
from threading import Thread
from time import sleep
from app import app
from data.model import db
from data.queue import WorkQueue
from data.database import UseThenDisconnect
from data.database import CloseForLongOperation
from workers.worker import Worker
logger = logging.getLogger(__name__)
@ -92,20 +84,20 @@ class QueueWorker(Worker):
with self._current_item_lock:
current_queue_item = self.current_queue_item
if current_queue_item is None:
# Close the db handle.
self._close_db_handle()
break
logger.debug('Queue gave us some work: %s', current_queue_item.body)
job_details = json.loads(current_queue_item.body)
try:
self.process_queue_item(job_details)
with CloseForLongOperation(app.config):
self.process_queue_item(job_details)
self.mark_current_complete()
except JobException as jex:
logger.warning('An error occurred processing request: %s', current_queue_item.body)
logger.warning('Job exception: %s' % jex)
logger.warning('Job exception: %s', jex)
self.mark_current_incomplete(restore_retry=False)
except WorkerUnhealthyException as exc:
@ -114,10 +106,6 @@ class QueueWorker(Worker):
self.mark_current_incomplete(restore_retry=True)
self._stop.set()
finally:
# Close the db handle.
self._close_db_handle()
if not self._stop.is_set():
with self._current_item_lock:
self.current_queue_item = self._queue.get(processing_time=self._reservation_seconds)
@ -126,8 +114,7 @@ class QueueWorker(Worker):
logger.debug('No more work.')
def update_queue_metrics(self):
with UseThenDisconnect(app.config):
self._queue.update_metrics()
self._queue.update_metrics()
def mark_current_incomplete(self, restore_retry=False):
with self._current_item_lock: