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
commit 36f60e6aa926ed88acb3e01db7dd7e6f25030d03 Author: Sean B. Palmer <[email protected]> AuthorDate: Mon Jan 12 20:32:26 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]
