diff --git a/app/gosqs/receive_message.go b/app/gosqs/receive_message.go index 24afa58..fe7974f 100644 --- a/app/gosqs/receive_message.go +++ b/app/gosqs/receive_message.go @@ -154,10 +154,16 @@ func ReceiveMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody) // - для FIFO-очереди блокируется группа (LockGroup) до DeleteMessage/таймаута. func receiveMessagesUnderLock(key string, visibilityTimeout, maxNumberOfMessages int) ([]*models.ResultMessage, bool) { queue := models.SyncQueues.GetLocked(key) - if queue == nil || queue.LiveCount() == 0 { + if queue == nil { return nil, false } + // ВАЖНО: defer — ДО любых return ниже. Иначе возврат на пустой очереди + // оставлял бы per-queue блокировку захваченной навсегда (очередь «зависала»: + // все последующие Lock/RLock ждали бы вечно). defer queue.UnlockMu() + if queue.LiveCount() == 0 { + return nil, false + } // Быстрая предпроверка: есть ли вообще хотя бы одно готовое сообщение. if !queueHasReceivableMessages(queue) { return nil, false