Добавить локальный OpenSearch и возобновляемую загрузку #10

Merged
admin merged 1 commits from feature/local-opensearch-lab into main 2026-08-14 15:51:34 +00:00
Owner

Что изменено

  • добавлен локальный одноузловой OpenSearch 3.7.0 с analysis-icu и хранением данных на диске проекта;
  • добавлена прямая загрузка ограниченными Bulk-пакетами без промежуточного полного NDJSON;
  • добавлено безопасное возобновление существующего индекса с выбранного документа;
  • ошибки чтения JSON повторяются при временном сбое и содержат точный путь;
  • backend обновлён до v0.4.1, документация и mapping синхронизированы.

Проверка

  • PYTHONPATH=backend python3 -m unittest discover -s backend -p 'test_*.py' -v — 11 тестов успешно;
  • docker compose -f deploy/local-opensearch/compose.yaml config — успешно;
  • полный локальный индекс: 56 295 965 фрагментов, состояние green;
  • RU/KY smoke-поиск: 20/22 мс.
## Что изменено - добавлен локальный одноузловой OpenSearch 3.7.0 с analysis-icu и хранением данных на диске проекта; - добавлена прямая загрузка ограниченными Bulk-пакетами без промежуточного полного NDJSON; - добавлено безопасное возобновление существующего индекса с выбранного документа; - ошибки чтения JSON повторяются при временном сбое и содержат точный путь; - backend обновлён до v0.4.1, документация и mapping синхронизированы. ## Проверка - `PYTHONPATH=backend python3 -m unittest discover -s backend -p 'test_*.py' -v` — 11 тестов успешно; - `docker compose -f deploy/local-opensearch/compose.yaml config` — успешно; - полный локальный индекс: 56 295 965 фрагментов, состояние green; - RU/KY smoke-поиск: 20/22 мс.
Author
Owner

Независимая проверка 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.
## Независимая проверка 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.
Author
Owner

Повторная независимая проверка после 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.

## Повторная независимая проверка после `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.**
Author
Owner

Третья независимая проверка после 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.

## Третья независимая проверка после `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.**
agent added 1 commit 2026-08-14 15:38:39 +00:00
agent force-pushed feature/local-opensearch-lab from daaa252567 to 3a4450fcfe 2026-08-14 15:38:39 +00:00 Compare
Author
Owner

Финальная независимая проверка 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 готов к слиянию.

## Финальная независимая проверка `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 main 2026-08-14 15:51:34 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: agent/akyldash#10