Skip to content

Commit f20d53c

Browse files
mtopo27claude
andcommitted
ref(preprod): Restructure commit_comparison conditional to if/else
Flip the early-return guard `if not artifact.commit_comparison: return` into an `if/else` block. This is a pure structural change with no behavior difference, preparing for a follow-up that adds logic to the else branch. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a8a5621 commit f20d53c

File tree

1 file changed

+170
-163
lines changed
  • src/sentry/preprod/size_analysis

1 file changed

+170
-163
lines changed

src/sentry/preprod/size_analysis/tasks.py

Lines changed: 170 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -72,195 +72,202 @@ def compare_preprod_artifact_size_analysis(
7272
)
7373
return
7474

75-
if not artifact.commit_comparison:
76-
logger.info(
77-
"preprod.size_analysis.compare.artifact_no_commit_comparison",
78-
extra={"artifact_id": artifact_id},
79-
)
80-
return
81-
82-
comparisons: list[dict[str, PreprodArtifactSizeMetrics]] = []
83-
preprod_artifact_status_check_updates: set[int] = {artifact.id}
84-
85-
# Create all comparisons with artifact as head
86-
base_artifact = artifact.get_base_artifact_for_commit().first()
87-
if base_artifact:
88-
if artifact.build_configuration != base_artifact.build_configuration:
89-
logger.info(
90-
"preprod.size_analysis.compare.artifact_different_build_configurations",
91-
extra={"head_artifact_id": artifact_id, "base_artifact_id": base_artifact.id},
75+
if artifact.commit_comparison:
76+
comparisons: list[dict[str, PreprodArtifactSizeMetrics]] = []
77+
preprod_artifact_status_check_updates: set[int] = {artifact.id}
78+
79+
# Create all comparisons with artifact as head
80+
base_artifact = artifact.get_base_artifact_for_commit().first()
81+
if base_artifact:
82+
if artifact.build_configuration != base_artifact.build_configuration:
83+
logger.info(
84+
"preprod.size_analysis.compare.artifact_different_build_configurations",
85+
extra={"head_artifact_id": artifact_id, "base_artifact_id": base_artifact.id},
86+
)
87+
# Update the status check even though we can't compare to avoid leaving it in a loading state
88+
create_preprod_status_check_task.apply_async(
89+
kwargs={
90+
"preprod_artifact_id": artifact_id,
91+
"caller": "compare_build_config_mismatch",
92+
}
93+
)
94+
return
95+
96+
base_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
97+
preprod_artifact_id__in=[base_artifact.id],
98+
preprod_artifact__project__organization_id=org_id,
99+
preprod_artifact__project_id=project_id,
100+
).select_related("preprod_artifact", "preprod_artifact__mobile_app_info")
101+
base_size_metrics = list(base_size_metrics_qs)
102+
103+
head_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
104+
preprod_artifact_id__in=[artifact_id],
105+
preprod_artifact__project__organization_id=org_id,
106+
preprod_artifact__project_id=project_id,
107+
).select_related(
108+
"preprod_artifact",
109+
"preprod_artifact__mobile_app_info",
110+
"preprod_artifact__commit_comparison",
92111
)
93-
# Update the status check even though we can't compare to avoid leaving it in a loading state
94-
create_preprod_status_check_task.apply_async(
95-
kwargs={
96-
"preprod_artifact_id": artifact_id,
97-
"caller": "compare_build_config_mismatch",
98-
}
112+
head_size_metrics = list(head_size_metrics_qs)
113+
114+
validation_result = can_compare_size_metrics(head_size_metrics, base_size_metrics)
115+
if validation_result.can_compare:
116+
base_metrics_map = build_size_metrics_map(base_size_metrics)
117+
head_metrics_map = build_size_metrics_map(head_size_metrics)
118+
119+
for key, base_metric in base_metrics_map.items():
120+
matching_head_size_metric = head_metrics_map.get(key)
121+
if matching_head_size_metric:
122+
logger.info(
123+
"preprod.size_analysis.compare.create_comparison",
124+
extra={
125+
"head_artifact_id": artifact_id,
126+
"base_artifact_id": base_artifact.id,
127+
},
128+
)
129+
comparisons.append(
130+
{"head_metric": matching_head_size_metric, "base_metric": base_metric},
131+
)
132+
else:
133+
logger.info(
134+
"preprod.size_analysis.compare.no_matching_base_size_metric",
135+
extra={
136+
"head_artifact_id": artifact_id,
137+
"size_metric_id": base_metric.id,
138+
},
139+
)
140+
else:
141+
logger.info(
142+
"preprod.size_analysis.compare.cannot_compare_size_metrics",
143+
extra={
144+
"head_artifact_id": artifact_id,
145+
"base_artifact_id": base_artifact.id,
146+
"error_message": validation_result.error_message,
147+
},
148+
)
149+
150+
# Also create comparisons with artifact as base
151+
head_artifacts = artifact.get_head_artifacts_for_commit()
152+
for head_artifact in head_artifacts:
153+
if head_artifact.build_configuration != artifact.build_configuration:
154+
logger.info(
155+
"preprod.size_analysis.compare.head_artifact_different_build_configurations",
156+
extra={"head_artifact_id": head_artifact.id, "base_artifact_id": artifact_id},
157+
)
158+
continue
159+
160+
head_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
161+
preprod_artifact_id__in=[head_artifact.id],
162+
preprod_artifact__project__organization_id=org_id,
163+
preprod_artifact__project_id=project_id,
164+
).select_related(
165+
"preprod_artifact",
166+
"preprod_artifact__mobile_app_info",
167+
"preprod_artifact__commit_comparison",
99168
)
100-
return
169+
head_size_metrics = list(head_size_metrics_qs)
101170

102-
base_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
103-
preprod_artifact_id__in=[base_artifact.id],
104-
preprod_artifact__project__organization_id=org_id,
105-
preprod_artifact__project_id=project_id,
106-
).select_related("preprod_artifact", "preprod_artifact__mobile_app_info")
107-
base_size_metrics = list(base_size_metrics_qs)
171+
base_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
172+
preprod_artifact_id__in=[artifact_id],
173+
preprod_artifact__project__organization_id=org_id,
174+
preprod_artifact__project_id=project_id,
175+
).select_related("preprod_artifact", "preprod_artifact__mobile_app_info")
176+
base_size_metrics = list(base_size_metrics_qs)
108177

109-
head_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
110-
preprod_artifact_id__in=[artifact_id],
111-
preprod_artifact__project__organization_id=org_id,
112-
preprod_artifact__project_id=project_id,
113-
).select_related(
114-
"preprod_artifact",
115-
"preprod_artifact__mobile_app_info",
116-
"preprod_artifact__commit_comparison",
117-
)
118-
head_size_metrics = list(head_size_metrics_qs)
178+
validation_result = can_compare_size_metrics(head_size_metrics, base_size_metrics)
179+
if not validation_result.can_compare:
180+
logger.info(
181+
"preprod.size_analysis.compare.cannot_compare_size_metrics",
182+
extra={
183+
"head_artifact_id": head_artifact.id,
184+
"base_artifact_id": artifact_id,
185+
"error_message": validation_result.error_message,
186+
},
187+
)
188+
continue
119189

120-
validation_result = can_compare_size_metrics(head_size_metrics, base_size_metrics)
121-
if validation_result.can_compare:
122-
base_metrics_map = build_size_metrics_map(base_size_metrics)
123190
head_metrics_map = build_size_metrics_map(head_size_metrics)
191+
base_metrics_map = build_size_metrics_map(base_size_metrics)
124192

125-
for key, base_metric in base_metrics_map.items():
126-
matching_head_size_metric = head_metrics_map.get(key)
127-
if matching_head_size_metric:
193+
for key, head_metric in head_metrics_map.items():
194+
matching_base_size_metric = base_metrics_map.get(key)
195+
if matching_base_size_metric:
128196
logger.info(
129197
"preprod.size_analysis.compare.create_comparison",
130198
extra={
131-
"head_artifact_id": artifact_id,
132-
"base_artifact_id": base_artifact.id,
199+
"head_artifact_id": head_artifact.id,
200+
"base_artifact_id": artifact.id,
133201
},
134202
)
135203
comparisons.append(
136-
{"head_metric": matching_head_size_metric, "base_metric": base_metric},
204+
{"head_metric": head_metric, "base_metric": matching_base_size_metric},
137205
)
206+
preprod_artifact_status_check_updates.add(head_artifact.id)
138207
else:
139208
logger.info(
140209
"preprod.size_analysis.compare.no_matching_base_size_metric",
141-
extra={"head_artifact_id": artifact_id, "size_metric_id": base_metric.id},
210+
extra={
211+
"head_artifact_id": head_artifact.id,
212+
"size_metric_id": head_metric.id,
213+
},
142214
)
143-
else:
144-
logger.info(
145-
"preprod.size_analysis.compare.cannot_compare_size_metrics",
146-
extra={
147-
"head_artifact_id": artifact_id,
148-
"base_artifact_id": base_artifact.id,
149-
"error_message": validation_result.error_message,
150-
},
151-
)
152-
153-
# Also create comparisons with artifact as base
154-
head_artifacts = artifact.get_head_artifacts_for_commit()
155-
for head_artifact in head_artifacts:
156-
if head_artifact.build_configuration != artifact.build_configuration:
157-
logger.info(
158-
"preprod.size_analysis.compare.head_artifact_different_build_configurations",
159-
extra={"head_artifact_id": head_artifact.id, "base_artifact_id": artifact_id},
160-
)
161-
continue
162215

163-
head_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
164-
preprod_artifact_id__in=[head_artifact.id],
165-
preprod_artifact__project__organization_id=org_id,
166-
preprod_artifact__project_id=project_id,
167-
).select_related(
168-
"preprod_artifact",
169-
"preprod_artifact__mobile_app_info",
170-
"preprod_artifact__commit_comparison",
171-
)
172-
head_size_metrics = list(head_size_metrics_qs)
173-
174-
base_size_metrics_qs = PreprodArtifactSizeMetrics.objects.filter(
175-
preprod_artifact_id__in=[artifact_id],
176-
preprod_artifact__project__organization_id=org_id,
177-
preprod_artifact__project_id=project_id,
178-
).select_related("preprod_artifact", "preprod_artifact__mobile_app_info")
179-
base_size_metrics = list(base_size_metrics_qs)
180-
181-
validation_result = can_compare_size_metrics(head_size_metrics, base_size_metrics)
182-
if not validation_result.can_compare:
183-
logger.info(
184-
"preprod.size_analysis.compare.cannot_compare_size_metrics",
185-
extra={
186-
"head_artifact_id": head_artifact.id,
187-
"base_artifact_id": artifact_id,
188-
"error_message": validation_result.error_message,
189-
},
190-
)
191-
continue
192-
193-
head_metrics_map = build_size_metrics_map(head_size_metrics)
194-
base_metrics_map = build_size_metrics_map(base_size_metrics)
216+
# Create PENDING comparison records in DB and run comparisons
217+
with transaction.atomic(router.db_for_write(PreprodArtifactSizeComparison)):
218+
for comp in comparisons:
219+
head_metric = comp["head_metric"]
220+
base_metric = comp["base_metric"]
221+
comparison, created = PreprodArtifactSizeComparison.objects.get_or_create(
222+
head_size_analysis=head_metric,
223+
base_size_analysis=base_metric,
224+
organization_id=org_id,
225+
defaults={"state": PreprodArtifactSizeComparison.State.PENDING},
226+
)
195227

196-
for key, head_metric in head_metrics_map.items():
197-
matching_base_size_metric = base_metrics_map.get(key)
198-
if matching_base_size_metric:
199228
logger.info(
200-
"preprod.size_analysis.compare.create_comparison",
229+
"preprod.size_analysis.compare.running_comparison",
201230
extra={
202-
"head_artifact_id": head_artifact.id,
203-
"base_artifact_id": artifact.id,
231+
"head_metric_id": head_metric.id,
232+
"base_metric_id": base_metric.id,
233+
"comparison_created": created,
204234
},
205235
)
206-
comparisons.append(
207-
{"head_metric": head_metric, "base_metric": matching_base_size_metric},
208-
)
209-
preprod_artifact_status_check_updates.add(head_artifact.id)
210-
else:
211-
logger.info(
212-
"preprod.size_analysis.compare.no_matching_base_size_metric",
213-
extra={"head_artifact_id": head_artifact.id, "size_metric_id": head_metric.id},
236+
_run_size_analysis_comparison(org_id, head_metric, base_metric)
237+
238+
for artifact_id in preprod_artifact_status_check_updates:
239+
# Update all artifact's status check with the new comparison
240+
create_preprod_status_check_task.apply_async(
241+
kwargs={
242+
"preprod_artifact_id": artifact_id,
243+
"caller": "compare_completion",
244+
}
214245
)
215246

216-
# Create PENDING comparison records in DB and run comparisons
217-
with transaction.atomic(router.db_for_write(PreprodArtifactSizeComparison)):
218-
for comp in comparisons:
219-
head_metric = comp["head_metric"]
220-
base_metric = comp["base_metric"]
221-
comparison, created = PreprodArtifactSizeComparison.objects.get_or_create(
222-
head_size_analysis=head_metric,
223-
base_size_analysis=base_metric,
224-
organization_id=org_id,
225-
defaults={"state": PreprodArtifactSizeComparison.State.PENDING},
226-
)
227-
228-
logger.info(
229-
"preprod.size_analysis.compare.running_comparison",
230-
extra={
231-
"head_metric_id": head_metric.id,
232-
"base_metric_id": base_metric.id,
233-
"comparison_created": created,
234-
},
235-
)
236-
_run_size_analysis_comparison(org_id, head_metric, base_metric)
237-
238-
for artifact_id in preprod_artifact_status_check_updates:
239-
# Update all artifact's status check with the new comparison
240-
create_preprod_status_check_task.apply_async(
241-
kwargs={
242-
"preprod_artifact_id": artifact_id,
243-
"caller": "compare_completion",
244-
}
245-
)
246-
247-
artifact_type_name = "unknown"
248-
if artifact.artifact_type is not None:
249-
try:
250-
artifact_type_name = PreprodArtifact.ArtifactType(artifact.artifact_type).name.lower()
251-
except (ValueError, AttributeError):
252-
artifact_type_name = "unknown"
253-
254-
time_now = timezone.now()
255-
e2e_size_analysis_compare_duration = time_now - artifact.date_added
256-
metrics.distribution(
257-
"preprod.size_analysis.compare.results_e2e",
258-
e2e_size_analysis_compare_duration.total_seconds(),
259-
sample_rate=1.0,
260-
tags={
261-
"artifact_type": artifact_type_name,
262-
},
263-
)
247+
artifact_type_name = "unknown"
248+
if artifact.artifact_type is not None:
249+
try:
250+
artifact_type_name = PreprodArtifact.ArtifactType(
251+
artifact.artifact_type
252+
).name.lower()
253+
except (ValueError, AttributeError):
254+
artifact_type_name = "unknown"
255+
256+
time_now = timezone.now()
257+
e2e_size_analysis_compare_duration = time_now - artifact.date_added
258+
metrics.distribution(
259+
"preprod.size_analysis.compare.results_e2e",
260+
e2e_size_analysis_compare_duration.total_seconds(),
261+
sample_rate=1.0,
262+
tags={
263+
"artifact_type": artifact_type_name,
264+
},
265+
)
266+
else:
267+
logger.info(
268+
"preprod.size_analysis.compare.artifact_no_commit_comparison",
269+
extra={"artifact_id": artifact_id},
270+
)
264271

265272

266273
@instrumented_task(

0 commit comments

Comments
 (0)