Fix: FIFO DLQ locks message group id (#3537)

* fix https://github.com/localstack/localstack/issues/3319

* fix review comments
This commit is contained in:
irahulranjan 2020-12-14 14:49:22 +05:30 committed by GitHub
parent 7b97141184
commit 54bd336457
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 2 deletions

View File

@ -818,8 +818,6 @@ class SQSBackend(BaseBackend):
# A previous call is still processing messages in this group, so we cannot deliver this one.
continue
queue.pending_messages.add(message)
if (
queue.dead_letter_queue is not None
and message.approximate_receive_count
@ -828,6 +826,7 @@ class SQSBackend(BaseBackend):
messages_to_dlq.append(message)
continue
queue.pending_messages.add(message)
message.mark_received(visibility_timeout=visibility_timeout)
_filter_message_attributes(message, message_attribute_names)
result.append(message)

View File

@ -2384,3 +2384,42 @@ def test_fifo_queue_send_deduplicationid_same_as_sha256_of_old_message():
)
messages = msg_queue.receive_messages(MaxNumberOfMessages=2)
messages.should.have.length_of(1)
@mock_sqs
def test_fifo_send_message_when_same_group_id_is_in_dlq():
sqs = boto3.resource("sqs", region_name="us-east-1")
dlq = sqs.create_queue(
QueueName="test-queue-dlq.fifo", Attributes={"FifoQueue": "true"}
)
queue = sqs.get_queue_by_name(QueueName="test-queue-dlq.fifo")
dead_letter_queue_arn = queue.attributes.get("QueueArn")
msg_queue = sqs.create_queue(
QueueName="test-queue.fifo",
Attributes={
"FifoQueue": "true",
"RedrivePolicy": json.dumps(
{"deadLetterTargetArn": dead_letter_queue_arn, "maxReceiveCount": 1},
),
"VisibilityTimeout": "1",
},
)
msg_queue.send_message(MessageBody="first", MessageGroupId="1")
messages = msg_queue.receive_messages()
messages.should.have.length_of(1)
time.sleep(1.1)
messages = msg_queue.receive_messages()
messages.should.have.length_of(0)
messages = dlq.receive_messages()
messages.should.have.length_of(1)
msg_queue.send_message(MessageBody="second", MessageGroupId="1")
messages = msg_queue.receive_messages()
messages.should.have.length_of(1)