From 645f67f993a17d50e3d5d33d3ca08d4a95e9ce09 Mon Sep 17 00:00:00 2001 From: Hector Date: Fri, 30 Jan 2026 15:43:48 +0000 Subject: [PATCH 1/3] Use requested_features from server response instead of Kafka payload The server returns the actual requested features to process in its response, which may differ from the Kafka payload. This change switches to using the server's requested_features to ensure we process what the server expects. Co-Authored-By: Claude Opus 4.5 --- src/launchpad/artifact_processor.py | 14 +++----------- tests/integration/test_kafka_service.py | 3 +-- tests/unit/artifacts/test_artifact_processor.py | 5 ----- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/launchpad/artifact_processor.py b/src/launchpad/artifact_processor.py index a82a40e0..0eb37a25 100644 --- a/src/launchpad/artifact_processor.py +++ b/src/launchpad/artifact_processor.py @@ -97,13 +97,6 @@ def process_message( objectstore_client = ObjectstoreClient(service_config.objectstore_url) artifact_processor = ArtifactProcessor(sentry_client, statsd, objectstore_client) - requested_features = [] - for feature in payload.get("requested_features", []): - try: - requested_features.append(PreprodFeature(feature)) - except ValueError: - logger.exception(f"Unknown feature {feature}") - if service_config and project_id in service_config.projects_to_skip: logger.info(f"Skipping processing for project {project_id}") return @@ -127,7 +120,7 @@ def process_message( statsd.increment("artifact.processing.started") logger.info(f"Processing artifact {artifact_id} (project: {project_id}, org: {organization_id})") try: - artifact_processor.process_artifact(organization_id, project_id, artifact_id, requested_features) + artifact_processor.process_artifact(organization_id, project_id, artifact_id) except Exception: statsd.increment("artifact.processing.failed") duration = time.time() - start_time @@ -146,7 +139,6 @@ def process_artifact( organization_id: str, project_id: str, artifact_id: str, - requested_features: list[PreprodFeature], ) -> None: """Process an artifact with the requested features.""" dequeued_at = datetime.now() @@ -172,10 +164,10 @@ def process_artifact( app_icon_object_id, ) - if PreprodFeature.SIZE_ANALYSIS in requested_features: + if PreprodFeature.SIZE_ANALYSIS in server_requested_features: self._do_size(organization_id, project_id, artifact_id, artifact, analyzer) - if PreprodFeature.BUILD_DISTRIBUTION in requested_features: + if PreprodFeature.BUILD_DISTRIBUTION in server_requested_features: self._do_distribution(organization_id, project_id, artifact_id, artifact, info) @contextlib.contextmanager diff --git a/tests/integration/test_kafka_service.py b/tests/integration/test_kafka_service.py index 4a882e95..706a9e56 100644 --- a/tests/integration/test_kafka_service.py +++ b/tests/integration/test_kafka_service.py @@ -10,7 +10,7 @@ from aiohttp.test_utils import TestClient, TestServer from launchpad.artifact_processor import ArtifactProcessor -from launchpad.constants import PREPROD_ARTIFACT_EVENTS_TOPIC, PreprodFeature +from launchpad.constants import PREPROD_ARTIFACT_EVENTS_TOPIC from launchpad.kafka import LaunchpadKafkaConsumer, create_kafka_consumer, get_kafka_config from launchpad.service import LaunchpadService, ServiceConfig, get_service_config from launchpad.utils.statsd import FakeStatsd @@ -214,7 +214,6 @@ def test_process_message_with_allowed_project(self): "test-org", "normal-project", "test-123", - [PreprodFeature.SIZE_ANALYSIS], ) calls = fake_statsd.calls diff --git a/tests/unit/artifacts/test_artifact_processor.py b/tests/unit/artifacts/test_artifact_processor.py index fe63fa46..bdd18b2e 100644 --- a/tests/unit/artifacts/test_artifact_processor.py +++ b/tests/unit/artifacts/test_artifact_processor.py @@ -7,7 +7,6 @@ from launchpad.artifact_processor import ArtifactProcessor from launchpad.constants import ( - PreprodFeature, ProcessingErrorCode, ProcessingErrorMessage, ) @@ -169,7 +168,6 @@ def test_process_message_ios(self, mock_process, mock_sentry_client): "test-org-123", "test-project-ios", "ios-test-123", - [PreprodFeature.SIZE_ANALYSIS], ) # Verify metrics were recorded @@ -210,7 +208,6 @@ def test_process_message_android(self, mock_process, mock_sentry_client): "test-org-456", "test-project-android", "android-test-456", - [PreprodFeature.SIZE_ANALYSIS, PreprodFeature.BUILD_DISTRIBUTION], ) # Verify metrics were recorded @@ -254,7 +251,6 @@ def test_process_message_error(self, mock_process, mock_sentry_client): "test-org", "test-project", "test-123", - [PreprodFeature.SIZE_ANALYSIS, PreprodFeature.BUILD_DISTRIBUTION], ) # Verify the metrics were called correctly @@ -320,7 +316,6 @@ def test_process_message_project_not_skipped(self, mock_process, mock_sentry_cli "test-org-123", "normal-project", "normal-test-123", - [PreprodFeature.SIZE_ANALYSIS, PreprodFeature.BUILD_DISTRIBUTION], ) # Verify normal metrics were recorded From 74978019156a5f42bfd0875cf38ee7e6c6621306 Mon Sep 17 00:00:00 2001 From: Hector Date: Mon, 2 Feb 2026 19:56:34 +0000 Subject: [PATCH 2/3] add requestedFeatures to mock-sentry-api --- tests/e2e/mock-sentry-api/server.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/e2e/mock-sentry-api/server.py b/tests/e2e/mock-sentry-api/server.py index 724c9161..01c20a6c 100644 --- a/tests/e2e/mock-sentry-api/server.py +++ b/tests/e2e/mock-sentry-api/server.py @@ -140,7 +140,12 @@ async def update_artifact( # Track which fields were updated updated_fields = list(data.keys()) - return {"success": True, "artifactId": artifact_id, "updatedFields": updated_fields} + return { + "success": True, + "artifactId": artifact_id, + "updatedFields": updated_fields, + "requestedFeatures": ["size_analysis"], + } @app.get("/api/0/organizations/{org}/chunk-upload/") From 0aada37b8ca042e91fae5fdae680c1ff925c4561 Mon Sep 17 00:00:00 2001 From: Hector Date: Tue, 3 Feb 2026 12:16:08 +0000 Subject: [PATCH 3/3] noop change --- tests/e2e/mock-sentry-api/server.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/mock-sentry-api/server.py b/tests/e2e/mock-sentry-api/server.py index 01c20a6c..4e4c17c0 100644 --- a/tests/e2e/mock-sentry-api/server.py +++ b/tests/e2e/mock-sentry-api/server.py @@ -170,7 +170,6 @@ async def upload_chunk( file: UploadFile, authorization: str = Header(None), ): - """Upload a file chunk.""" # Read chunk data chunk_data = await file.read()