This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/main by this push:
     new 4f46a80  Make deleting releases more efficient for faster testing
4f46a80 is described below

commit 4f46a80b5559e9c269bdbb1782e67692e3b08656
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Jan 12 20:21:22 2026 +0000

    Make deleting releases more efficient for faster testing
---
 atr/models/sql.py                               |  4 +++-
 atr/storage/writers/release.py                  | 32 ++++++++++++++++---------
 migrations/versions/0036_2026.01.12_3831f215.py | 26 ++++++++++++++++++++
 3 files changed, 50 insertions(+), 12 deletions(-)

diff --git a/atr/models/sql.py b/atr/models/sql.py
index 8957123..32a56f2 100644
--- a/atr/models/sql.py
+++ b/atr/models/sql.py
@@ -883,7 +883,9 @@ class CheckResult(sqlmodel.SQLModel, table=True):
 
     # M-1: CheckResult -> Release
     # 1-M: Release -C-> [CheckResult]
-    release_name: str = sqlmodel.Field(foreign_key="release.name", 
ondelete="CASCADE", **example("example-0.0.1"))
+    release_name: str = sqlmodel.Field(
+        foreign_key="release.name", ondelete="CASCADE", index=True, 
**example("example-0.0.1")
+    )
     release: Release = sqlmodel.Relationship(back_populates="check_results")
 
     # We don't call this latest_revision_number, because it might not be the 
latest
diff --git a/atr/storage/writers/release.py b/atr/storage/writers/release.py
index c8c8c4a..b8531c6 100644
--- a/atr/storage/writers/release.py
+++ b/atr/storage/writers/release.py
@@ -116,18 +116,28 @@ class CommitteeParticipant(FoundationCommitter):
         ).demand(storage.AccessError(f"Release '{project_name} {version}' not 
found."))
         release_dir = util.release_directory_base(release)
 
-        # Delete from the database
+        # Delete from the database using bulk SQL DELETE for efficiency
         log.info(f"Deleting database records for release: {project_name} 
{version}")
-        # Cascade should handle this, but we delete manually anyway
-        tasks_to_delete = await 
self.__data.task(project_name=release.project.name, 
version_name=release.version).all()
-        for task in tasks_to_delete:
-            await self.__data.delete(task)
-        log.debug(f"Deleted {util.plural(len(tasks_to_delete), 'task')} for 
{project_name} {version}")
-
-        checks_to_delete = await 
self.__data.check_result(release_name=release.name).all()
-        for check in checks_to_delete:
-            await self.__data.delete(check)
-        log.debug(f"Deleted {util.plural(len(checks_to_delete), 'check 
result')} for {project_name} {version}")
+
+        # Bulk delete tasks
+        # These is no cascade, so we must delete explicitly
+        via = sql.validate_instrumented_attribute
+        task_delete_stmt = sqlmodel.delete(sql.Task).where(
+            via(sql.Task.project_name) == release.project.name,
+            via(sql.Task.version_name) == release.version,
+        )
+        task_result = await self.__data.execute(task_delete_stmt)
+        task_count = task_result.rowcount if isinstance(task_result, 
engine.CursorResult) else 0
+        log.debug(f"Deleted {util.plural(task_count, 'task')} for 
{project_name} {version}")
+
+        # Bulk delete check results
+        # Handled by cascade, but we do this explicitly anyway
+        check_delete_stmt = sqlmodel.delete(sql.CheckResult).where(
+            via(sql.CheckResult.release_name) == release.name,
+        )
+        check_result = await self.__data.execute(check_delete_stmt)
+        check_count = check_result.rowcount if isinstance(check_result, 
engine.CursorResult) else 0
+        log.debug(f"Deleted {util.plural(check_count, 'check result')} for 
{project_name} {version}")
 
         # TODO: Ensure that revisions are not deleted
         # But this makes testing difficult
diff --git a/migrations/versions/0036_2026.01.12_3831f215.py 
b/migrations/versions/0036_2026.01.12_3831f215.py
new file mode 100644
index 0000000..d878ac1
--- /dev/null
+++ b/migrations/versions/0036_2026.01.12_3831f215.py
@@ -0,0 +1,26 @@
+"""Add index on checkresult.release_name
+
+Revision ID: 0036_2026.01.12_3831f215
+Revises: 0035_2026.01.08_2bbfd636
+Create Date: 2026-01-12 20:13:19.789567+00:00
+"""
+
+from collections.abc import Sequence
+
+from alembic import op
+
+# Revision identifiers, used by Alembic
+revision: str = "0036_2026.01.12_3831f215"
+down_revision: str | None = "0035_2026.01.08_2bbfd636"
+branch_labels: str | Sequence[str] | None = None
+depends_on: str | Sequence[str] | None = None
+
+
+def upgrade() -> None:
+    with op.batch_alter_table("checkresult", schema=None) as batch_op:
+        batch_op.create_index(batch_op.f("ix_checkresult_release_name"), 
["release_name"], unique=False)
+
+
+def downgrade() -> None:
+    with op.batch_alter_table("checkresult", schema=None) as batch_op:
+        batch_op.drop_index(batch_op.f("ix_checkresult_release_name"))


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to