Skip to content

Commit 0496cb2

Browse files
rsichnyiauvipy
authored andcommitted
Fix race condition for schedule_changed() (#182)
* retry later in case of InterfaceError in schedule_changed() * make logs less noisy
1 parent 0485739 commit 0496cb2

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

django_celery_beat/schedulers.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"""
4141

4242
logger = get_logger(__name__)
43-
debug, info = logger.debug, logger.info
43+
debug, info, warning = logger.debug, logger.info, logger.warning
4444

4545

4646
class ModelEntry(ScheduleEntry):
@@ -221,8 +221,9 @@ def all_as_schedule(self):
221221
return s
222222

223223
def schedule_changed(self):
224-
close_old_connections()
225224
try:
225+
close_old_connections()
226+
226227
# If MySQL is running with transaction isolation level
227228
# REPEATABLE-READ (default), then we won't see changes done by
228229
# other transactions until the current transaction is
@@ -236,6 +237,13 @@ def schedule_changed(self):
236237
except DatabaseError as exc:
237238
logger.exception('Database gave error: %r', exc)
238239
return False
240+
except InterfaceError:
241+
warning(
242+
'DatabaseScheduler: InterfaceError in schedule_changed(), '
243+
'waiting to retry in next call...'
244+
)
245+
return False
246+
239247
try:
240248
if ts and ts > (last if last else ts):
241249
return True
@@ -264,10 +272,16 @@ def sync(self):
264272
_tried.add(name)
265273
except (KeyError, ObjectDoesNotExist) as exc:
266274
_failed.add(name)
267-
except (DatabaseError, InterfaceError) as exc:
275+
except DatabaseError as exc:
276+
logger.exception('Database error while sync: %r', exc)
277+
except InterfaceError:
278+
warning(
279+
'DatabaseScheduler: InterfaceError in sync(), '
280+
'waiting to retry in next call...'
281+
)
282+
finally:
268283
# retry later, only for the failed ones
269284
self._dirty |= _failed
270-
logger.exception('Database error while sync: %r', exc)
271285

272286
def update_from_dict(self, mapping):
273287
s = {}

0 commit comments

Comments
 (0)