Bug: idempotent functions return None on replay when the stored response is falsy (0, False, "", [], {})
Maintainer antworten meist innerhalb von 1 Tag
Bewertung
Dieses Issue wurde noch nicht bewertet.
Beschreibung
Expected Behaviour
When an idempotent function returns a falsy value (0, False, "", [], {}), a retry with the same payload should return that same value from the persistence store.
Current Behaviour
The first call returns the value and it is stored correctly, but every replay returns None.
IdempotencyHandler._handle_for_status reads the stored response with:
serialized_response = self.output_serializer.from_dict(response_dict) if response_dict else None
so any falsy response_dict becomes None. #8090 pointed out this line together with the write path in _get_function_response. The write path was changed to is not None, but the read path still uses a truthiness check, so the value is saved and then dropped on replay.
Code snippet
from aws_lambda_powertools.utilities.idempotency import idempotent_function
from aws_lambda_powertools.utilities.idempotency.exceptions import (
IdempotencyItemAlreadyExistsError,
IdempotencyItemNotFoundError,
)
from aws_lambda_powertools.utilities.idempotency.persistence.base import BasePersistenceLayer, DataRecord
class InMemoryPersistenceLayer(BasePersistenceLayer):
def __init__(self):
super().__init__()
self.records = {}
def _get_record(self, idempotency_key) -> DataRecord:
if idempotency_key not in self.records:
raise IdempotencyItemNotFoundError
return self.records[idempotency_key]
def _put_record(self, data_record: DataRecord) -> None:
if data_record.idempotency_key in self.records:
raise IdempotencyItemAlreadyExistsError
self.records[data_record.idempotency_key] = data_record
def _update_record(self, data_record: DataRecord) -> None:
self.records[data_record.idempotency_key] = data_record
def _delete_record(self, data_record: DataRecord) -> None:
self.records.pop(data_record.idempotency_key, None)
persistence_layer = InMemoryPersistenceLayer()
@idempotent_function(data_keyword_argument="order", persistence_store=persistence_layer)
def count_items(order):
return len(order["items"])
order = {"order_id": "o-1", "items": []}
print(count_items(order=order)) # 0
print(count_items(order=order)) # None, expected 0
I see the same with CachePersistenceLayer on a real Redis server: 0, False, "", [] and {} all come back as None on replay, while None and truthy values are returned correctly.
Possible Solution
Use is not None, matching the write path:
serialized_response = self.output_serializer.from_dict(response_dict) if response_dict is not None else None
DataRecord.response_json_as_dict() already returns None when there is no stored data, and a function that returns None is stored as null, so that case keeps returning None.
Steps to Reproduce
Run the snippet above. Any persistence layer is affected, since the check is in the shared handler.
Powertools for AWS Lambda (Python) version
latest (3.37.0, also on develop)
AWS Lambda function runtime
3.13
Packaging format used
PyPi
Debugging logs
N/A, the replay returns None without an error
- Vorherrschende Sprache
- Python
- Sterne
- 3.3k
- Forks
- 511
- Ø Merge
- 3 T. 8 Std.
- Gemergte PRs (30 T.)
- 92
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus aws-powertools/powertools-lambda-python
-
Bug: POWERTOOLS_IDEMPOTENCY_DISABLED set to an empty or non-boolean value crashes every invocationEvtl. vergeben @lechakrawarthy hat das vor 1 Tag übernommen. Offenbug good first issue help wanted idempotency
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
aws-powertools/powertools-lambda-python#8728 · 4 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Bug: Redis layer fails the invocation instead of retrying when a record expires between SET NX and GETEvtl. vergeben @coughlmao hat das vor 1 Tag übernommen. Offenbug good first issue help wanted idempotency
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
aws-powertools/powertools-lambda-python#8727 · 4 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Bug: Redis orphan lock timeout ignores expires_after_seconds and is always 10 secondsEvtl. vergeben @CJstate hat das vor 1 Tag übernommen. Offenbug good first issue help wanted idempotency
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
aws-powertools/powertools-lambda-python#8726 · 3 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Bug: idempotency payloads with set, frozenset or bytes fields cannot be hashedEvtl. vergeben @Neeraj111010 hat das vor 1 Tag übernommen. Offenbug good first issue help wanted idempotency
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 80/100
aws-powertools/powertools-lambda-python#8725 · 4 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Bug: with a DynamoDB composite key, DataRecord.idempotency_key is the static partition key valueEvtl. vergeben @sumedh-aerram hat das vor 1 Tag übernommen. Offenbug good first issue help wanted idempotency
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 90/100
aws-powertools/powertools-lambda-python#8724 · 3 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in aws-powertools/powertools-lambda-python
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
pytest-dev/pyfakefs#1367 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
IFEvalG exclude_word_harder misses the keyword next to punctuation, at the start or end of the text, and in other letter caseEvtl. vergeben @damienen hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
allenai/open-instruct#2151 ·
Maintainer antworten meist innerhalb von 1 Tag
-
feat(plan): support convertorLabels and convertorAffinity in Plan resourceEvtl. vergeben @AmenB hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
RedHatQE/openshift-python-wrapper#2849 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Maintainer antworten meist innerhalb von 25 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
libnativeapi/nativeapi#21 ·