backend/search/minjust_opensearch.py:202-211 не сохраняет checkpoint после успешного Bulk-пакета. Для --start-at нет надёжно зафиксированного значения: слишком поздний код пропустит данные, а гарантированно безопасен только повторный проход с начала.
request_json не повторяет запросы при HTTP 429/5xx, timeout и обрыве соединения. На длительной загрузке временная сетевая ошибка полностью останавливает процесс.
При errors: true выводится только число ошибок без ID и причин. Bulk API может частично принять пакет, поэтому диагностика и безопасное продолжение затруднены.
Medium
Mapping задаёт одну shard и ноль replicas. Это корректно для локального стенда, но не должно без изменения использоваться в production.
Повторная индексация документа не удалит старые trailing-фрагменты, если нормализованный документ стал короче.
Проверено
все 11 backend-тестов проходят;
docker compose config успешно;
OpenSearch 3.7.0 green, analysis-icu установлен;
полный индекс содержит 56 295 965 фрагментов;
security plugin отключён только на loopback-интерфейсе и явно отмечен как local-only;
версия и footer согласованы на Backend v0.4.1.
## Независимая проверка PR
**Статус: требуются изменения перед слиянием.**
### High
1. `backend/search/minjust_opensearch.py:202-211` не сохраняет checkpoint после успешного Bulk-пакета. Для `--start-at` нет надёжно зафиксированного значения: слишком поздний код пропустит данные, а гарантированно безопасен только повторный проход с начала.
2. `request_json` не повторяет запросы при HTTP 429/5xx, timeout и обрыве соединения. На длительной загрузке временная сетевая ошибка полностью останавливает процесс.
3. При `errors: true` выводится только число ошибок без ID и причин. Bulk API может частично принять пакет, поэтому диагностика и безопасное продолжение затруднены.
### Medium
- Mapping задаёт одну shard и ноль replicas. Это корректно для локального стенда, но не должно без изменения использоваться в production.
- Повторная индексация документа не удалит старые trailing-фрагменты, если нормализованный документ стал короче.
### Проверено
- все 11 backend-тестов проходят;
- `docker compose config` успешно;
- OpenSearch 3.7.0 green, `analysis-icu` установлен;
- полный индекс содержит 56 295 965 фрагментов;
- security plugin отключён только на loopback-интерфейсе и явно отмечен как local-only;
- версия и footer согласованы на Backend v0.4.1.
backend/search/minjust_opensearch.py:240,253: checkpoint не привязан к URL/cluster/index UUID. После пересоздания индекса или запуска против другого кластера с тем же именем --resume может пропустить уже отмеченную часть корпуса.
backend/search/minjust_opensearch.py:240: checkpoint не фиксирует --limit. Resume с другим --limit может загрузить иной диапазон и ошибочно пометить неполный индекс как complete.
Medium
backend/search/minjust_opensearch.py:211: оборванный или некорректный JSON при HTTP 200 не повторяется, хотя Bulk index идемпотентен.
Подтверждено исправленным
безопасный checkpoint для split-document batch;
атомарная запись и manifest fingerprint;
подробные partial Bulk errors;
retry для 429/5xx/timeout/reset;
production-предупреждение для 0 replicas;
11 тестов и Compose проходят.
Итог: not ready.
## Повторная независимая проверка после `8bf23b3`
**Статус: требуются дополнительные изменения.**
### High
1. `backend/search/minjust_opensearch.py:240,253`: checkpoint не привязан к URL/cluster/index UUID. После пересоздания индекса или запуска против другого кластера с тем же именем `--resume` может пропустить уже отмеченную часть корпуса.
2. `backend/search/minjust_opensearch.py:240`: checkpoint не фиксирует `--limit`. Resume с другим `--limit` может загрузить иной диапазон и ошибочно пометить неполный индекс как complete.
### Medium
- `backend/search/minjust_opensearch.py:211`: оборванный или некорректный JSON при HTTP 200 не повторяется, хотя Bulk `index` идемпотентен.
### Подтверждено исправленным
- безопасный checkpoint для split-document batch;
- атомарная запись и manifest fingerprint;
- подробные partial Bulk errors;
- retry для 429/5xx/timeout/reset;
- production-предупреждение для 0 replicas;
- 11 тестов и Compose проходят.
**Итог: not ready.**
backend/search/minjust_opensearch.py:93-105: start_at применяется до LIMIT. Прерванная загрузка --limit 100 с checkpoint на документе 50 при resume выберет 100 документов начиная с 50-го, выйдет за исходную первую сотню и пометит расширенный диапазон завершённым. Нужно сначала сформировать исходный ограниченный prefix, затем применять checkpoint внутри него.
Остальные прежние замечания исправлены: URL/cluster/index UUID, manifest и limit привязаны к checkpoint; invalid Bulk JSON повторяется; split-document resume и partial errors корректны; production warning добавлен.
Все 11 тестов, Compose и git diff --check проходят.
Итог: not ready.
## Третья независимая проверка после `daaa252`
**Статус: остался один High blocker.**
- `backend/search/minjust_opensearch.py:93-105`: `start_at` применяется до `LIMIT`. Прерванная загрузка `--limit 100` с checkpoint на документе 50 при resume выберет 100 документов начиная с 50-го, выйдет за исходную первую сотню и пометит расширенный диапазон завершённым. Нужно сначала сформировать исходный ограниченный prefix, затем применять checkpoint внутри него.
Остальные прежние замечания исправлены: URL/cluster/index UUID, manifest и limit привязаны к checkpoint; invalid Bulk JSON повторяется; split-document resume и partial errors корректны; production warning добавлен.
Все 11 тестов, Compose и `git diff --check` проходят.
**Итог: not ready.**
LIMIT сначала формирует исходный упорядоченный prefix, затем применяется inclusive checkpoint; resume не расширяет диапазон;
checkpoint привязан к URL, cluster UUID, index UUID, manifest SHA-256 и limit;
identity проверяется до resume;
split-document checkpoint безопасно повторяет последний документ;
retry/backoff покрывает 429/5xx/timeout/reset и некорректный Bulk JSON;
partial Bulk errors содержат ID и причины и не продвигают checkpoint;
production-предупреждение для 0 replicas присутствует;
все 11 backend-тестов проходят;
Compose валиден;
git diff --check чист.
В тестовом выводе остаются только ResourceWarning от mock HTTPError/sqlite cleanup; это не проблема product-кода.
Итог: PR готов к слиянию.
## Финальная независимая проверка `3a4450f`
**READY — блокеров и замечаний нет.**
Подтверждено:
- `LIMIT` сначала формирует исходный упорядоченный prefix, затем применяется inclusive checkpoint; resume не расширяет диапазон;
- checkpoint привязан к URL, cluster UUID, index UUID, manifest SHA-256 и `limit`;
- identity проверяется до resume;
- split-document checkpoint безопасно повторяет последний документ;
- retry/backoff покрывает 429/5xx/timeout/reset и некорректный Bulk JSON;
- partial Bulk errors содержат ID и причины и не продвигают checkpoint;
- production-предупреждение для 0 replicas присутствует;
- все 11 backend-тестов проходят;
- Compose валиден;
- `git diff --check` чист.
В тестовом выводе остаются только ResourceWarning от mock HTTPError/sqlite cleanup; это не проблема product-кода.
**Итог: PR готов к слиянию.**
admin
merged commit 38739543f4 into main2026-08-14 15:51:34 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что изменено
Проверка
PYTHONPATH=backend python3 -m unittest discover -s backend -p 'test_*.py' -v— 11 тестов успешно;docker compose -f deploy/local-opensearch/compose.yaml config— успешно;Независимая проверка PR
Статус: требуются изменения перед слиянием.
High
backend/search/minjust_opensearch.py:202-211не сохраняет checkpoint после успешного Bulk-пакета. Для--start-atнет надёжно зафиксированного значения: слишком поздний код пропустит данные, а гарантированно безопасен только повторный проход с начала.request_jsonне повторяет запросы при HTTP 429/5xx, timeout и обрыве соединения. На длительной загрузке временная сетевая ошибка полностью останавливает процесс.errors: trueвыводится только число ошибок без ID и причин. Bulk API может частично принять пакет, поэтому диагностика и безопасное продолжение затруднены.Medium
Проверено
docker compose configуспешно;analysis-icuустановлен;Повторная независимая проверка после
8bf23b3Статус: требуются дополнительные изменения.
High
backend/search/minjust_opensearch.py:240,253: checkpoint не привязан к URL/cluster/index UUID. После пересоздания индекса или запуска против другого кластера с тем же именем--resumeможет пропустить уже отмеченную часть корпуса.backend/search/minjust_opensearch.py:240: checkpoint не фиксирует--limit. Resume с другим--limitможет загрузить иной диапазон и ошибочно пометить неполный индекс как complete.Medium
backend/search/minjust_opensearch.py:211: оборванный или некорректный JSON при HTTP 200 не повторяется, хотя Bulkindexидемпотентен.Подтверждено исправленным
Итог: not ready.
Третья независимая проверка после
daaa252Статус: остался один High blocker.
backend/search/minjust_opensearch.py:93-105:start_atприменяется доLIMIT. Прерванная загрузка--limit 100с checkpoint на документе 50 при resume выберет 100 документов начиная с 50-го, выйдет за исходную первую сотню и пометит расширенный диапазон завершённым. Нужно сначала сформировать исходный ограниченный prefix, затем применять checkpoint внутри него.Остальные прежние замечания исправлены: URL/cluster/index UUID, manifest и limit привязаны к checkpoint; invalid Bulk JSON повторяется; split-document resume и partial errors корректны; production warning добавлен.
Все 11 тестов, Compose и
git diff --checkпроходят.Итог: not ready.
daaa252567to3a4450fcfeФинальная независимая проверка
3a4450fREADY — блокеров и замечаний нет.
Подтверждено:
LIMITсначала формирует исходный упорядоченный prefix, затем применяется inclusive checkpoint; resume не расширяет диапазон;limit;git diff --checkчист.В тестовом выводе остаются только ResourceWarning от mock HTTPError/sqlite cleanup; это не проблема product-кода.
Итог: PR готов к слиянию.