Bug: Redis orphan lock timeout ignores expires_after_seconds and is always 10 seconds
Mantenedores costumam responder em até 1 dia
@CJstate já está trabalhando nisso.
Desde 1/11/2026.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 75/100
Direção de pesquisa
O bug está em aws_lambda_powertools/utilities/idempotency/persistence/redis.py: _orphan_lock_timeout é definido em CachePersistenceLayer.__init__ antes que expires_after_seconds seja configurado. Mova esse cálculo para _acquire_lock usando self.expires_after_seconds no momento da chamada, e adicione um teste com cliente falso afirmando que o ex passado para set corresponde à expiração configurada.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
[!WARNING]
For contributors, human or agent. Comment here to claim this issue and wait for the assignment before opening a PR; if two PRs show up, the assignee's stays. AI-assisted work is welcome, say so in the PR and tell us how you verified it: run the tests yourself and paste what you saw, do not describe runs you did not do. Read AGENTS.md first, it has the commands and the rules the CI enforces. This goes into 3.41.0.
Expected Behaviour
The Redis orphan lock lives at most as long as the record: _orphan_lock_timeout = min(10, expires_after_seconds) uses the configured expires_after_seconds.
Current Behaviour
The value is computed in CachePersistenceLayer.__init__, before configure() has set expires_after_seconds, so it always sees the default 3600 and the timeout is always 10. With expires_after_seconds=2 the lock outlives the record by 8 seconds, and a request in that window that finds an orphaned record fails with IdempotencyInconsistentStateError instead of taking over.
Code snippet
from aws_lambda_powertools.utilities.idempotency import IdempotencyConfig
from aws_lambda_powertools.utilities.idempotency.persistence.redis import CachePersistenceLayer
layer = CachePersistenceLayer(client=redis_client)
layer.configure(IdempotencyConfig(expires_after_seconds=2), "fn")
layer._orphan_lock_timeout # 10, expected 2
For a public-API test, use a short expires_after_seconds, let a record go orphan, and assert the next call runs instead of raising.
Possible Solution
Compute the timeout where it is used, in _acquire_lock in aws_lambda_powertools/utilities/idempotency/persistence/redis.py, from self.expires_after_seconds at call time. Add a test with a fake Redis client asserting the ex value passed to set follows the configured expiry.
Item 9 of the Idempotency audit in #8603. No AWS resources needed, the Redis tests use a fake client.
Powertools for AWS Lambda (Python) version
latest
AWS Lambda function runtime
3.13
Packaging format used
PyPi
Debugging logs
No response
- Linguagem predominante
- Python
- Estrelas
- 3.3k
- Forks
- 511
- Merge médio
- 3d 8h
- PRs com merge (30d)
- 92
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de aws-powertools/powertools-lambda-python
-
Bug: POWERTOOLS_IDEMPOTENCY_DISABLED set to an empty or non-boolean value crashes every invocationTalvez já em andamento @lechakrawarthy assumiu hoje. Abertabug good first issue help wanted idempotency
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
aws-powertools/powertools-lambda-python#8728 · 4 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Bug: Redis layer fails the invocation instead of retrying when a record expires between SET NX and GETTalvez já em andamento @coughlmao assumiu hoje. Abertabug good first issue help wanted idempotency
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
aws-powertools/powertools-lambda-python#8727 · 4 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Bug: idempotency payloads with set, frozenset or bytes fields cannot be hashedTalvez já em andamento @Neeraj111010 assumiu hoje. Abertabug good first issue help wanted idempotency
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 80/100
aws-powertools/powertools-lambda-python#8725 · 4 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Bug: with a DynamoDB composite key, DataRecord.idempotency_key is the static partition key valueTalvez já em andamento @sumedh-aerram assumiu hoje. Abertabug good first issue help wanted idempotency
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 90/100
aws-powertools/powertools-lambda-python#8724 · 3 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Bug: output_serializer=PydanticSerializer crashes at import under from __future__ import annotationsTalvez já em andamento @sumedh-aerram assumiu hoje. Abertabug good first issue help wanted idempotency
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 80/100
aws-powertools/powertools-lambda-python#8722 · 6 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
Todas as issues de aws-powertools/powertools-lambda-python
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
sususweet/midea_auto_cloud#285 ·
Mantenedores costumam responder em até 1 dia
-
Short positive Table maxlen values produce oversized cellsTalvez já em andamento @Gambit-Checkmate assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 18 dias
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 68/100
MangasMango/bound-to-rot#41 · 1 comentário ·
-
breaking change
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
Word viper missingAberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 68/100
dwyl/english-words#244 ·