Skip to content

Commit 52a129f

Browse files
add test
1 parent 3081b77 commit 52a129f

File tree

4 files changed

+47
-108
lines changed

4 files changed

+47
-108
lines changed

apps/worker/tasks/manual_trigger.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from database.models import Commit, Pull
99
from database.models.reports import CommitReport, Upload
1010
from services.comparison import get_or_create_comparison
11-
from services.processing.state import ProcessingState
1211
from shared.celery_config import (
1312
compute_comparison_task_name,
1413
manual_upload_completion_trigger_task_name,
@@ -97,26 +96,6 @@ def process_impl_within_lock(
9796
for upload in uploads:
9897
if not upload.state or upload.state_id == UploadState.UPLOADED.db_id:
9998
still_processing += 1
100-
101-
# Also check Redis processing state to prevent race conditions
102-
# where uploads have been marked complete in DB but are still
103-
# being processed/merged by the finisher task
104-
state = ProcessingState(repoid, commitid)
105-
upload_numbers = state.get_upload_numbers()
106-
107-
if upload_numbers.processing > 0 or upload_numbers.processed > 0:
108-
log.info(
109-
"Retrying ManualTriggerTask. Redis shows uploads still being processed.",
110-
extra={
111-
"repoid": repoid,
112-
"commitid": commitid,
113-
"redis_processing": upload_numbers.processing,
114-
"redis_processed": upload_numbers.processed,
115-
"db_still_processing": still_processing,
116-
},
117-
)
118-
still_processing += upload_numbers.processing + upload_numbers.processed
119-
12099
if still_processing == 0:
121100
self.trigger_notifications(repoid, commitid, commit_yaml)
122101
if commit.pullid:

apps/worker/tasks/tests/unit/test_manual_trigger.py

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from database.tests.factories import CommitFactory, PullFactory
55
from database.tests.factories.core import UploadFactory
6-
from services.processing.state import UploadNumbers
76
from shared.reports.enums import UploadState
87
from tasks.manual_trigger import ManualTriggerTask
98

@@ -18,14 +17,6 @@ def test_manual_upload_completion_trigger(
1817
mock_redis,
1918
celery_app,
2019
):
21-
# Mock ProcessingState to return no pending uploads in Redis
22-
mock_processing_state = mocker.patch("tasks.manual_trigger.ProcessingState")
23-
mock_state_instance = mocker.MagicMock()
24-
mock_state_instance.get_upload_numbers.return_value = UploadNumbers(
25-
processing=0, processed=0
26-
)
27-
mock_processing_state.return_value = mock_state_instance
28-
2920
mocked_app = mocker.patch.object(
3021
ManualTriggerTask,
3122
"app",
@@ -87,14 +78,6 @@ def test_manual_upload_completion_trigger_uploads_still_processing(
8778
mock_redis,
8879
celery_app,
8980
):
90-
# Mock ProcessingState to return no pending uploads in Redis
91-
mock_processing_state = mocker.patch("tasks.manual_trigger.ProcessingState")
92-
mock_state_instance = mocker.MagicMock()
93-
mock_state_instance.get_upload_numbers.return_value = UploadNumbers(
94-
processing=0, processed=0
95-
)
96-
mock_processing_state.return_value = mock_state_instance
97-
9881
mocker.patch.object(
9982
ManualTriggerTask,
10083
"app",
@@ -122,47 +105,3 @@ def test_manual_upload_completion_trigger_uploads_still_processing(
122105
"notifications_called": False,
123106
"message": "Uploads are still in process and the task got retired so many times. Not triggering notifications.",
124107
} == result
125-
126-
def test_manual_upload_completion_trigger_redis_pending(
127-
self,
128-
mocker,
129-
mock_configuration,
130-
dbsession,
131-
mock_storage,
132-
mock_redis,
133-
celery_app,
134-
):
135-
"""Test that task retries when Redis shows pending uploads even if DB shows complete"""
136-
# Mock ProcessingState to return pending uploads in Redis
137-
mock_processing_state = mocker.patch("tasks.manual_trigger.ProcessingState")
138-
mock_state_instance = mocker.MagicMock()
139-
mock_state_instance.get_upload_numbers.return_value = UploadNumbers(
140-
processing=1,
141-
processed=2, # Redis shows 3 uploads still being processed/merged
142-
)
143-
mock_processing_state.return_value = mock_state_instance
144-
145-
mocker.patch.object(
146-
ManualTriggerTask,
147-
"app",
148-
celery_app,
149-
)
150-
commit = CommitFactory.create()
151-
# Upload is complete in DB
152-
upload = UploadFactory.create(
153-
report__commit=commit,
154-
state="complete",
155-
state_id=UploadState.PROCESSED.db_id,
156-
)
157-
dbsession.add(commit)
158-
dbsession.add(upload)
159-
dbsession.flush()
160-
161-
# Should retry because Redis shows pending uploads
162-
with pytest.raises(Retry):
163-
ManualTriggerTask().run_impl(
164-
dbsession,
165-
repoid=commit.repoid,
166-
commitid=commit.commitid,
167-
current_yaml={},
168-
)

apps/worker/tasks/tests/unit/test_upload_finisher_task.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import UTC, datetime
12
from pathlib import Path
23
from unittest.mock import ANY, call
34

@@ -1156,3 +1157,49 @@ def test_reconstruct_processing_results_returns_empty_when_no_uploads_found(
11561157

11571158
# Verify empty list returned when no uploads found
11581159
assert result == []
1160+
1161+
@pytest.mark.django_db
1162+
def test_upload_finisher_updates_repository_timestamp(
1163+
self,
1164+
mocker,
1165+
mock_configuration,
1166+
dbsession,
1167+
mock_storage,
1168+
mock_repo_provider,
1169+
mock_redis,
1170+
mock_self_app,
1171+
):
1172+
"""Test that repository.updatestamp is updated when None or old"""
1173+
1174+
mock_redis.scard.return_value = 0
1175+
mocker.patch("tasks.upload_finisher.load_intermediate_reports", return_value=[])
1176+
mocker.patch("tasks.upload_finisher.update_uploads")
1177+
1178+
# Create commit with repository that has no updatestamp
1179+
commit = CommitFactory.create(
1180+
message="test",
1181+
branch="main",
1182+
repository__branch="main",
1183+
)
1184+
# Ensure updatestamp is None
1185+
commit.repository.updatestamp = None
1186+
dbsession.add(commit)
1187+
dbsession.flush()
1188+
1189+
previous_results = [
1190+
{"upload_id": 0, "arguments": {"url": "test_url"}, "successful": True}
1191+
]
1192+
1193+
result = UploadFinisherTask().run_impl(
1194+
dbsession,
1195+
previous_results,
1196+
repoid=commit.repoid,
1197+
commitid=commit.commitid,
1198+
commit_yaml={},
1199+
)
1200+
1201+
assert result == {"notifications_called": True}
1202+
dbsession.refresh(commit.repository)
1203+
# Repository timestamp should now be set
1204+
assert commit.repository.updatestamp is not None
1205+
assert (datetime.now(tz=UTC) - commit.repository.updatestamp).seconds < 60

apps/worker/tasks/upload_finisher.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -347,12 +347,6 @@ def run_impl(
347347

348348
except SoftTimeLimitExceeded:
349349
log.warning("run_impl: soft time limit exceeded")
350-
# Clean up orphaned state so future finishers can proceed
351-
state.mark_uploads_as_merged(upload_ids)
352-
log.info(
353-
"Cleaned up processing state after timeout",
354-
extra={"upload_ids": upload_ids},
355-
)
356350
self._call_upload_breadcrumb_task(
357351
commit_sha=commitid,
358352
repo_id=repoid,
@@ -367,12 +361,6 @@ def run_impl(
367361

368362
except Exception as e:
369363
log.exception("run_impl: unexpected error in upload finisher")
370-
# Clean up orphaned state so future finishers can proceed
371-
state.mark_uploads_as_merged(upload_ids)
372-
log.info(
373-
"Cleaned up processing state after exception",
374-
extra={"upload_ids": upload_ids, "error": str(e)},
375-
)
376364
sentry_sdk.capture_exception(e)
377365
log.exception(
378366
"Unexpected error in upload finisher",
@@ -688,20 +676,6 @@ def should_call_notifications(
688676
"parent_task": self.request.parent_id,
689677
}
690678

691-
# Check if there are still pending uploads
692-
state = ProcessingState(commit.repoid, commit.commitid)
693-
upload_numbers = state.get_upload_numbers()
694-
if upload_numbers.processing > 0 or upload_numbers.processed > 0:
695-
log.info(
696-
"Not scheduling notify because there are still pending uploads",
697-
extra={
698-
**extra_dict,
699-
"processing": upload_numbers.processing,
700-
"processed": upload_numbers.processed,
701-
},
702-
)
703-
return ShouldCallNotifyResult.DO_NOT_NOTIFY
704-
705679
manual_trigger = read_yaml_field(
706680
commit_yaml, ("codecov", "notify", "manual_trigger")
707681
)

0 commit comments

Comments
 (0)