-
Notifications
You must be signed in to change notification settings - Fork 2
Enable TTL on DynamoDB table creation #170
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling and handle transient TTL states.
The check-before-update approach addresses the previous concern about broad exception handling. However, the current implementation has several issues:
Missing error handling: The
update_time_to_livecall has no error handling. If this fails (due to permissions, rate limiting, transient errors, or concurrent updates), the exception will propagate and break the setup process.Unhandled transient states: DynamoDB TTL can be in
ENABLINGorDISABLINGstates during transitions. The code only checks forDISABLED, so:ENABLING, the code skips the update (good) but doesn't verify it completesDISABLING, the code skips the update, leaving TTL in an incomplete statettl_statusisNone(malformed response), the check silently failsRace condition: Between checking the status and calling update, another process could start enabling TTL, causing a
ValidationExceptionfrom the update call.Apply this diff to add proper error handling and state management:
# Enable TTL on the table if not already enabled ttl_response = await self._connected_client.describe_time_to_live( # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType] TableName=self._table_name ) ttl_status = ttl_response.get("TimeToLiveDescription", {}).get("TimeToLiveStatus") # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType] - # Only enable TTL if it's currently disabled - if ttl_status == "DISABLED": - await self._connected_client.update_time_to_live( # pyright: ignore[reportUnknownMemberType] - TableName=self._table_name, - TimeToLiveSpecification={ - "Enabled": True, - "AttributeName": "ttl", - }, - ) + # Only enable TTL if it's currently disabled or unknown + if ttl_status in ("DISABLED", None): + try: + await self._connected_client.update_time_to_live( # pyright: ignore[reportUnknownMemberType] + TableName=self._table_name, + TimeToLiveSpecification={ + "Enabled": True, + "AttributeName": "ttl", + }, + ) + except self._connected_client.exceptions.ClientError as e: # pyright: ignore[reportUnknownMemberType] + error_code = e.response["Error"]["Code"] # pyright: ignore[reportUnknownMemberType] + # Suppress only if TTL is already enabled/enabling; re-raise other errors + if error_code == "ValidationException": + error_message = e.response["Error"]["Message"] # pyright: ignore[reportUnknownMemberType] + if "already enabled" not in error_message.lower() and "already being" not in error_message.lower(): # pyright: ignore[reportUnknownArgumentType] + raise + else: + raise + # If status is ENABLING, TTL will be enabled soon; if ENABLED, nothing to doNote: This reintroduces exception handling but only suppresses the specific "already enabled" case, addressing the concern from the previous review while maintaining robustness.
📝 Committable suggestion
🤖 Prompt for AI Agents