[bug] Реиндекс эмбеддингов: счётчик «Indexed X of Y» не обновляется в реалтайме (только по перезагрузке) — follow-up #242 #262
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Баг: счётчик «Indexed X of Y» при реиндексации эмбеддингов не обновляется в реалтайме
Регрессия/недоделка по итогам PR #242 (live reindex progress). Замечание из ревью: vvzvlad/gitmost#242 (comment).
Симптом
После нажатия Reindex now в настройках AI → Embeddings:
Indexed 0 of 479 pages) — предсев прогресса работает;На скриншоте из обсуждения видно зависшее
Indexed 0 of 479 pagesпри включённом Semantic search.Ожидаемое поведение
Пока идёт фоновый реиндекс, счётчик должен сам подрастать (0 → total) с шагом опроса ~5 c, без ручной перезагрузки страницы — ровно ради этого в #242 добавлялись live-прогресс в Redis и клиентский поллинг.
Локализация проблемы
Бэкенд, судя по всему, отдаёт корректные данные: в getMasked() при активном прогоне
indexedPagesберётся из живого Redis-прогресса (progress.done), аreindexing = progress != null; воркер инкрементитdoneпо каждой странице (embedding-reindex-progress.service.ts). Именно поэтому перезагрузка страницы показывает верное число — одиночный GET статуса возвращает текущийdone.Значит, ломается клиентский realtime-путь — фоновый опрос настроек не доезжает до перерисовки:
refetchInterval-функцию nextReindexPollInterval() и useAiSettingsQuery();onSuccessмутации реиндекса (setReindexDeadline(Date.now() + REINDEX_POLL_CAP_MS)), а гасится эффектом на[reindexDeadline, settings]черезisReindexComplete().Кандидаты на причину (нужно проверить)
invalidateQueriesможет прийти в момент, когдаreindexingещё/ужеfalse, аindexedPages >= totalPages(DB-fallback) →isReindexComplete()=== true → дедлайн обнуляется, опрос прекращается, число замирает на 0 до перезагрузки.progressможет бытьnull→ отдаётся DB-count, и условие остановки срабатывает преждевременно.refetchInterval-функция получаетquery.state.data, но возвращаетfalse, потому чтоreindexDeadlineк моменту вычисления ужеnull(порядокonSuccessуровня хука vs. уровня вызоваmutate).Шаги воспроизведения
Indexed X of Y, не перезагружая страницу.F5показывает актуальное значение.Уточнить при отладке
Реально ли
doneинкрементится в Redis в реальном времени (HINCRBY на каждую страницу) или only к концу прогона — от этого зависит, чисто ли это клиентский баг или ещё и серверный (буферизация инкрементов). Проверяется наблюдением ключаai:reindex:progress:<workspaceId>во время прогона.Связано: PR #242, комментарий #242 (comment)