From 52e5550f91135038230c074a98cf4e037077d116 Mon Sep 17 00:00:00 2001 From: jze9 Date: Fri, 7 Aug 2026 16:05:42 +0500 Subject: [PATCH] =?UTF-8?q?fix(indexer):=20=D0=B3=D0=BE=D0=BD=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B5=D0=B9=20ext=5Fid=20(Integrity?= =?UTF-8?q?Error=E2=86=92duplicate)=20+=20=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=20Dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add_document: параллельные воркеры проходили проверку existing и оба вставляли один ext_id → IntegrityError в логах. Теперь ловим её, откатываем и возвращаем duplicate — чисто, без шумных ошибок. - Dockerfile: откат --timeout/--retries (он инвалидировал кэш pip-слоя, а толку от него при недоступном pypi нет). Устойчивость сборки решать зеркалом когда появится рабочее. Co-Authored-By: Claude Opus 4.8 --- services/worker-indexer/Dockerfile | 3 +-- services/worker-indexer/app/tasks/index.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/services/worker-indexer/Dockerfile b/services/worker-indexer/Dockerfile index d354018..fa67137 100644 --- a/services/worker-indexer/Dockerfile +++ b/services/worker-indexer/Dockerfile @@ -13,8 +13,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /app COPY requirements.txt . -# --timeout/--retries: канал до pypi медленный и флоки, без этого сборка падает -RUN pip install --no-cache-dir --timeout 120 --retries 10 -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt COPY . . diff --git a/services/worker-indexer/app/tasks/index.py b/services/worker-indexer/app/tasks/index.py index 3e99f8a..1939558 100644 --- a/services/worker-indexer/app/tasks/index.py +++ b/services/worker-indexer/app/tasks/index.py @@ -7,6 +7,7 @@ from typing import Any from celery.utils.log import get_task_logger from sqlalchemy import func, select +from sqlalchemy.exc import IntegrityError from app.algorithms.minhash import add_to_lsh, find_similar from app.algorithms.winnowing import winnow @@ -299,7 +300,16 @@ def add_document(doc_data: dict[str, Any], dispatch_embed: bool = True) -> dict[ doc = Document(**doc_kwargs) session.add(doc) - session.flush() + try: + session.flush() + except IntegrityError: + # Гонка: другой воркер параллельно вставил этот ext_id между нашей + # проверкой existing и flush. Уникальный индекс отработал — это дубль. + session.rollback() + existing = session.execute( + select(Document).where(Document.ext_id == ext_id) + ).scalar_one_or_none() + return {"status": "duplicate", "doc_id": existing.id if existing else None} doc_id = doc.id # Вычислить fingerprints