Browse Source

Clean up `ArtifactBundle(FlatFile)Index` (#66206)

There are two changes here:
- Set legacy fields on `ArtifactBundleIndex` as nullable for future
removal
- Remove DB constraints on obsolete `FlatFileIndex` tables in
preparation for removal

The `FlatFileIndex` machinery was removed in
https://github.com/getsentry/sentry/pull/66125, and this is the first
step towards the complete removal of the related tables.
Arpad Borsos 1 year ago
parent
commit
e3b0e3db17

+ 1 - 1
migrations_lockfile.txt

@@ -9,5 +9,5 @@ feedback: 0004_index_together
 hybridcloud: 0013_add_orgauthtokenreplica_token_index
 nodestore: 0002_nodestore_no_dictfield
 replays: 0004_index_together
-sentry: 0658_projectkey_usecase
+sentry: 0659_artifactbundleindex_cleanup
 social_auth: 0002_default_auto_field

+ 0 - 7
src/sentry/debug_files/artifact_bundles.py

@@ -143,13 +143,6 @@ def index_urls_in_bundle(
                         # metadata:
                         organization_id=organization_id,
                         date_added=artifact_bundle.date_added,
-                        # legacy:
-                        # TODO: We fill these in with empty-ish values before they are
-                        # dropped for good
-                        release_name="",
-                        dist_name="",
-                        date_last_modified=artifact_bundle.date_last_modified
-                        or artifact_bundle.date_added,
                     )
                 )
     finally:

+ 62 - 0
src/sentry/migrations/0659_artifactbundleindex_cleanup.py

@@ -0,0 +1,62 @@
+# Generated by Django 5.0.2 on 2024-03-04 10:36
+
+import django.db.models.deletion
+import django.utils.timezone
+from django.db import migrations, models
+
+import sentry.db.models.fields.foreignkey
+from sentry.new_migrations.migrations import CheckedMigration
+
+
+class Migration(CheckedMigration):
+    # This flag is used to mark that a migration shouldn't be automatically run in production. For
+    # the most part, this should only be used for operations where it's safe to run the migration
+    # after your code has deployed. So this should not be used for most operations that alter the
+    # schema of a table.
+    # Here are some things that make sense to mark as dangerous:
+    # - Large data migrations. Typically we want these to be run manually by ops so that they can
+    #   be monitored and not block the deploy for a long period of time while they run.
+    # - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
+    #   have ops run this and not block the deploy. Note that while adding an index is a schema
+    #   change, it's completely safe to run the operation after the code has deployed.
+    is_dangerous = False
+
+    dependencies = [
+        ("sentry", "0658_projectkey_usecase"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="artifactbundleindex",
+            name="date_last_modified",
+            field=models.DateTimeField(default=django.utils.timezone.now, null=True),
+        ),
+        migrations.AlterField(
+            model_name="artifactbundleindex",
+            name="dist_name",
+            field=models.CharField(default="", max_length=64, null=True),
+        ),
+        migrations.AlterField(
+            model_name="artifactbundleindex",
+            name="release_name",
+            field=models.CharField(max_length=250, null=True),
+        ),
+        migrations.AlterField(
+            model_name="flatfileindexstate",
+            name="artifact_bundle",
+            field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(
+                db_constraint=False,
+                on_delete=django.db.models.deletion.CASCADE,
+                to="sentry.artifactbundle",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="flatfileindexstate",
+            name="flat_file_index",
+            field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(
+                db_constraint=False,
+                on_delete=django.db.models.deletion.CASCADE,
+                to="sentry.artifactbundleflatfileindex",
+            ),
+        ),
+    ]

+ 5 - 5
src/sentry/models/artifactbundle.py

@@ -154,8 +154,8 @@ class ArtifactBundleFlatFileIndex(Model):
 class FlatFileIndexState(Model):
     __relocation_scope__ = RelocationScope.Excluded
 
-    flat_file_index = FlexibleForeignKey("sentry.ArtifactBundleFlatFileIndex")
-    artifact_bundle = FlexibleForeignKey("sentry.ArtifactBundle")
+    flat_file_index = FlexibleForeignKey("sentry.ArtifactBundleFlatFileIndex", db_constraint=False)
+    artifact_bundle = FlexibleForeignKey("sentry.ArtifactBundle", db_constraint=False)
     indexing_state = models.IntegerField(
         choices=ArtifactBundleIndexingState.choices(), db_index=True
     )
@@ -180,9 +180,9 @@ class ArtifactBundleIndex(Model):
     # TODO: legacy fields:
     # These will eventually be removed in a migration, as they can be joined
     # via the `{Release,}ArtifactBundle` tables.
-    release_name = models.CharField(max_length=250)
-    dist_name = models.CharField(max_length=64, default=NULL_STRING)
-    date_last_modified = models.DateTimeField(default=timezone.now)
+    release_name = models.CharField(max_length=250, null=True)
+    dist_name = models.CharField(max_length=64, null=True, default=NULL_STRING)
+    date_last_modified = models.DateTimeField(null=True, default=timezone.now)
 
     class Meta:
         app_label = "sentry"

+ 1 - 1
tests/sentry/debug_files/test_artifact_bundles.py

@@ -71,7 +71,7 @@ def get_indexed_files(project, release_name="", dist_name="", distinct=False):
         artifact_bundle__projectartifactbundle__project_id=project.id,
         artifact_bundle__releaseartifactbundle__release_name=release_name,
         artifact_bundle__releaseartifactbundle__dist_name=dist_name,
-    ).order_by("url", "-date_last_modified")
+    ).order_by("url", "-artifact_bundle__date_last_modified")
     if distinct:
         query = query.distinct("url")
     return list(query)