Skip to content

Commit 36f60e6

Browse files
committed
Make deleting releases more efficient for faster testing
1 parent d123633 commit 36f60e6

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

atr/models/sql.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,9 @@ class CheckResult(sqlmodel.SQLModel, table=True):
883883

884884
# M-1: CheckResult -> Release
885885
# 1-M: Release -C-> [CheckResult]
886-
release_name: str = sqlmodel.Field(foreign_key="release.name", ondelete="CASCADE", **example("example-0.0.1"))
886+
release_name: str = sqlmodel.Field(
887+
foreign_key="release.name", ondelete="CASCADE", index=True, **example("example-0.0.1")
888+
)
887889
release: Release = sqlmodel.Relationship(back_populates="check_results")
888890

889891
# We don't call this latest_revision_number, because it might not be the latest

atr/storage/writers/release.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,18 +116,28 @@ async def delete(
116116
).demand(storage.AccessError(f"Release '{project_name} {version}' not found."))
117117
release_dir = util.release_directory_base(release)
118118

119-
# Delete from the database
119+
# Delete from the database using bulk SQL DELETE for efficiency
120120
log.info(f"Deleting database records for release: {project_name} {version}")
121-
# Cascade should handle this, but we delete manually anyway
122-
tasks_to_delete = await self.__data.task(project_name=release.project.name, version_name=release.version).all()
123-
for task in tasks_to_delete:
124-
await self.__data.delete(task)
125-
log.debug(f"Deleted {util.plural(len(tasks_to_delete), 'task')} for {project_name} {version}")
126-
127-
checks_to_delete = await self.__data.check_result(release_name=release.name).all()
128-
for check in checks_to_delete:
129-
await self.__data.delete(check)
130-
log.debug(f"Deleted {util.plural(len(checks_to_delete), 'check result')} for {project_name} {version}")
121+
122+
# Bulk delete tasks
123+
# These is no cascade, so we must delete explicitly
124+
via = sql.validate_instrumented_attribute
125+
task_delete_stmt = sqlmodel.delete(sql.Task).where(
126+
via(sql.Task.project_name) == release.project.name,
127+
via(sql.Task.version_name) == release.version,
128+
)
129+
task_result = await self.__data.execute(task_delete_stmt)
130+
task_count = task_result.rowcount if isinstance(task_result, engine.CursorResult) else 0
131+
log.debug(f"Deleted {util.plural(task_count, 'task')} for {project_name} {version}")
132+
133+
# Bulk delete check results
134+
# Handled by cascade, but we do this explicitly anyway
135+
check_delete_stmt = sqlmodel.delete(sql.CheckResult).where(
136+
via(sql.CheckResult.release_name) == release.name,
137+
)
138+
check_result = await self.__data.execute(check_delete_stmt)
139+
check_count = check_result.rowcount if isinstance(check_result, engine.CursorResult) else 0
140+
log.debug(f"Deleted {util.plural(check_count, 'check result')} for {project_name} {version}")
131141

132142
# TODO: Ensure that revisions are not deleted
133143
# But this makes testing difficult
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Add index on checkresult.release_name
2+
3+
Revision ID: 0036_2026.01.12_3831f215
4+
Revises: 0035_2026.01.08_2bbfd636
5+
Create Date: 2026-01-12 20:13:19.789567+00:00
6+
"""
7+
8+
from collections.abc import Sequence
9+
10+
from alembic import op
11+
12+
# Revision identifiers, used by Alembic
13+
revision: str = "0036_2026.01.12_3831f215"
14+
down_revision: str | None = "0035_2026.01.08_2bbfd636"
15+
branch_labels: str | Sequence[str] | None = None
16+
depends_on: str | Sequence[str] | None = None
17+
18+
19+
def upgrade() -> None:
20+
with op.batch_alter_table("checkresult", schema=None) as batch_op:
21+
batch_op.create_index(batch_op.f("ix_checkresult_release_name"), ["release_name"], unique=False)
22+
23+
24+
def downgrade() -> None:
25+
with op.batch_alter_table("checkresult", schema=None) as batch_op:
26+
batch_op.drop_index(batch_op.f("ix_checkresult_release_name"))

0 commit comments

Comments
 (0)