SQS: sendMessageToQueue лимиты+sync persist, Reset чистит FIFO, nil-map Duplicates, ApproximateReceiveCount без +1, billing.Close после Shutdown, запрет ':' в access_key, recover в PeriodicTasks
This commit is contained in:
+15
-5
@@ -658,18 +658,28 @@ func (h *Handler) sendMessageToQueue(w http.ResponseWriter, r *http.Request) {
|
||||
jsonErr(w, http.StatusBadRequest, "body is required")
|
||||
return
|
||||
}
|
||||
// Сообщение строится через общий билдер (UUID + MD5), + проверка размера —
|
||||
// как в SQS SendMessage.
|
||||
// Сообщение строится через общий билдер (UUID + MD5), + проверка размера и
|
||||
// лимита — как в SQS SendMessage (иначе UI обходил бы OOM-защиту).
|
||||
q.LockMu()
|
||||
if q.MaximumMessageSize > 0 && len(req.Body) > q.MaximumMessageSize {
|
||||
q.UnlockMu()
|
||||
jsonErr(w, http.StatusBadRequest, "message too big")
|
||||
return
|
||||
}
|
||||
if q.LiveCount() >= gosqs.MaxMessagesForQueue(q.IsFIFO) {
|
||||
q.UnlockMu()
|
||||
jsonErr(w, http.StatusTooManyRequests, "queue is full")
|
||||
return
|
||||
}
|
||||
msg := gosqs.BuildSqsMessage(req.Body)
|
||||
q.AppendMessage(msg)
|
||||
// Персистим одно сообщение отдельно
|
||||
persistence.SaveMessage(key, &msg)
|
||||
idx := q.AppendMessage(msg)
|
||||
// Персистим СИНХРОННО (как SendMessage) — иначе 201 без гарантии записи.
|
||||
if err := persistence.SaveMessageSync(key, &msg); err != nil {
|
||||
q.RemoveIndex(idx)
|
||||
q.UnlockMu()
|
||||
jsonErr(w, http.StatusInternalServerError, "failed to persist message")
|
||||
return
|
||||
}
|
||||
persistence.SaveQueue(key, q)
|
||||
q.UnlockMu()
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
Reference in New Issue
Block a user