66 lines
2.6 KiB
Markdown
66 lines
2.6 KiB
Markdown
# Dev Report: Pagination Fix — commit per page + дедупликация
|
||
|
||
**Дата:** 2026-04-22
|
||
**Статус:** DONE ✅
|
||
**ТЗ:** TZ-fr24-worker-pagination-fix.md
|
||
**Исполнитель:** subagent dev-pagination-fix
|
||
|
||
---
|
||
|
||
## Итог
|
||
|
||
Все изменения реализованы строго по ТЗ. Синтаксис проверен — ошибок нет.
|
||
|
||
---
|
||
|
||
## Изменения
|
||
|
||
### `config.py`
|
||
- Добавлено поле `MAX_PAGES: int = int(os.getenv("FR24_MAX_PAGES", "200"))`
|
||
Защитный лимит: 200 страниц × 20 = 4000 рейсов максимум.
|
||
|
||
### `fr24_worker.py`
|
||
1. **Удалена** функция `fetch_flight_summaries()` — накапливала все страницы в памяти, при ошибке всё терялось.
|
||
|
||
2. **Добавлен** генератор `iter_flight_summary_pages(target_date: date) -> Iterator[List[Dict]]`:
|
||
- Возвращает страницы по одной (yield)
|
||
- Дедупликация по `fr24_id` через `seen_fr24_ids: set` — убирает ×4 дубли от `both:SVO,both:DME,both:VKO,both:ZIA`
|
||
- Ловит исключения на каждой странице (break с логом, не падает весь процесс)
|
||
- Защитный лимит `config.MAX_PAGES` с предупреждением в лог
|
||
- Debug-лог: page, offset, got, unique, total_seen
|
||
|
||
3. **Переписан** блок в `run()`:
|
||
- Убран блок `try: summaries = fetch_flight_summaries(...)`
|
||
- Итерация через `for page in iter_flight_summary_pages(target_date):`
|
||
- `stats["flights_found"] += len(page)` — инкрементальный счётчик
|
||
- После обработки каждой страницы — `conn.commit()` с логом
|
||
- При ошибке commit — `conn.rollback()` + `stats["errors"] += 1`
|
||
- Индивидуальные `conn.commit()` per-flight убраны (остался только per-page)
|
||
|
||
---
|
||
|
||
## Проверка синтаксиса
|
||
|
||
```
|
||
$ python3 -m py_compile config.py && echo OK
|
||
config.py OK
|
||
|
||
$ python3 -m py_compile fr24_worker.py && echo OK
|
||
fr24_worker.py OK
|
||
```
|
||
|
||
---
|
||
|
||
## Следующий шаг (деплой)
|
||
|
||
```bash
|
||
docker cp ingest/tracks_fr24/fr24_worker.py fr24-ingest:/app/ingest/tracks_fr24/fr24_worker.py
|
||
docker cp ingest/tracks_fr24/config.py fr24-ingest:/app/ingest/tracks_fr24/config.py
|
||
```
|
||
|
||
Проверка:
|
||
```
|
||
POST http://fr24-vm:8001/run?date=2026-04-19
|
||
```
|
||
Должны появляться строки в `flight_actual` постепенно, не ждать конца всей загрузки.
|