fix: гонка dispatch-before-commit (search/plagiarism) + detached user в notify
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:
jze9
2026-07-30 13:04:49 +05:00
parent 8dc51a4f65
commit 61b2275972
3 changed files with 22 additions and 15 deletions

View File

@@ -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)