Skip to content

Commit 2c9ab71

Browse files
committed
Force close connection and then reconnect when db connection is closed accidentally
1 parent ba6a39e commit 2c9ab71

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

djcelery/snapshot.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from datetime import timedelta
55

66
from django.conf import settings
7+
from django.db import connection
8+
from django.db.utils import InterfaceError
79

810
from celery import states
911
from celery.events.state import Task
@@ -127,9 +129,16 @@ def _handle_tasks():
127129
for i, task in enumerate(state.tasks.items()):
128130
self.handle_task(task)
129131

130-
for worker in state.workers.items():
131-
self.handle_worker(worker)
132-
_handle_tasks()
132+
try:
133+
for worker in state.workers.items():
134+
self.handle_worker(worker)
135+
_handle_tasks()
136+
except InterfaceError as e:
137+
# When connection already closed exception is raised,
138+
# force to close connection and Django will automatically reconnect
139+
if str(e) == 'connection already closed':
140+
connction.close()
141+
logger.info('Django db connection is closed and will reconnect')
133142

134143
def on_cleanup(self):
135144
expired = (self.TaskState.objects.expire_by_states(states, expires)

0 commit comments

Comments
 (0)