Merge branch 'master' into feature/q0-min-coverage
CI / lint (pull_request) Successful in 13s
CI / typecheck (pull_request) Successful in 28s
CI / quality (pull_request) Successful in 16s
CI / security (pull_request) Successful in 29s
CI / integration_tests (pull_request) Successful in 5m22s
CI / build (pull_request) Successful in 16s
CI / unit_tests (pull_request) Successful in 15m25s
CI / coverage (pull_request) Successful in 8m26s
CI / docker (pull_request) Successful in 40s
CI / lint (pull_request) Successful in 13s
CI / typecheck (pull_request) Successful in 28s
CI / quality (pull_request) Successful in 16s
CI / security (pull_request) Successful in 29s
CI / integration_tests (pull_request) Successful in 5m22s
CI / build (pull_request) Successful in 16s
CI / unit_tests (pull_request) Successful in 15m25s
CI / coverage (pull_request) Successful in 8m26s
CI / docker (pull_request) Successful in 40s
# Conflicts: # benchmarks/cli_format_bench.py # benchmarks/plan_phase_migration_bench.py # benchmarks/project_migration_bench.py # benchmarks/resource_registry_migration_bench.py # benchmarks/uow_lifecycle_bench.py
This commit is contained in:
@@ -10,6 +10,7 @@ Measures:
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import threading
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from sqlalchemy import create_engine, event, text
|
||||
@@ -23,6 +24,18 @@ from cleveragents.infrastructure.database.models import (
|
||||
ResourceTypeModel,
|
||||
)
|
||||
|
||||
# Thread-safe counter so repeated ASV iterations never collide on names/IDs.
|
||||
_iter_lock = threading.Lock()
|
||||
_iter_counter = 0
|
||||
|
||||
|
||||
def _next_iter() -> int:
|
||||
"""Return a monotonically increasing iteration number."""
|
||||
global _iter_counter
|
||||
with _iter_lock:
|
||||
_iter_counter += 1
|
||||
return _iter_counter
|
||||
|
||||
|
||||
def _now_iso() -> str:
|
||||
return datetime.now(tz=UTC).isoformat()
|
||||
@@ -42,8 +55,6 @@ class ProjectInsert:
|
||||
"""Benchmark inserting project records."""
|
||||
|
||||
def setup(self) -> None:
|
||||
self._single_ctr = 0
|
||||
self._batch_ctr = 0
|
||||
self.engine = create_engine("sqlite:///:memory:")
|
||||
event.listen(self.engine, "connect", _set_sqlite_pragma)
|
||||
with self.engine.connect() as conn:
|
||||
@@ -56,10 +67,10 @@ class ProjectInsert:
|
||||
self.engine.dispose()
|
||||
|
||||
def time_insert_single_project(self) -> None:
|
||||
self._single_ctr += 1
|
||||
it = _next_iter()
|
||||
session = self.session_factory()
|
||||
proj = NamespacedProjectModel(
|
||||
namespaced_name=f"bench/single-project-{self._single_ctr}",
|
||||
namespaced_name=f"bench/single-project-{it}",
|
||||
namespace="bench",
|
||||
tags_json="[]",
|
||||
created_at=_now_iso(),
|
||||
@@ -70,16 +81,14 @@ class ProjectInsert:
|
||||
session.close()
|
||||
|
||||
def time_insert_100_projects(self) -> None:
|
||||
offset = self._batch_ctr * 100
|
||||
self._batch_ctr += 1
|
||||
it = _next_iter()
|
||||
session = self.session_factory()
|
||||
for i in range(100):
|
||||
uid = offset + i
|
||||
proj = NamespacedProjectModel(
|
||||
namespaced_name=f"bench/project-{uid}",
|
||||
namespaced_name=f"bench/project-{it}-{i}",
|
||||
namespace="bench",
|
||||
description=f"Project {uid}",
|
||||
tags_json=json.dumps([f"tag-{uid}"]),
|
||||
description=f"Project {it}-{i}",
|
||||
tags_json=json.dumps([f"tag-{it}-{i}"]),
|
||||
created_at=_now_iso(),
|
||||
updated_at=_now_iso(),
|
||||
)
|
||||
@@ -92,7 +101,6 @@ class ProjectLinkInsert:
|
||||
"""Benchmark inserting project resource link records."""
|
||||
|
||||
def setup(self) -> None:
|
||||
self._batch_ctr = 0
|
||||
self.engine = create_engine("sqlite:///:memory:")
|
||||
event.listen(self.engine, "connect", _set_sqlite_pragma)
|
||||
with self.engine.connect() as conn:
|
||||
@@ -112,18 +120,8 @@ class ProjectLinkInsert:
|
||||
rt.updated_at = _now_iso()
|
||||
session.add(rt)
|
||||
|
||||
# Create project
|
||||
proj = NamespacedProjectModel(
|
||||
namespaced_name="bench/link-project",
|
||||
namespace="bench",
|
||||
tags_json="[]",
|
||||
created_at=_now_iso(),
|
||||
updated_at=_now_iso(),
|
||||
)
|
||||
session.add(proj)
|
||||
|
||||
# Create resources (large pool so repeated iterations can use unique ones)
|
||||
for i in range(5000):
|
||||
# Create resources (shared pool for link targets)
|
||||
for i in range(50):
|
||||
r = ResourceModel()
|
||||
r.resource_id = _make_ulid(i)
|
||||
r.type_name = "bench/git-checkout"
|
||||
@@ -139,15 +137,26 @@ class ProjectLinkInsert:
|
||||
self.engine.dispose()
|
||||
|
||||
def time_insert_50_links(self) -> None:
|
||||
offset = self._batch_ctr * 50
|
||||
self._batch_ctr += 1
|
||||
it = _next_iter()
|
||||
base = it * 10000
|
||||
session = self.session_factory()
|
||||
# Create a unique project per iteration so the composite UNIQUE
|
||||
# constraint (project_name, resource_id) never collides.
|
||||
proj_name = f"bench/link-project-{it}"
|
||||
proj = NamespacedProjectModel(
|
||||
namespaced_name=proj_name,
|
||||
namespace="bench",
|
||||
tags_json="[]",
|
||||
created_at=_now_iso(),
|
||||
updated_at=_now_iso(),
|
||||
)
|
||||
session.add(proj)
|
||||
session.flush()
|
||||
for i in range(50):
|
||||
uid = offset + i
|
||||
link = ProjectResourceLinkModel(
|
||||
link_id=_make_ulid(10_000 + uid),
|
||||
project_name="bench/link-project",
|
||||
resource_id=_make_ulid(uid),
|
||||
link_id=_make_ulid(base + i),
|
||||
project_name=proj_name,
|
||||
resource_id=_make_ulid(i),
|
||||
read_only=i % 2 == 0,
|
||||
created_at=_now_iso(),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user