refactor(P1.2-revue): Compact — один RebuildIndexes + ensureIndexes; журнал ревью-фиксов
Пункт 4 ревью: убран дублирующий блок перестройки индексов в Compact (ensureIndexes на входе + один RebuildIndexes на выходе). Поведение то же, логика чище. Дополнен HISTORY разделом о фиксах код-ревью.
This commit is contained in:
@@ -109,3 +109,25 @@ Redis-схема не меняется (сообщения и так лежат
|
||||
весь блок, включая порядок `defer` — старый код содержал латентную утечку лока,
|
||||
которую новый критерий сделал массовой.
|
||||
4. Не запускать сервис с `| head` — SIGPIPE убивает процесс на середине теста.
|
||||
|
||||
## 7. Код-ревью (роль ПРО) и фиксы — коммит `48c38c4`
|
||||
|
||||
Проведён архитектурный разбор всех затронутых файлов. Найдено и исправлено:
|
||||
|
||||
1. **🔥 Батч-видимость не заводила в DLQ** (`change_message_visibility_batch.go`).
|
||||
При `VisibilityTimeout=0` батч лишь инкрементировал `Retry` и НЕ переносил
|
||||
сообщение в DLQ — логика была только в одиночной версии, счётчик и перенос
|
||||
расходились. Вынесен единый метод `models.Queue.ResetVisibilityAndTryDLQ`
|
||||
(сброс видимости + DLQ-перенос), обе версии приведены к одному пути.
|
||||
Тест `TestChangeVisibilityBatch_MovesToDLQ` (падает на старой логике, зелёный на новой).
|
||||
2. **TOCTOU лимит в `SendMessageBatch`**: проверка OOM-лимита была только по
|
||||
устаревшему снимку (RLock → Lock). Добавлена повторная проверка под per-queue Lock.
|
||||
3. Инварианты `InFlightIndexes` (снимок может содержать устаревшие индексы —
|
||||
потребитель обязан перепроверять) и `ensureIndexes` (проверяет согласованность
|
||||
чисел, а не валидность map-индексов → `Messages` нельзя мутировать вне методов)
|
||||
зафиксированы в док-комментариях.
|
||||
4. `Compact` упрощён: один `RebuildIndexes` на выходе + `ensureIndexes` на входе
|
||||
(убран дублирующий блок), `deadCount` пересчитывается внутри.
|
||||
|
||||
Осталось осознанно не тронуто: `DeleteMessageBatch` итерация с `RemoveIndex` внутри
|
||||
безопасна (tombstone не меняет длину) — покрыто тестами.
|
||||
|
||||
Reference in New Issue
Block a user