23 lines
2.0 KiB
Markdown
23 lines
2.0 KiB
Markdown
# Автоназначение адреса с учётом вложенных префиксов (изменение 020)
|
||||
|
|
|
|||
|
|
Находка ревью № 10 (и часть № 11 — блокировка), серьёзность — низкая. Зависит от № 011.
|
|||
|
|
|
|||
|
|
## Context
|
|||
|
|
`next_free` (`app/services.py`) исключает только адреса самого пула: если внутри пула есть дочерний префикс, выданный адрес может попасть в его диапазон.
|
|||
|
|
Функция перебирает хосты подряд и загружает все занятые адреса в множество. `allocate_next` не блокирует префикс: при параллельных запросах один получает 409 «повторите».
|
|||
|
|
|
|||
|
|
## Решение
|
|||
|
|
1. `next_free_address(net, occupied)` — по образцу `next_free_subnet` (перескок за занятые диапазоны, без перебора): занятыми считаются адреса пула,
|
|||
|
|
диапазоны дочерних префиксов того же VRF и (для IPv4 ≤ /30) адрес сети и broadcast.
|
|||
|
|
2. `allocate_next`: `SELECT … FOR UPDATE` строки префикса (как в `allocate_subnet`) — параллельные запросы сериализуются и получают разные адреса.
|
|||
|
|
3. Старую `next_free` удалить.
|
|||
|
|
|
|||
|
|
## Файлы
|
|||
|
|
`app/services.py`, `app/api/v1/prefixes.py`, `tests/test_api.py`, `README.md` (автоназначение).
|
|||
|
|
|
|||
|
|
## Тест
|
|||
|
|
Пул `/24` с дочерним `/30` (`.0–.3`) и занятым `.5`: `POST …/addresses/next` → `.4`; ещё раз → `.6`.
|
|||
|
|
Параллельно 5 запросов (потоки) → 5 разных адресов, все 201.
|
|||
|
|
|
|||
|
|
## Проверка
|
|||
|
|
`pytest -q`; UI не меняется (кнопка автоназначения отсутствует в UI — проверка через Swagger).
|