8000 Limit batch size in delete and change visibility (#8479) · codeperl/localstack@f3a06d8 · GitHub
[go: up one dir, main page]

Skip to content

Commit f3a06d8

Browse files
authored
Limit batch size in delete and change visibility (localstack#8479)
1 parent 909ac86 commit f3a06d8

File tree

3 files changed

+140
-5
lines changed

3 files changed

+140
-5
lines changed

localstack/services/sqs/provider.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -848,11 +848,6 @@ def send_message_batch(
848848
) -> SendMessageBatchResult:
849849
queue = self._resolve_queue(context, queue_url=queue_url)
850850

851-
if entries and (no_entries := len(entries)) > 10:
852-
raise TooManyEntriesInBatchRequest(
853-
f"Maximum number of entries per request are 10. You have sent {no_entries}."
854-
)
855-
856851
self._assert_batch(entries)
857852
# check the total batch size first and raise BatchRequestTooLong id > DEFAULT_MAXIMUM_MESSAGE_SIZE.
858853
# This is checked before any messages in the batch are sent. Raising the exception here should
@@ -1194,6 +1189,10 @@ def _validate_actions(self, actions: ActionNameList):
11941189
def _assert_batch(self, batch: List) -> None:
11951190
if not batch:
11961191
raise EmptyBatchRequest
1192+
if batch and (no_entries := len(batch)) > MAX_NUMBER_OF_MESSAGES:
1193+
raise TooManyEntriesInBatchRequest(
1194+
f"Maximum number of entries per request are {MAX_NUMBER_OF_MESSAGES}. You have sent {no_entries}."
1195+
)
11971196
visited = set()
11981197
for entry in batch:
11991198
entry_id = entry["Id"]

tests/integration/test_sqs.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,6 +1951,110 @@ def test_delete_message_batch_invalid_msg_id(
19511951
aws_client.sqs.delete_message_batch(QueueUrl=queue_url, Entries=delete_entries)
19521952
snapshot.match("error_response", e.value.response)
19531953

1954+
@pytest.mark.aws_validated
1955+
def test_delete_message_batch_with_too_large_batch(
1956+
self, sqs_create_queue, snapshot, aws_client
1957+
):
1958+
self._add_error_detail_transformer(snapshot)
1959+
1960+
queue_name = f"queue-{short_uid()}"
1961+
queue_url = sqs_create_queue(QueueName=queue_name)
1962+
1963+
message_batch = [
1964+
{
1965+
"Id": f"message-{i}",
1966+
"MessageBody": f"messageBody-{i}",
1967+
}
1968+
for i in range(MAX_NUMBER_OF_MESSAGES)
1969+
]
1970+
1971+
result_send_batch = aws_client.sqs.send_message_batch(
1972+
QueueUrl=queue_url, Entries=message_batch
1973+
)
1974+
successful = result_send_batch["Successful"]
1975+
assert len(successful) == len(message_batch)
1976+
1977+
result_send_batch = aws_client.sqs.send_message_batch(
1978+
QueueUrl=queue_url, Entries=message_batch
1979+
)
1980+
successful = result_send_batch["Successful"]
1981+
assert len(successful) == len(message_batch)
1982+
1983+
result_recv = []
1984+
target_size = 2 * MAX_NUMBER_OF_MESSAGES
1985+
1986+
def _receive_all_messages():
1987+
result_recv.extend(
1988+
aws_client.sqs.receive_message(
1989+
QueueUrl=queue_url,
1990+
MaxNumberOfMessages=min(MAX_NUMBER_OF_MESSAGES, target_size - len(result_recv)),
1991+
)["Messages"]
1992+
)
1993+
assert len(result_recv) == target_size
1994+
1995+
retry(_receive_all_messages, retries=7, sleep=0.5)
1996+
1997+
delete_entries = [
1998+
{"Id": str(i), "ReceiptHandle": msg["ReceiptHandle"]}
1999+
for i, msg in enumerate(result_recv)
2000+
]
2001+
with pytest.raises(ClientError) as e:
2002+
aws_client.sqs.delete_message_batch(QueueUrl=queue_url, Entries=delete_entries)
2003+
snapshot.match("error_response", e.value.response)
2004+
2005+
@pytest.mark.aws_validated
2006+
def test_change_message_visibility_batch_with_too_large_batch(
2007+
self, sqs_create_queue, snapshot, aws_client
2008+
):
2009+
self._add_error_detail_transformer(snapshot)
2010+
2011+
queue_name = f"queue-{short_uid()}"
2012+
queue_url = sqs_create_queue(QueueName=queue_name)
2013+
2014+
message_batch = [
2015+
{
2016+
"Id": f"message-{i}",
2017+
"MessageBody": f"messageBody-{i}",
2018+
}
2019+
for i in range(MAX_NUMBER_OF_MESSAGES)
2020+
]
2021+
2022+
result_send_batch = aws_client.sqs.send_message_batch(
2023+
QueueUrl=queue_url, Entries=message_batch
2024+
)
2025+
successful = result_send_batch["Successful"]
2026+
assert len(successful) == len(message_batch)
2027+
2028+
result_send_batch = aws_client.sqs.send_message_batch(
2029+
QueueUrl=queue_url, Entries=message_batch
2030+
)
2031+
successful = result_send_batch["Successful"]
2032+
assert len(successful) == len(message_batch)
2033+
2034+
result_recv = []
2035+
target_size = 2 * MAX_NUMBER_OF_MESSAGES
2036+
2037+
def _receive_all_messages():
2038+
result_recv.extend(
2039+
aws_client.sqs.receive_message(
2040+
QueueUrl=queue_url,
2041+
MaxNumberOfMessages=min(MAX_NUMBER_OF_MESSAGES, target_size - len(result_recv)),
2042+
)["Messages"]
2043+
)
2044+
assert len(result_recv) == target_size
2045+
2046+
retry(_receive_all_messages, retries=7, sleep=0.5)
2047+
2048+
change_visibility_entries = [
2049+
{"Id": str(i), "ReceiptHandle": msg["ReceiptHandle"], "VisibilityTimeout": 123}
2050+
for i, msg in enumerate(result_recv)
2051+
]
2052+
with pytest.raises(ClientError) as e:
2053+
aws_client.sqs.change_message_visibility_batch(
2054+
QueueUrl=queue_url, Entries=change_visibility_entries
2055+
)
2056+
snapshot.match("error_response", e.value.response)
2057+
19542058
@pytest.mark.aws_validated
19552059
def test_create_and_send_to_fifo_queue(self, sqs_create_queue, aws_client):
19562060
# Old name: test_create_fifo_queue

tests/integration/test_sqs.snapshot.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,5 +1012,37 @@
10121012
}
10131013
}
10141014
}
1015+
},
1016+
"tests/integration/test_sqs.py::TestSqsProvider::test_delete_message_batch_with_too_large_batch": {
1017+
"recorded-date": "24-06-2023, 17:14:03",
1018+
"recorded-content": {
1019+
"error_response": {
1020+
"Error": {
1021+
"Code": "AWS.SimpleQueueService.TooManyEntriesInBatchRequest",
1022+
"Message": "Maximum number of entries per request are 10. You have sent 20.",
1023+
"Type": "Sender"
1024+
},
1025+
"ResponseMetadata": {
1026+
"HTTPHeaders": {},
1027+
"HTTPStatusCode": 400
1028+
}
1029+
}
1030+
}
1031+
},
1032+
"tests/integration/test_sqs.py::TestSqsProvider::test_change_message_visibility_batch_with_too_large_batch": {
1033+
"recorded-date": "24-06-2023, 17:14:36",
1034+
"recorded-content": {
1035+
"error_response": {
1036+
"Error": {
1037+
"Code": "AWS.SimpleQueueService.TooManyEntriesInBatchRequest",
1038+
"Message": "Maximum number of entries per request are 10. You have sent 20.",
1039+
"Type": "Sender"
1040+
},
1041+
"ResponseMetadata": {
1042+
"HTTPHeaders": {},
1043+
"HTTPStatusCode": 400
1044+
}
1045+
}
1046+
}
10151047
}
10161048
}

0 commit comments

Comments
 (0)
0