fix: гонка dispatch-before-commit (search/plagiarism) + detached user в notify
All checks were successful
Deploy / deploy (push) Successful in 23s
All checks were successful
Deploy / deploy (push) Successful in 23s
Три бага, найденные при аудите прода: - search и documents диспатчили Celery-задачу ДО commit() — быстрый воркер читал задачу раньше, чем транзакция закоммичена, и падал «задача не найдена» (поиск не работал вовсе; плагиат спасала латентность скачивания из MinIO). Теперь коммитим до диспатча. - notify.send_task_done обращался к user.email/name и task.type ПОСЛЕ закрытия сессии → DetachedInstanceError, письма о завершении уходили в ретраи. Значения достаются внутри сессии. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -46,19 +46,24 @@ def send_task_done(self, task_id: str) -> dict:
|
||||
|
||||
# Формируем краткое описание результата
|
||||
summary = _build_summary(task)
|
||||
# Достаём значения ДО закрытия сессии — иначе объекты становятся
|
||||
# detached и обращение к атрибутам падает DetachedInstanceError.
|
||||
user_email = user.email
|
||||
user_name = user.name
|
||||
task_type = task.type
|
||||
|
||||
sender = EmailSender()
|
||||
sender.send_task_done(
|
||||
user_email=user.email,
|
||||
user_name=user.name,
|
||||
user_email=user_email,
|
||||
user_name=user_name,
|
||||
task_id=task_id,
|
||||
task_type=task.type,
|
||||
task_type=task_type,
|
||||
summary=summary,
|
||||
app_url=settings.APP_URL,
|
||||
)
|
||||
|
||||
logger.info(f"Уведомление отправлено пользователю {user.email!r} для задачи {task_id!r}")
|
||||
return {"status": "sent", "email": user.email}
|
||||
logger.info(f"Уведомление отправлено пользователю {user_email!r} для задачи {task_id!r}")
|
||||
return {"status": "sent", "email": user_email}
|
||||
|
||||
except Exception as exc:
|
||||
logger.error(f"Ошибка отправки уведомления для задачи {task_id!r}: {exc}", exc_info=True)
|
||||
|
||||
Reference in New Issue
Block a user