Publish curated ITWorx-ModelForge source from 990401737f96c8d46a9f7b0d84994516cadcb6a0
This commit is contained in:
1 parent
7082ab955a
commit
848f0d8f8a
434 files changed
+67298
-4315
No files matched your search
@@ -0,0 +1,198 @@
|
||||
"""PostgreSQL qualification for durable LAB cancellation versus worker completion."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
import importlib
|
||||
import threading
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from concurrent.futures import TimeoutError as FutureTimeoutError
|
||||
from datetime import UTC, datetime, timedelta
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import event, select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
pytest_plugins = ("tests.test_managed_identities_postgres",)
|
||||
|
||||
from modelforge_api.domain.lab import LabExecutionStartRequest
|
||||
from modelforge_api.domain.serving import AgentServingJobComplete
|
||||
from modelforge_api.persistence.models import GatewayRequest, LabExecutionRun, ServingJob
|
||||
from modelforge_api.services.lab_runs import LabRunService
|
||||
from modelforge_api.services.serving import ServingService
|
||||
from tests.test_dispatch_context import operator_fixture
|
||||
from tests.test_managed_identities_postgres import IdentityDatabase
|
||||
|
||||
|
||||
@pytest.mark.parametrize("first_writer", ["cancel", "complete"])
|
||||
def test_lab_cancel_and_worker_completion_linearize_on_job_then_run_locks(
|
||||
identity_database: IdentityDatabase, first_writer: str
|
||||
) -> None:
|
||||
"""Hold the winning transaction open and prove the other writer observes its result."""
|
||||
importlib.import_module("alembic.command").upgrade(identity_database.migration(), "head")
|
||||
engine = identity_database.runtime
|
||||
|
||||
with Session(engine) as session:
|
||||
serving, preflight, selected = operator_fixture(session)
|
||||
request = LabExecutionStartRequest(
|
||||
target=preflight.target,
|
||||
input=preflight.input,
|
||||
limits=preflight.limits,
|
||||
deployment_id=selected.capability_deployment_id,
|
||||
experiment_route_id=selected.id,
|
||||
)
|
||||
payload_store = serving.payload_store
|
||||
run = LabRunService(serving).start(
|
||||
request,
|
||||
actor_subject=f"postgres-lab-race-{first_writer}",
|
||||
idempotency_key=f"worker-completion-{first_writer}",
|
||||
)
|
||||
persisted_run = session.get(LabExecutionRun, run.id)
|
||||
assert persisted_run is not None
|
||||
gateway = session.get(GatewayRequest, persisted_run.gateway_request_id)
|
||||
assert gateway is not None
|
||||
token = f"lab-race-token-{first_writer}-" + "t" * 32
|
||||
now = datetime.now(UTC)
|
||||
job = ServingJob(
|
||||
capability_deployment_id=selected.capability_deployment_id,
|
||||
compute_node_id=selected.deployment.compute_node_id,
|
||||
gateway_request_id=gateway.id,
|
||||
lab_execution_run_id=persisted_run.id,
|
||||
operation="invoke",
|
||||
status="running",
|
||||
priority="lab",
|
||||
idempotency_key=f"worker-job-{first_writer}",
|
||||
payload_reference=persisted_run.payload_reference,
|
||||
attempt_count=1,
|
||||
lease_token_hash=hashlib.sha256(token.encode()).hexdigest(),
|
||||
lease_expires_at=now + timedelta(minutes=2),
|
||||
result_summary={},
|
||||
started_at=now,
|
||||
)
|
||||
persisted_run.status = "running"
|
||||
persisted_run.started_at = now
|
||||
persisted_run.heartbeat_at = now
|
||||
gateway.status = "running"
|
||||
session.add(job)
|
||||
session.commit()
|
||||
|
||||
run_id = run.id
|
||||
job_id = job.id
|
||||
deployment_id = selected.capability_deployment_id
|
||||
node_id = selected.deployment.compute_node_id
|
||||
embedding_space = selected.deployment.embedding_space
|
||||
assert embedding_space is not None
|
||||
dimension = embedding_space.dimension
|
||||
deployment_settings = serving._deployment_settings
|
||||
manifests = serving.manifests
|
||||
|
||||
actor_subject = f"postgres-lab-race-{first_writer}"
|
||||
first_writer_has_locks = threading.Event()
|
||||
allow_first_writer_to_commit = threading.Event()
|
||||
second_writer_requested_job_lock = threading.Event()
|
||||
|
||||
def make_serving(session: Session) -> ServingService:
|
||||
return ServingService(session, deployment_settings, manifests, payload_store)
|
||||
|
||||
def complete(service: ServingService) -> str:
|
||||
deployment = service.repo.deployment(deployment_id)
|
||||
node = service.repo.node(node_id)
|
||||
assert deployment is not None and node is not None
|
||||
vector = [1.0] + [0.0] * (dimension - 1)
|
||||
service.complete_job(
|
||||
job_id,
|
||||
node,
|
||||
AgentServingJobComplete(
|
||||
lease_token=token,
|
||||
worker_instance_id="postgres-race-worker",
|
||||
state="warm",
|
||||
result={"vectors": [vector], "count": 1, "normalized": True},
|
||||
metrics={"inference_time_ms": 8.0},
|
||||
health={},
|
||||
runtime_facts={},
|
||||
),
|
||||
)
|
||||
return "completed"
|
||||
|
||||
def write(kind: str, *, hold_commit: bool) -> str:
|
||||
with Session(engine) as session:
|
||||
service = make_serving(session)
|
||||
original_commit = session.commit
|
||||
|
||||
def commit_after_gate() -> None:
|
||||
if hold_commit:
|
||||
first_writer_has_locks.set()
|
||||
if not allow_first_writer_to_commit.wait(timeout=20):
|
||||
raise RuntimeError("timed out holding the first LAB writer locks")
|
||||
original_commit()
|
||||
|
||||
session.commit = commit_after_gate # type: ignore[method-assign]
|
||||
if kind == "cancel":
|
||||
return LabRunService(service).cancel(
|
||||
run_id, actor_subject=actor_subject
|
||||
).status
|
||||
return complete(service)
|
||||
|
||||
@event.listens_for(engine, "before_cursor_execute")
|
||||
def observe_second_job_lock(
|
||||
_connection: object,
|
||||
_cursor: object,
|
||||
statement: str,
|
||||
_parameters: object,
|
||||
_context: object,
|
||||
_executemany: bool,
|
||||
) -> None:
|
||||
normalized = statement.lower()
|
||||
if (
|
||||
threading.current_thread().name.startswith("lab-race-second")
|
||||
and "serving_jobs" in normalized
|
||||
and "for update" in normalized
|
||||
):
|
||||
second_writer_requested_job_lock.set()
|
||||
|
||||
second_writer = "complete" if first_writer == "cancel" else "cancel"
|
||||
try:
|
||||
with ThreadPoolExecutor(max_workers=1, thread_name_prefix="lab-race-first") as first_pool:
|
||||
first_future = first_pool.submit(write, first_writer, hold_commit=True)
|
||||
if not first_writer_has_locks.wait(timeout=10):
|
||||
first_future.result(timeout=1)
|
||||
pytest.fail("first writer never reached commit")
|
||||
with ThreadPoolExecutor(
|
||||
max_workers=1, thread_name_prefix="lab-race-second"
|
||||
) as second_pool:
|
||||
second_future = second_pool.submit(write, second_writer, hold_commit=False)
|
||||
if not second_writer_requested_job_lock.wait(timeout=10):
|
||||
second_future.result(timeout=1)
|
||||
pytest.fail("second writer never requested the serving-job lock")
|
||||
with pytest.raises(FutureTimeoutError):
|
||||
second_future.result(timeout=0.25)
|
||||
allow_first_writer_to_commit.set()
|
||||
first_future.result(timeout=30)
|
||||
second_future.result(timeout=30)
|
||||
finally:
|
||||
allow_first_writer_to_commit.set()
|
||||
event.remove(engine, "before_cursor_execute", observe_second_job_lock)
|
||||
|
||||
expected_status = "cancelled" if first_writer == "cancel" else "completed"
|
||||
with Session(engine) as session:
|
||||
persisted_run = session.get(LabExecutionRun, run_id)
|
||||
persisted_job = session.get(ServingJob, job_id)
|
||||
gateway = session.scalar(
|
||||
select(GatewayRequest).where(GatewayRequest.id == persisted_run.gateway_request_id)
|
||||
) if persisted_run else None
|
||||
assert persisted_run is not None and persisted_job is not None and gateway is not None
|
||||
assert persisted_run.status == expected_status
|
||||
assert persisted_job.status == expected_status
|
||||
assert gateway.status == expected_status
|
||||
assert persisted_job.lease_token_hash is None
|
||||
if first_writer == "cancel":
|
||||
assert persisted_run.cancellation_requested_at is not None
|
||||
assert persisted_run.cancellation_acknowledged_at is not None
|
||||
assert persisted_run.output_metadata is None
|
||||
assert persisted_job.result_reference is None
|
||||
assert persisted_job.result_summary["cancelled"] is True
|
||||
else:
|
||||
assert persisted_run.cancellation_requested_at is None
|
||||
assert persisted_run.cancellation_acknowledged_at is None
|
||||
assert persisted_run.output_metadata is not None
|
||||
assert persisted_job.result_reference is None
|
||||
Reference in new issue
Block a user