v0.1.35: устранены гонки map (ChangeVisibility/DeleteBatch) и nil-deref под Lock + OverLimit
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user