-
Notifications
You must be signed in to change notification settings - Fork 357
Manage snapshots thread safety issue 2409 #2431
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
base: main
Are you sure you want to change the base?
Manage snapshots thread safety issue 2409 #2431
Conversation
…tests for concurrent operations
…larity and type safety
It looks like there's other cases of this throughout the codebase, such as |
Yeah, @kevinjqliu started an issue to track this work here:
|
_updates: Tuple[TableUpdate, ...] = () | ||
_requirements: Tuple[TableRequirement, ...] = () |
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.
(Same nit as #2430 (comment))
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.
@smaheshwar-pltr i applied the changes, take a look 👍
Related to #2409, and partially closes #2427
Rationale for this change
This PR fixes a thread safety issue in the
ManageSnapshots
class similar to the one identified inExpireSnapshots
(#2409). While the original issue specifically mentionedExpireSnapshots
, the same thread safety vulnerability exists inManageSnapshots
due to identical problematic design patterns. The same testing methodology used in #2430 was adapted for this.Root Cause:
The
ManageSnapshots
class had class-level attributes (_updates
,_requirements
) that were shared across all instances. When multiple threads created differentManageSnapshots
instances for concurrent operations, they all shared the same underlying tuple objects for tracking updates and requirements.Potential Impact:
table1.manage_snapshots().create_tag(...)
adds updates to shared tupletable2.manage_snapshots().create_branch(...)
adds updates to same shared tupleSolution:
Applied the same fix as ExpireSnapshots - moved the shared class-level attributes to instance-level attributes in the
__init__
method, ensuring eachManageSnapshots
instance has its own isolated state.Relationship to #2409:
While #2409 specifically reported ExpireSnapshots thread safety issues, this PR proactively addresses the same vulnerability pattern in ManageSnapshots to prevent similar issues from occurring with snapshot management operations (tags, branches, etc.).
Are these changes tested?
Yes, comprehensive test coverage has been added with a dedicated test file
test_manage_snapshots_thread_safety.py
:test_manage_snapshots_thread_safety_fix()
- Verifies that different ManageSnapshots instances have separate update/requirement tuplestest_manage_snapshots_concurrent_operations()
- Tests concurrent operations don't contaminate each othertest_manage_snapshots_concurrent_different_tables()
- Tests concurrent operations on different tables work correctlytest_manage_snapshots_cross_table_isolation()
- Validates no cross-contamination of operations between tablestest_manage_snapshots_concurrent_same_table_different_operations()
- Tests concurrent operations on the same tableAll tests demonstrate that the thread safety fix works correctly and that concurrent ManageSnapshots operations maintain proper isolation.
Are there any user-facing changes?
No breaking changes. The public API remains identical:
ManageSnapshots
methods work the same way (create_tag
,create_branch
,delete_tag
, etc.)Behavioral improvement:
manage_snapshots()
operations on different tables now work correctly without interferenceThis is a pure bug fix.