Add a lockmode for the update_notifications_status_by_id to prevent the timeout task from updating the same notification more than once.

This happens because more than one beat process was creating the timeout task, resulting in multiple workers running the same queries at the same time.
This commit is contained in:
Rebecca Law
2016-07-08 14:48:07 +01:00
parent d28775800c
commit 1bfd25107b
2 changed files with 7 additions and 5 deletions

View File

@@ -76,6 +76,7 @@ def delete_invitations():
@notify_celery.task(name='timeout-sending-notifications')
def timeout_notifications():
# TODO: optimize the query by adding the date where clause to this query.
notifications = get_notifications(filter_dict={'status': 'sending'})
now = datetime.utcnow()
for noti in notifications:
@@ -83,10 +84,11 @@ def timeout_notifications():
if (now - noti.created_at) > timedelta(
seconds=current_app.config.get('SENDING_NOTIFICATIONS_TIMEOUT_PERIOD')
):
update_notification_status_by_id(noti.id, 'temporary-failure', STATISTICS_FAILURE)
current_app.logger.info((
"Timeout period reached for notification ({})"
", status has been updated.").format(noti.id))
# TODO: think about making this a bulk update rather than one at a time.
updated = update_notification_status_by_id(noti.id, 'temporary-failure', STATISTICS_FAILURE)
if updated:
current_app.logger.info(("Timeout period reached for notification ({})"
", status has been updated.").format(noti.id))
except Exception as e:
current_app.logger.exception(e)
current_app.logger.error((