diff --git a/HISTORY/2026-08-14-session-log.md b/HISTORY/2026-08-14-session-log.md index 76405ad..b6d5174 100644 --- a/HISTORY/2026-08-14-session-log.md +++ b/HISTORY/2026-08-14-session-log.md @@ -429,3 +429,39 @@ HTTP 400/404 без AWS-XML (SDK получает Code=None) или молча сообщения, принятые одним подом, невидимы другому. - receive_message.go: skip сообщений с ReceiptHandle != "" и не готовых; long poll 100ms тик. - ReadTimeout 60× и max latency 54с — подозрение на платформенный ingress (аналог /ui 152с). + +--- + +## Q&A с Claude Sonnet — разбор дефектов по итогам нагрузочного теста (14.08.2026) + +**Ответ Sonnet (по файлам из промпта)**: +Q1 Потери сообщений: TOCTOU в long-poll (receive_message.go:82-99) — два потока видят сообщение, +один забирает, второй возвращает пусто; включается при WaitTimeSeconds>0 (клиент или атрибут очереди). +Вторично для FIFO: LockGroup (models.go:82-89) пересоздаёт FIFOMessages map целиком — теряются локи групп. +Q2 Receive >10с: (а) атрибут очереди ReceiveMessageWaitTimeSeconds без гарда (receive_message.go:62-66); +(б) SaveMessage/SaveQueue внутри глобального Lock (send_message.go:97-103) — медленный Redis блокирует всех; +(в) PeriodicTasks держит Lock на весь обход всех очередей (gosqs.go:18-58). +Q3 Сырые 400/404: actionHandler пишет "Bad Request" текстом (router.go:199-201); +encodeResponse для JSON-протокола не пишет тело при GetResult()==nil (router.go:110-113). +Q4 Валидации: VisibilityTimeout clamp→bounds-check (queue_attributes/set_queue_attributes.go:29); +whitelist имён атрибутов (IgnoreUnknownKeys в utils.go:29 пропускает всё); MaxNumberOfMessages clamp→ошибка +(receive_message.go:41); PurgeQueue повторный<60с→PurgeQueueInProgress (LastPurgeTime в Queue); +FIFO без MessageGroupId→MissingParameter (send_message.go:46-49); actionHandler→AWS-XML GeneralError. +Q5 Сервис сам может держать запрос >25с: Redis-записи под Lock + PeriodicTasks с полным обходом. +Q6 Дополнительно: SetQueueAttributes обнуляет не переданные атрибуты (zero-value >= 0); +unprotected map read (receive_message.go:51) — data race; NumberOfReceives не инкрементируется; +DeleteQueue всегда успешен; NextSequenceNumber пересоздаёт map (models.go:62-70). + +**ПЛАН v0.1.35 (принят)**: +1. TOCTOU: выборка сообщений — единая критическая секция под Lock. +2. Redis-сетевые вызовы — вне глобального Lock (снапшот под локом, запись после). +3. PeriodicTasks: сузить критическую секцию. +4. RLock для Queues[key] в receive_message.go:51. +5. SetQueueAttributes: применять только явно переданные атрибуты. +6. LockGroup/NextSequenceNumber: не пересоздавать map (вставлять ключ). +7. actionHandler: AWS-XML GeneralError вместо текста. +8. encodeResponse (JSON): тело ошибки при GetResult()==nil; проверить CreateErrorResponseV1. +9. Валидации: VisibilityTimeout bounds; whitelist атрибутов; MaxNumberOfMessages 1–10 ошибка; + PurgeQueueInProgress (LastPurgeTime); FIFO MissingParameter; SendMessage пустое тело/размер — AWS-коды. +10. NumberOfReceives инкремент при выдаче. +После: 25-цикловая проверка целостности, smoke, повторный 30-мин нагрузочный тест.