Skip to content
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

Fix atomic transaction not routing to the the correct DB #324

Merged
merged 4 commits into from Jun 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion django_celery_results/managers.py
Expand Up @@ -87,7 +87,7 @@ def get_all_expired(self, expires):

def delete_expired(self, expires):
"""Delete all expired results."""
with transaction.atomic():
with transaction.atomic(using=self.db):
raw_delete(queryset=self.get_all_expired(expires))


Expand Down
29 changes: 29 additions & 0 deletions t/unit/test_models.py
Expand Up @@ -209,3 +209,32 @@ class TransactionError(Exception):
raise TransactionError()
except TransactionError:
pass


@pytest.mark.usefixtures('depends_on_current_app')
class test_ModelsWithoutDefaultDB(TransactionTestCase):
"""
This class to ensure all operations are done on the
same db we use and dont leak accidentally into another
db. we dont include the default db in databases as by
default an incorrect behavior would route there and
would not be detectable.

The tests will fail with the below error incase we
try to interact from a db other than the one we have
specified.

`AssertionError: Database connections to 'default' are
not allowed in this test`
"""

non_default_test_db = 'secondary'
databases = [non_default_test_db]

def test_operations_with_atomic_transactions(self):
TaskResult.objects.db_manager(
self.non_default_test_db
).delete_expired(expires=10)
GroupResult.objects.db_manager(
self.non_default_test_db
).delete_expired(expires=10)