Files
anti-plagiarism/services/api/alembic/versions/006_parse_run_started_at.py
jze9 99bf14fe6a feat(admin): честная длительность прогона + добор эмбеддингов
Разбор итогов массовой заливки показал в отладке «среднюю длительность прогона»
в 2.8 часа там, где парсинг занимал 50 секунд: started_at пишется в момент
постановки в очередь, а очередь из 173 источников разбирается часами. Теперь
момент реального старта пишется отдельно (run_started_at, миграция 006), а
схема отдаёт обе величины — сколько ждал очереди и сколько работал.

Плюс scripts/ops/reembed_missing.py: документ попадает в корпус сразу, а вектор
для L3 считает отдельная задача; когда worker-gpu или Ollama недоступны, эти
задачи теряются и документ остаётся невидимым для семантического поиска. Скрипт
находит faiss_id IS NULL и переотправляет пачками (dry-run по умолчанию) —
сейчас таких 23 101 из 177 147.

Документация: актуальные цифры корпуса, дубли при повторном прогоне, лимит
OpenAlex, и главное — гипервизор .254 зафиксирован в DR-HA как самая широкая
единая точка отказа (брокер, эмбеддинги, секреты и прокси на одном железе;
подтверждено аварией 28.08).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 16:51:25 +05:00

32 lines
1.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Отдельная отметка старта выполнения прогона парсинга.
Revision ID: 006
Revises: 005
Create Date: 2026-08-28
`started_at` пишется в момент СОЗДАНИЯ строки, то есть постановки в очередь.
При массовом запуске очередь разбирается часами, и «длительность» прогона по
двум таймстампам показывала 2.8 часа там, где сам парсинг занял 50 секунд —
для отладки это дезинформация. Момент, когда воркер реально взял задачу,
пишем отдельно; разница со `started_at` — это ожидание в очереди.
"""
import sqlalchemy as sa
from alembic import op
revision = "006"
down_revision = "005"
branch_labels = None
depends_on = None
def upgrade() -> None:
# Для уже прошедших прогонов остаётся NULL: подставлять им started_at
# значило бы выдать время ожидания за время работы.
op.add_column("parse_runs", sa.Column("run_started_at", sa.DateTime(), nullable=True))
def downgrade() -> None:
op.drop_column("parse_runs", "run_started_at")