v0.1.35: устранены гонки map (ChangeVisibility/DeleteBatch) и nil-deref под Lock + OverLimit

This commit is contained in:
“Naeel”
2026-08-14 18:48:35 +04:00
parent 9cde807dda
commit c4da02c814
8 changed files with 74 additions and 44 deletions
+7 -10
View File
@@ -83,23 +83,20 @@ func ReceiveMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody)
key := tenantQueueKey(t.AccessKey, queueName)
// Проверка существования очереди — под RLock (защита от параллельной записи
// в map; раньше map читалась без блокировки — гонка данных).
// ОДИН RLock на проверку существования И чтение атрибута очереди:
// раньше было два отдельных RLock — между ними очередь могла быть удалена
// (nil-deref при чтении ReceiveMessageWaitTimeSeconds).
models.SyncQueues.RLock()
_, queueExists := models.SyncQueues.Queues[key]
models.SyncQueues.RUnlock()
queue, queueExists := models.SyncQueues.Queues[key]
if !queueExists {
models.SyncQueues.RUnlock()
return utils.CreateErrorResponseV1("QueueNotFound", true)
}
// --- Шаг 5: WaitTimeSeconds (long polling) ---
// 0 (не задан) → атрибут очереди ReceiveMessageWaitTimeSeconds (default 0).
waitTimeSeconds := requestBody.WaitTimeSeconds
if waitTimeSeconds == 0 {
models.SyncQueues.RLock()
waitTimeSeconds = models.SyncQueues.Queues[key].ReceiveMessageWaitTimeSeconds
models.SyncQueues.RUnlock()
waitTimeSeconds = queue.ReceiveMessageWaitTimeSeconds
}
models.SyncQueues.RUnlock()
if waitTimeSeconds < 0 || waitTimeSeconds > MaxReceiveMessageWaitTimeSeconds {
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
}