Skip to content

Commit 6c3fc3b

Browse files
committed
stop disabling django autocommit
1 parent 74af83e commit 6c3fc3b

File tree

9 files changed

+7
-182
lines changed

9 files changed

+7
-182
lines changed

django_scaffold/settings.py

-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88

99
ALLOWED_HOSTS = []
1010

11-
DATABASES["default"]["AUTOCOMMIT"] = False
12-
if "timeseries" in DATABASES:
13-
DATABASES["timeseries"]["AUTOCOMMIT"] = False
14-
1511
IS_DEV = os.getenv("RUN_ENV") == "DEV"
1612
IS_ENTERPRISE = os.getenv("RUN_ENV") == "ENTERPRISE"
1713

services/cleanup/tests/test_utils.py

-55
This file was deleted.

services/cleanup/utils.py

-20
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from contextlib import contextmanager
44

55
import shared.storage
6-
from django.db import transaction
76
from django.db.models import Model
87
from shared.config import get_config
98
from shared.storage.base import BaseStorageService
@@ -35,25 +34,6 @@ def cleanup_context():
3534
context.threadpool.shutdown()
3635

3736

38-
@contextmanager
39-
def with_autocommit():
40-
conn = transaction.get_connection()
41-
# if we are in an `atomic` block, we cannot mess with the autocommit flag
42-
if conn.in_atomic_block:
43-
yield
44-
return
45-
46-
try:
47-
autocommit = conn.get_autocommit()
48-
if autocommit != True:
49-
# we first have to commit an implicitly running transaction
50-
conn.commit()
51-
conn.set_autocommit(True)
52-
yield
53-
finally:
54-
conn.set_autocommit(autocommit)
55-
56-
5737
@dataclasses.dataclass
5838
class CleanupResult:
5939
cleaned_models: int

tasks/base.py

-45
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
from celery._state import get_current_task
66
from celery.exceptions import MaxRetriesExceededError, SoftTimeLimitExceeded
77
from celery.worker.request import Request
8-
from django.db import transaction as django_transaction
98
from shared.celery_router import route_tasks_based_on_user_plan
109
from shared.metrics import Counter, Histogram
11-
from shared.timeseries.helpers import is_timeseries_enabled
1210
from shared.torngit.base import TorngitBaseAdapter
1311
from shared.typings.torngit import AdditionalData
1412
from sqlalchemy.exc import (
@@ -180,46 +178,6 @@ def apply_async(self, args=None, kwargs=None, **options):
180178
}
181179
return super().apply_async(args=args, kwargs=kwargs, headers=headers, **options)
182180

183-
def _commit_django(self):
184-
try:
185-
django_transaction.commit()
186-
except Exception as e:
187-
log.warning(
188-
"Django transaction failed to commit.",
189-
exc_info=True,
190-
extra=dict(e=e),
191-
)
192-
193-
if is_timeseries_enabled():
194-
try:
195-
django_transaction.commit("timeseries")
196-
except Exception as e:
197-
log.warning(
198-
"Django transaction failed to commit in the timeseries database.",
199-
exc_info=True,
200-
extra=dict(e=e),
201-
)
202-
203-
def _rollback_django(self):
204-
try:
205-
django_transaction.rollback()
206-
except Exception as e:
207-
log.warning(
208-
"Django transaction failed to roll back.",
209-
exc_info=True,
210-
extra=dict(e=e),
211-
)
212-
213-
if is_timeseries_enabled():
214-
try:
215-
django_transaction.rollback("timeseries")
216-
except Exception as e:
217-
log.warning(
218-
"Django transaction failed to roll back in the timeseries database.",
219-
exc_info=True,
220-
extra=dict(e=e),
221-
)
222-
223181
# Called when attempting to retry the task on db error
224182
def _retry(self, countdown=None):
225183
if not countdown:
@@ -307,12 +265,10 @@ def run(self, *args, **kwargs):
307265
extra=dict(task_args=args, task_kwargs=kwargs),
308266
)
309267
db_session.rollback()
310-
self._rollback_django()
311268
self._retry()
312269
except SQLAlchemyError as ex:
313270
self._analyse_error(ex, args, kwargs)
314271
db_session.rollback()
315-
self._rollback_django()
316272
self._retry()
317273
except MaxRetriesExceededError as ex:
318274
if UploadFlow.has_begun():
@@ -321,7 +277,6 @@ def run(self, *args, **kwargs):
321277
TestResultsFlow.log(TestResultsFlow.UNCAUGHT_RETRY_EXCEPTION)
322278
finally:
323279
self.wrap_up_dbsession(db_session)
324-
self._commit_django()
325280

326281
def wrap_up_dbsession(self, db_session):
327282
"""

tasks/delete_owner.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from app import celery_app
77
from services.cleanup.owner import cleanup_owner
8-
from services.cleanup.utils import CleanupSummary, with_autocommit
8+
from services.cleanup.utils import CleanupSummary
99
from tasks.base import BaseCodecovTask
1010

1111
log = logging.getLogger(__name__)
@@ -17,8 +17,7 @@ class DeleteOwnerTask(BaseCodecovTask, name=delete_owner_task_name):
1717

1818
def run_impl(self, _db_session, ownerid: int) -> CleanupSummary:
1919
try:
20-
with with_autocommit():
21-
return cleanup_owner(ownerid)
20+
return cleanup_owner(ownerid)
2221
except SoftTimeLimitExceeded:
2322
raise self.retry()
2423

tasks/flush_repo.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from app import celery_app
66
from services.cleanup.repository import cleanup_repo
7-
from services.cleanup.utils import CleanupSummary, with_autocommit
7+
from services.cleanup.utils import CleanupSummary
88
from tasks.base import BaseCodecovTask
99

1010
log = logging.getLogger(__name__)
@@ -16,8 +16,7 @@ class FlushRepoTask(BaseCodecovTask, name="app.tasks.flush_repo.FlushRepo"):
1616

1717
def run_impl(self, _db_session, repoid: int) -> CleanupSummary:
1818
try:
19-
with with_autocommit():
20-
return cleanup_repo(repoid)
19+
return cleanup_repo(repoid)
2120
except SoftTimeLimitExceeded:
2221
raise self.retry()
2322

tasks/regular_cleanup.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from app import celery_app
66
from celery_config import regular_cleanup_cron_task_name
77
from services.cleanup.regular import run_regular_cleanup
8-
from services.cleanup.utils import CleanupSummary, with_autocommit
8+
from services.cleanup.utils import CleanupSummary
99
from tasks.base import BaseCodecovTask
1010

1111
log = logging.getLogger(__name__)
@@ -17,8 +17,7 @@ class RegularCleanupTask(BaseCodecovTask, name=regular_cleanup_cron_task_name):
1717

1818
def run_impl(self, _db_session, *args, **kwargs) -> CleanupSummary:
1919
try:
20-
with with_autocommit():
21-
return run_regular_cleanup()
20+
return run_regular_cleanup()
2221
except SoftTimeLimitExceeded:
2322
raise self.retry()
2423

tasks/tests/integration/test_upload_e2e.py

-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ def setup_mocks(
133133
hook_session(mocker, dbsession)
134134
# to not close the session after each task
135135
mocker.patch("tasks.base.BaseCodecovTask.wrap_up_dbsession")
136-
mocker.patch("tasks.base.BaseCodecovTask._commit_django")
137136
# patch various `get_repo_provider_service` imports
138137
hook_repo_provider(mocker, mock_repo_provider)
139138
# avoid some calls reaching out to git providers

tasks/tests/unit/test_base.py

+1-48
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from prometheus_client import REGISTRY
1212
from shared.celery_config import sync_repos_task_name, upload_task_name
1313
from shared.plan.constants import PlanName
14-
from shared.utils.test_utils import mock_config_helper
1514
from sqlalchemy.exc import (
1615
DBAPIError,
1716
IntegrityError,
@@ -208,40 +207,8 @@ def test_wrap_up_dbsession_invalid_nothing_works(self, mocker):
208207
assert fake_session.close.call_count == 0
209208
assert mocked_get_db_session.remove.call_count == 1
210209

211-
def test_commit_django_with_timeseries(self, mocker):
212-
mock_config_helper(mocker, configs={"setup.timeseries.enabled": True})
213-
mock_commit = mocker.patch("tasks.base.django_transaction.commit")
214-
task = BaseCodecovTask()
215-
task._commit_django()
216-
assert mock_commit.call_args_list == [call(), call("timeseries")]
217-
218-
def test_commit_django_without_timeseries(self, mocker):
219-
mock_config_helper(mocker, configs={"setup.timeseries.enabled": False})
220-
mock_commit = mocker.patch("tasks.base.django_transaction.commit")
221-
task = BaseCodecovTask()
222-
task._commit_django()
223-
assert mock_commit.call_args_list == [call()]
224-
225-
def test_rollback_django_with_timeseries(self, mocker):
226-
mock_config_helper(mocker, configs={"setup.timeseries.enabled": True})
227-
mock_rollback = mocker.patch("tasks.base.django_transaction.rollback")
228-
task = BaseCodecovTask()
229-
task._rollback_django()
230-
assert mock_rollback.call_args_list == [call(), call("timeseries")]
231-
232-
def test_rollback_django_without_timeseries(self, mocker):
233-
mock_config_helper(mocker, configs={"setup.timeseries.enabled": False})
234-
mock_rollback = mocker.patch("tasks.base.django_transaction.rollback")
235-
task = BaseCodecovTask()
236-
task._rollback_django()
237-
assert mock_rollback.call_args_list == [call()]
238-
239-
def test_run_success_commits_both_orms(self, mocker, dbsession):
240-
mock_django_commit = mocker.patch("tasks.base.BaseCodecovTask._commit_django")
210+
def test_run_success_commits_sqlalchemy(self, mocker, dbsession):
241211
mock_wrap_up = mocker.patch("tasks.base.BaseCodecovTask.wrap_up_dbsession")
242-
mock_django_rollback = mocker.patch(
243-
"tasks.base.BaseCodecovTask._rollback_django"
244-
)
245212
mock_dbsession_rollback = mocker.patch.object(dbsession, "rollback")
246213
mock_get_db_session = mocker.patch(
247214
"tasks.base.get_db_session", return_value=dbsession
@@ -250,17 +217,11 @@ def test_run_success_commits_both_orms(self, mocker, dbsession):
250217
task = SampleTask()
251218
task.run()
252219

253-
assert mock_django_commit.call_args_list == [call()]
254220
assert mock_wrap_up.call_args_list == [call(dbsession)]
255221

256-
assert mock_django_rollback.call_count == 0
257222
assert mock_dbsession_rollback.call_count == 0
258223

259224
def test_run_db_errors_rollback(self, mocker, dbsession, celery_app):
260-
mock_django_commit = mocker.patch("tasks.base.BaseCodecovTask._commit_django")
261-
mock_django_rollback = mocker.patch(
262-
"tasks.base.BaseCodecovTask._rollback_django"
263-
)
264225
mock_dbsession_rollback = mocker.patch.object(dbsession, "rollback")
265226
mock_wrap_up = mocker.patch("tasks.base.BaseCodecovTask.wrap_up_dbsession")
266227
mock_get_db_session = mocker.patch(
@@ -274,17 +235,11 @@ def test_run_db_errors_rollback(self, mocker, dbsession, celery_app):
274235
task = celery_app.tasks[registered_task.name]
275236
task.apply()
276237

277-
assert mock_django_rollback.call_args_list == [call()]
278238
assert mock_dbsession_rollback.call_args_list == [call()]
279239

280-
assert mock_django_commit.call_args_list == [call()]
281240
assert mock_wrap_up.call_args_list == [call(dbsession)]
282241

283242
def test_run_sqlalchemy_error_rollback(self, mocker, dbsession, celery_app):
284-
mock_django_commit = mocker.patch("tasks.base.BaseCodecovTask._commit_django")
285-
mock_django_rollback = mocker.patch(
286-
"tasks.base.BaseCodecovTask._rollback_django"
287-
)
288243
mock_dbsession_rollback = mocker.patch.object(dbsession, "rollback")
289244
mock_wrap_up = mocker.patch("tasks.base.BaseCodecovTask.wrap_up_dbsession")
290245
mock_get_db_session = mocker.patch(
@@ -299,10 +254,8 @@ def test_run_sqlalchemy_error_rollback(self, mocker, dbsession, celery_app):
299254
task = celery_app.tasks[registered_task.name]
300255
task.apply()
301256

302-
assert mock_django_rollback.call_args_list == [call()]
303257
assert mock_dbsession_rollback.call_args_list == [call()]
304258

305-
assert mock_django_commit.call_args_list == [call()]
306259
assert mock_wrap_up.call_args_list == [call(dbsession)]
307260

308261
def test_get_repo_provider_service_working(self, mocker):

0 commit comments

Comments
 (0)