diff --git a/api/CHANGELOG.md b/api/CHANGELOG.md index a2103d8a21..6d9ac36263 100644 --- a/api/CHANGELOG.md +++ b/api/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to the **Prowler API** are documented in this file. -## [1.27.1] (Prowler v5.26.1) +## [1.28.0] (Prowler UNRELEASED) ### 🚀 Added @@ -12,6 +12,10 @@ All notable changes to the **Prowler API** are documented in this file. - Remove orphaned `gin_resources_search_idx` declaration from `Resource.Meta.indexes` (DB index dropped in `0072_drop_unused_indexes`) [(#11001)](https://github.com/prowler-cloud/prowler/pull/11001) +--- + +## [1.27.1] (Prowler v5.26.1) + ### 🐞 Fixed - `POST /api/v1/scans` was intermittently failing with `Scan matching query does not exist` in the `scan-perform` worker; the Celery task is now published via `transaction.on_commit` so the worker cannot read the Scan before the dispatch-wide transaction commits [(#11122)](https://github.com/prowler-cloud/prowler/pull/11122) diff --git a/api/src/backend/api/migrations/0092_findings_arrays_gin_index_parent.py b/api/src/backend/api/migrations/0092_findings_arrays_gin_index_parent.py index b8baf448d6..fe49ae6f10 100644 --- a/api/src/backend/api/migrations/0092_findings_arrays_gin_index_parent.py +++ b/api/src/backend/api/migrations/0092_findings_arrays_gin_index_parent.py @@ -7,8 +7,10 @@ PARENT_TABLE = "findings" def create_parent_and_attach(apps, schema_editor): with schema_editor.connection.cursor() as cursor: + # Idempotent: the parent index may already exist if it was created + # manually on an environment before this migration ran. cursor.execute( - f"CREATE INDEX {INDEX_NAME} ON ONLY {PARENT_TABLE} " + f"CREATE INDEX IF NOT EXISTS {INDEX_NAME} ON ONLY {PARENT_TABLE} " f"USING gin (categories, resource_services, resource_regions, resource_types)" ) cursor.execute( @@ -19,7 +21,20 @@ def create_parent_and_attach(apps, schema_editor): ) for (partition,) in cursor.fetchall(): child_idx = f"{partition.replace('.', '_')}_{INDEX_NAME}" - cursor.execute(f"ALTER INDEX {INDEX_NAME} ATTACH PARTITION {child_idx}") + # ALTER INDEX ... ATTACH PARTITION has no IF NOT ATTACHED clause, + # so check pg_inherits first to keep the migration re-runnable. + cursor.execute( + """ + SELECT 1 + FROM pg_inherits i + JOIN pg_class p ON p.oid = i.inhparent + JOIN pg_class c ON c.oid = i.inhrelid + WHERE p.relname = %s AND c.relname = %s + """, + [INDEX_NAME, child_idx], + ) + if cursor.fetchone() is None: + cursor.execute(f"ALTER INDEX {INDEX_NAME} ATTACH PARTITION {child_idx}") def drop_parent_index(apps, schema_editor):