HISTORY: Q&A Sonnet по дефектам + план v0.1.35
This commit is contained in:
@@ -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-мин нагрузочный тест.
|
||||
|
||||
Reference in New Issue
Block a user