prefect-client 3.7.1.dev7__tar.gz → 3.7.1.dev9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/PKG-INFO +1 -1
- prefect_client-3.7.1.dev9/src/prefect/_build_info.py +5 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/AGENTS.md +2 -2
- prefect_client-3.7.1.dev9/src/prefect/concurrency/_leases.py +230 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/AGENTS.md +2 -0
- prefect_client-3.7.1.dev9/src/prefect/workers/_cleanup_handlers.py +142 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/base.py +83 -72
- prefect_client-3.7.1.dev7/src/prefect/_build_info.py +0 -5
- prefect_client-3.7.1.dev7/src/prefect/concurrency/_leases.py +0 -190
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/.gitignore +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/LICENSE +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/README.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/hatch_build.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/pyproject.toml +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/__main__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/agent.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/automations.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/base.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/context.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/engine.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/related.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/flows.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/futures.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/main.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/plugins.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/py.typed +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/results.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/schedules.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/serializers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/states.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/tasks.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/transactions.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/types/names.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/variables.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.7.1.dev7 → prefect_client-3.7.1.dev9}/src/prefect/workers/utilities.py +0 -0
|
@@ -18,7 +18,7 @@ Does NOT define concurrency limits (server-side in `server/`). Does NOT handle t
|
|
|
18
18
|
|
|
19
19
|
**`raise_on_lease_renewal_failure` (public parameter):** Controls lease renewal failure behavior independently from `strict`. When `None` (default), falls back to the value of `strict` for backward compatibility. Set to `False` to let long-running tasks continue even if a transient renewal error occurs; set to `True` to terminate immediately on renewal failure regardless of `strict`. This means `strict=True, raise_on_lease_renewal_failure=False` gives strict slot acquisition but non-fatal renewal failures, and vice versa.
|
|
20
20
|
|
|
21
|
-
**Lease renewal:** `_leases.py`
|
|
21
|
+
**Lease renewal:** `_leases.py` starts a daemon thread that renews immediately on entry, then waits for 75% of `lease_duration` between renewals. The renewal thread uses the standard `get_client(sync_client=True)` path and retries each renewal up to 3 times with exponential backoff. If all attempts fail, a shared failure handler either cancels execution with the existing sync/async cancel scope or logs a warning, depending on `raise_on_lease_renewal_failure`.
|
|
22
22
|
|
|
23
23
|
**Sync/async lockstep invariant:** `asyncio.py`/`sync.py` and `_asyncio.py`/`_sync.py` are parallel implementations. Any behavior change to one must be mirrored in the other.
|
|
24
24
|
|
|
@@ -39,6 +39,6 @@ Layered — public → internal → services, with leases and events as cross-cu
|
|
|
39
39
|
## Pitfalls
|
|
40
40
|
|
|
41
41
|
- **Service singleton is keyed on `frozenset(names)`.** Passing the same names in different order reuses the same singleton; passing a strict subset creates a different singleton. Each unique name-set gets its own queue.
|
|
42
|
-
- **Lease renewal runs on the
|
|
42
|
+
- **Lease renewal runs on a daemon thread.** The thread copies the caller's context variables for settings and logging context, then uses the standard `get_client(sync_client=True)` path instead of lease-specific async-client cloning. Sync callers join the thread briefly on exit; async callers only signal the thread to stop so the event loop is not blocked.
|
|
43
43
|
- **Cancellation during acquire or release** — if a `CancelledError` is raised either during slot acquisition or during `release_concurrency_slots_with_lease` in the `finally` block, the lease ID is appended to `ConcurrencyContext.cleanup_lease_ids`. `ConcurrencyContext.__exit__` releases them via a sync client. If `ConcurrencyContext` is not active, those leases are abandoned until server-side expiry.
|
|
44
44
|
- **`v1/` subdirectory** contains the legacy slot API (no lease model). New code should use the top-level `concurrency()` / `rate_limit()` APIs.
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import contextvars
|
|
2
|
+
import threading
|
|
3
|
+
from contextlib import asynccontextmanager, contextmanager
|
|
4
|
+
from typing import TYPE_CHECKING, AsyncGenerator, Generator
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from prefect._internal.concurrency.cancellation import (
|
|
8
|
+
AsyncCancelScope,
|
|
9
|
+
WatcherThreadCancelScope,
|
|
10
|
+
)
|
|
11
|
+
from prefect._internal.retries import exponential_backoff_with_jitter
|
|
12
|
+
from prefect.client.orchestration import get_client
|
|
13
|
+
from prefect.logging.loggers import get_logger, get_run_logger
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from prefect.client.orchestration import SyncPrefectClient
|
|
17
|
+
|
|
18
|
+
_RENEWAL_FRACTION = 0.75
|
|
19
|
+
_RENEWAL_MAX_ATTEMPTS = 3
|
|
20
|
+
_RENEWAL_RETRY_BASE_DELAY = 1
|
|
21
|
+
_RENEWAL_RETRY_MAX_DELAY = 10
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _renew_concurrency_lease_with_retries(
|
|
25
|
+
client: "SyncPrefectClient",
|
|
26
|
+
lease_id: UUID,
|
|
27
|
+
lease_duration: float,
|
|
28
|
+
stop_event: threading.Event,
|
|
29
|
+
) -> bool:
|
|
30
|
+
"""
|
|
31
|
+
Renew a concurrency lease, retrying transient failures.
|
|
32
|
+
|
|
33
|
+
Returns `False` when shutdown is requested during retry backoff.
|
|
34
|
+
"""
|
|
35
|
+
logger = get_logger("concurrency")
|
|
36
|
+
|
|
37
|
+
for attempt in range(_RENEWAL_MAX_ATTEMPTS):
|
|
38
|
+
try:
|
|
39
|
+
client.renew_concurrency_lease(
|
|
40
|
+
lease_id=lease_id, lease_duration=lease_duration
|
|
41
|
+
)
|
|
42
|
+
return True
|
|
43
|
+
except Exception as exc:
|
|
44
|
+
if attempt == _RENEWAL_MAX_ATTEMPTS - 1:
|
|
45
|
+
logger.exception(
|
|
46
|
+
"Function 'concurrency lease renewal' failed after %s attempts",
|
|
47
|
+
_RENEWAL_MAX_ATTEMPTS,
|
|
48
|
+
)
|
|
49
|
+
raise
|
|
50
|
+
|
|
51
|
+
delay = exponential_backoff_with_jitter(
|
|
52
|
+
attempt,
|
|
53
|
+
_RENEWAL_RETRY_BASE_DELAY,
|
|
54
|
+
_RENEWAL_RETRY_MAX_DELAY,
|
|
55
|
+
)
|
|
56
|
+
logger.warning(
|
|
57
|
+
"Attempt %s of function 'concurrency lease renewal' failed with "
|
|
58
|
+
"%s: %s. Retrying in %.2f seconds...",
|
|
59
|
+
attempt + 1,
|
|
60
|
+
type(exc).__name__,
|
|
61
|
+
exc,
|
|
62
|
+
delay,
|
|
63
|
+
)
|
|
64
|
+
if stop_event.wait(delay):
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _lease_renewal_loop(
|
|
71
|
+
lease_id: UUID,
|
|
72
|
+
lease_duration: float,
|
|
73
|
+
stop_event: threading.Event,
|
|
74
|
+
) -> None:
|
|
75
|
+
"""
|
|
76
|
+
Maintain a concurrency lease until stopped.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
lease_id: The ID of the lease to maintain.
|
|
80
|
+
lease_duration: The duration of the lease in seconds.
|
|
81
|
+
stop_event: Event set by the owning context manager on exit.
|
|
82
|
+
"""
|
|
83
|
+
with get_client(sync_client=True) as client:
|
|
84
|
+
while not stop_event.is_set():
|
|
85
|
+
renewed = _renew_concurrency_lease_with_retries(
|
|
86
|
+
client, lease_id, lease_duration, stop_event
|
|
87
|
+
)
|
|
88
|
+
if not renewed:
|
|
89
|
+
return
|
|
90
|
+
stop_event.wait(lease_duration * _RENEWAL_FRACTION)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _handle_lease_renewal_failure(
|
|
94
|
+
exc: BaseException,
|
|
95
|
+
lease_id: UUID,
|
|
96
|
+
raise_on_lease_renewal_failure: bool,
|
|
97
|
+
suppress_warnings: bool,
|
|
98
|
+
cancel_scope: AsyncCancelScope | WatcherThreadCancelScope,
|
|
99
|
+
) -> None:
|
|
100
|
+
try:
|
|
101
|
+
# Use a run logger if available
|
|
102
|
+
logger = get_run_logger()
|
|
103
|
+
except Exception:
|
|
104
|
+
logger = get_logger("concurrency")
|
|
105
|
+
|
|
106
|
+
if raise_on_lease_renewal_failure:
|
|
107
|
+
logger.error(
|
|
108
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
109
|
+
"Terminating execution to prevent over-allocation. "
|
|
110
|
+
"Lease ID: %s, exception: %s",
|
|
111
|
+
lease_id,
|
|
112
|
+
exc,
|
|
113
|
+
exc_info=(type(exc), exc, exc.__traceback__),
|
|
114
|
+
)
|
|
115
|
+
cancel_scope.cancel()
|
|
116
|
+
elif suppress_warnings:
|
|
117
|
+
logger.debug(
|
|
118
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
119
|
+
"Execution will continue, but concurrency limits may be exceeded. "
|
|
120
|
+
"Lease ID: %s, exception: %s",
|
|
121
|
+
lease_id,
|
|
122
|
+
exc,
|
|
123
|
+
exc_info=(type(exc), exc, exc.__traceback__),
|
|
124
|
+
)
|
|
125
|
+
else:
|
|
126
|
+
logger.warning(
|
|
127
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
128
|
+
"Execution will continue, but concurrency limits may be exceeded. "
|
|
129
|
+
"Lease ID: %s, exception: %s",
|
|
130
|
+
lease_id,
|
|
131
|
+
exc,
|
|
132
|
+
exc_info=(type(exc), exc, exc.__traceback__),
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _start_lease_renewal_thread(
|
|
137
|
+
lease_id: UUID,
|
|
138
|
+
lease_duration: float,
|
|
139
|
+
raise_on_lease_renewal_failure: bool,
|
|
140
|
+
suppress_warnings: bool,
|
|
141
|
+
cancel_scope: AsyncCancelScope | WatcherThreadCancelScope,
|
|
142
|
+
) -> tuple[threading.Event, threading.Thread]:
|
|
143
|
+
stop_event = threading.Event()
|
|
144
|
+
renewal_ctx = contextvars.copy_context()
|
|
145
|
+
|
|
146
|
+
def renewal_loop() -> None:
|
|
147
|
+
try:
|
|
148
|
+
renewal_ctx.run(_lease_renewal_loop, lease_id, lease_duration, stop_event)
|
|
149
|
+
except Exception as exc:
|
|
150
|
+
if not stop_event.is_set():
|
|
151
|
+
_handle_lease_renewal_failure(
|
|
152
|
+
exc,
|
|
153
|
+
lease_id,
|
|
154
|
+
raise_on_lease_renewal_failure,
|
|
155
|
+
suppress_warnings,
|
|
156
|
+
cancel_scope,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
thread = threading.Thread(
|
|
160
|
+
target=renewal_loop,
|
|
161
|
+
daemon=True,
|
|
162
|
+
name=f"concurrency-lease-renewal-{lease_id}",
|
|
163
|
+
)
|
|
164
|
+
thread.start()
|
|
165
|
+
return stop_event, thread
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@contextmanager
|
|
169
|
+
def maintain_concurrency_lease(
|
|
170
|
+
lease_id: UUID,
|
|
171
|
+
lease_duration: float,
|
|
172
|
+
raise_on_lease_renewal_failure: bool = False,
|
|
173
|
+
suppress_warnings: bool = False,
|
|
174
|
+
) -> Generator[None, None, None]:
|
|
175
|
+
"""
|
|
176
|
+
Maintain a concurrency lease for the given lease ID.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
lease_id: The ID of the lease to maintain.
|
|
180
|
+
lease_duration: The duration of the lease in seconds.
|
|
181
|
+
raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
|
|
182
|
+
"""
|
|
183
|
+
with WatcherThreadCancelScope() as cancel_scope:
|
|
184
|
+
stop_event: threading.Event | None = None
|
|
185
|
+
thread: threading.Thread | None = None
|
|
186
|
+
try:
|
|
187
|
+
stop_event, thread = _start_lease_renewal_thread(
|
|
188
|
+
lease_id,
|
|
189
|
+
lease_duration,
|
|
190
|
+
raise_on_lease_renewal_failure,
|
|
191
|
+
suppress_warnings,
|
|
192
|
+
cancel_scope,
|
|
193
|
+
)
|
|
194
|
+
yield
|
|
195
|
+
finally:
|
|
196
|
+
if stop_event is not None:
|
|
197
|
+
stop_event.set()
|
|
198
|
+
if thread is not None:
|
|
199
|
+
thread.join(timeout=2)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@asynccontextmanager
|
|
203
|
+
async def amaintain_concurrency_lease(
|
|
204
|
+
lease_id: UUID,
|
|
205
|
+
lease_duration: float,
|
|
206
|
+
raise_on_lease_renewal_failure: bool = False,
|
|
207
|
+
suppress_warnings: bool = False,
|
|
208
|
+
) -> AsyncGenerator[None, None]:
|
|
209
|
+
"""
|
|
210
|
+
Maintain a concurrency lease for the given lease ID.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
lease_id: The ID of the lease to maintain.
|
|
214
|
+
lease_duration: The duration of the lease in seconds.
|
|
215
|
+
raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
|
|
216
|
+
"""
|
|
217
|
+
with AsyncCancelScope() as cancel_scope:
|
|
218
|
+
stop_event: threading.Event | None = None
|
|
219
|
+
try:
|
|
220
|
+
stop_event, _ = _start_lease_renewal_thread(
|
|
221
|
+
lease_id,
|
|
222
|
+
lease_duration,
|
|
223
|
+
raise_on_lease_renewal_failure,
|
|
224
|
+
suppress_warnings,
|
|
225
|
+
cancel_scope,
|
|
226
|
+
)
|
|
227
|
+
yield
|
|
228
|
+
finally:
|
|
229
|
+
if stop_event is not None:
|
|
230
|
+
stop_event.set()
|
|
@@ -7,6 +7,8 @@ Client-side event system for emitting, subscribing to, and defining automations
|
|
|
7
7
|
- **Both client and server define their own event schemas.** The client-side schemas live in `schemas/` here; the server has its own parallel definitions in `server/events/schemas/`. They are structurally similar but independently maintained — the server does not import schemas from this module.
|
|
8
8
|
- Events follow the CloudEvents-inspired schema: `Event` with `Resource` and `RelatedResource`.
|
|
9
9
|
- Automations combine triggers (event, metric, compound, sequence) with actions.
|
|
10
|
+
- **Metric triggers are Cloud-only.** OSS's `ServerTriggerTypes` excludes `MetricTrigger`, so `POST /automations` returns 422. For "alert if a flow takes too long" on OSS, use a proactive `EventTrigger` (`after={prefect.flow-run.Running}`, terminal states in `expect`, SLO in `within`).
|
|
11
|
+
- **Event name prefixes differ by backend.** OSS emits `prefect.*`; Cloud emits `prefect-cloud.*` for automation/action lifecycle events (e.g., `prefect-cloud.automation.triggered`). Cross-backend tooling that filters events must match both.
|
|
10
12
|
- `DeploymentTriggerTypes` are the subset of triggers usable in `prefect.yaml` deployment definitions.
|
|
11
13
|
|
|
12
14
|
## clients.py — Checkpointing Invariant
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import copy
|
|
4
|
+
from functools import lru_cache
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from prefect.client.schemas.worker_channel import (
|
|
9
|
+
CANCELLING_TIMEOUT_TEARDOWN,
|
|
10
|
+
CancellingTimeoutCleanupMessagePayload,
|
|
11
|
+
CleanupMessagePayload,
|
|
12
|
+
)
|
|
13
|
+
from prefect.exceptions import (
|
|
14
|
+
InfrastructureNotAvailable,
|
|
15
|
+
InfrastructureNotFound,
|
|
16
|
+
ObjectNotFound,
|
|
17
|
+
)
|
|
18
|
+
from prefect.workers._cleanup import (
|
|
19
|
+
CleanupExecutionResult,
|
|
20
|
+
WorkerCleanupHandlerRegistry,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from prefect.client.schemas.objects import FlowRun
|
|
25
|
+
from prefect.workers.base import BaseWorker
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CancellingTimeoutTeardownHandler:
|
|
29
|
+
"""Idempotent infrastructure teardown for `cancelling_timeout_teardown.v1`.
|
|
30
|
+
|
|
31
|
+
The cleanup message is enqueued after the server has already committed
|
|
32
|
+
the CANCELLING-timeout state outcome. Boundary contract:
|
|
33
|
+
|
|
34
|
+
- Does not propose or force flow-run state transitions.
|
|
35
|
+
- Does not require the flow run to currently be in `CANCELLING` and
|
|
36
|
+
does not skip teardown when the flow run has a `start_time`.
|
|
37
|
+
- Treats `InfrastructureNotFound` and an absent infrastructure handle
|
|
38
|
+
(when no actionable handle can be determined) as idempotent success.
|
|
39
|
+
- Maps `InfrastructureNotAvailable`, `NotImplementedError`, and missing
|
|
40
|
+
configuration context to stable release reasons rather than generic
|
|
41
|
+
errors so the executor can release with intent.
|
|
42
|
+
- Uses the cleanup payload's stable target identifiers; current worker
|
|
43
|
+
configuration is consulted only for provider access, not as proof of
|
|
44
|
+
submission-time configuration.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
cleanup_kind = CANCELLING_TIMEOUT_TEARDOWN
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
worker: "BaseWorker[Any, Any, Any]",
|
|
52
|
+
*,
|
|
53
|
+
grace_seconds: int = 30,
|
|
54
|
+
) -> None:
|
|
55
|
+
self._worker = worker
|
|
56
|
+
self._grace_seconds = grace_seconds
|
|
57
|
+
|
|
58
|
+
async def cleanup(
|
|
59
|
+
self, message: CleanupMessagePayload
|
|
60
|
+
) -> CleanupExecutionResult | None:
|
|
61
|
+
if not isinstance(message, CancellingTimeoutCleanupMessagePayload):
|
|
62
|
+
return CleanupExecutionResult.release("unexpected_payload_kind")
|
|
63
|
+
|
|
64
|
+
flow_run_id = getattr(message.target, "flow_run_id", None)
|
|
65
|
+
if flow_run_id is None:
|
|
66
|
+
return CleanupExecutionResult.release("invalid_payload")
|
|
67
|
+
|
|
68
|
+
flow_run = await self._read_flow_run(flow_run_id)
|
|
69
|
+
if flow_run is None:
|
|
70
|
+
return CleanupExecutionResult.success()
|
|
71
|
+
|
|
72
|
+
infrastructure_pid = message.target.infrastructure_pid
|
|
73
|
+
if not infrastructure_pid:
|
|
74
|
+
stored_pid = getattr(flow_run, "infrastructure_pid", None)
|
|
75
|
+
if not stored_pid:
|
|
76
|
+
return CleanupExecutionResult.success()
|
|
77
|
+
return CleanupExecutionResult.release("missing_infrastructure_handle")
|
|
78
|
+
|
|
79
|
+
# Freeze the worker's work-pool view so a mid-flight snapshot apply
|
|
80
|
+
# cannot retemplate the configuration we're handing to kill_infrastructure.
|
|
81
|
+
work_pool = copy.deepcopy(self._worker.work_pool)
|
|
82
|
+
try:
|
|
83
|
+
configuration = await self._worker.job_configuration.resolve_for_flow_run(
|
|
84
|
+
flow_run,
|
|
85
|
+
client=self._worker.client,
|
|
86
|
+
work_pool=work_pool,
|
|
87
|
+
worker_name=self._worker.name,
|
|
88
|
+
worker_id=self._worker.backend_id,
|
|
89
|
+
)
|
|
90
|
+
except ObjectNotFound:
|
|
91
|
+
return CleanupExecutionResult.release("configuration_context_unavailable")
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
await self._worker.kill_infrastructure(
|
|
95
|
+
infrastructure_pid=infrastructure_pid,
|
|
96
|
+
configuration=configuration,
|
|
97
|
+
grace_seconds=self._grace_seconds,
|
|
98
|
+
)
|
|
99
|
+
except InfrastructureNotFound:
|
|
100
|
+
return CleanupExecutionResult.success()
|
|
101
|
+
except NotImplementedError:
|
|
102
|
+
return CleanupExecutionResult.release("unsupported_worker_type")
|
|
103
|
+
except InfrastructureNotAvailable:
|
|
104
|
+
return CleanupExecutionResult.release("infrastructure_not_available")
|
|
105
|
+
|
|
106
|
+
return CleanupExecutionResult.success()
|
|
107
|
+
|
|
108
|
+
async def _read_flow_run(self, flow_run_id: UUID) -> "FlowRun | None":
|
|
109
|
+
try:
|
|
110
|
+
return await self._worker.client.read_flow_run(flow_run_id)
|
|
111
|
+
except ObjectNotFound:
|
|
112
|
+
return None
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@lru_cache(maxsize=None)
|
|
116
|
+
def _class_implements_kill_infrastructure(cls: type) -> bool:
|
|
117
|
+
return sum("kill_infrastructure" in vars(c) for c in cls.__mro__) > 1
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def build_cleanup_handler_registry(
|
|
121
|
+
worker: "BaseWorker[Any, Any, Any]",
|
|
122
|
+
) -> "WorkerCleanupHandlerRegistry":
|
|
123
|
+
"""Build the cleanup handler registry for a worker.
|
|
124
|
+
|
|
125
|
+
Class-level `cleanup_handlers` for a given cleanup kind take precedence
|
|
126
|
+
over the per-instance default registered here.
|
|
127
|
+
"""
|
|
128
|
+
registry = WorkerCleanupHandlerRegistry(worker.__class__.cleanup_handlers)
|
|
129
|
+
|
|
130
|
+
if (
|
|
131
|
+
_class_implements_kill_infrastructure(type(worker))
|
|
132
|
+
and registry.get(CANCELLING_TIMEOUT_TEARDOWN) is None
|
|
133
|
+
):
|
|
134
|
+
registry.register(CancellingTimeoutTeardownHandler(worker))
|
|
135
|
+
|
|
136
|
+
return registry
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
__all__ = [
|
|
140
|
+
"CancellingTimeoutTeardownHandler",
|
|
141
|
+
"build_cleanup_handler_registry",
|
|
142
|
+
]
|
|
@@ -17,7 +17,6 @@ from typing import (
|
|
|
17
17
|
Callable,
|
|
18
18
|
ClassVar,
|
|
19
19
|
Generic,
|
|
20
|
-
Iterable,
|
|
21
20
|
Optional,
|
|
22
21
|
Type,
|
|
23
22
|
)
|
|
@@ -109,6 +108,7 @@ from prefect.workers._cleanup import (
|
|
|
109
108
|
WorkerCleanupHandler,
|
|
110
109
|
WorkerCleanupHandlerRegistry,
|
|
111
110
|
)
|
|
111
|
+
from prefect.workers._cleanup_handlers import build_cleanup_handler_registry
|
|
112
112
|
from prefect.workers._worker_channel import WorkerChannel, WorkPoolWorkerChannel
|
|
113
113
|
|
|
114
114
|
if TYPE_CHECKING:
|
|
@@ -251,6 +251,65 @@ class BaseJobConfiguration(BaseModel):
|
|
|
251
251
|
)
|
|
252
252
|
return cls(**populated_configuration)
|
|
253
253
|
|
|
254
|
+
@classmethod
|
|
255
|
+
async def resolve_for_flow_run(
|
|
256
|
+
cls,
|
|
257
|
+
flow_run: "FlowRun",
|
|
258
|
+
*,
|
|
259
|
+
client: PrefectClient,
|
|
260
|
+
work_pool: WorkPool,
|
|
261
|
+
worker_name: str,
|
|
262
|
+
worker_id: UUID | None = None,
|
|
263
|
+
deployment: "DeploymentResponse | None" = None,
|
|
264
|
+
) -> Self:
|
|
265
|
+
"""Build a fully-prepared job configuration for an existing flow run.
|
|
266
|
+
|
|
267
|
+
Reads the flow run's deployment (when present) and flow, merges
|
|
268
|
+
deployment- and flow-run-level job variables over the work pool's
|
|
269
|
+
base template, instantiates the configuration, and stamps
|
|
270
|
+
attribution metadata via `prepare_for_flow_run`.
|
|
271
|
+
"""
|
|
272
|
+
if not deployment and flow_run.deployment_id:
|
|
273
|
+
deployment = await client.read_deployment(flow_run.deployment_id)
|
|
274
|
+
|
|
275
|
+
flow = await client.read_flow(flow_run.flow_id)
|
|
276
|
+
|
|
277
|
+
deployment_vars = getattr(deployment, "job_variables", {}) or {}
|
|
278
|
+
flow_run_vars = flow_run.job_variables or {}
|
|
279
|
+
job_variables = {**deployment_vars}
|
|
280
|
+
|
|
281
|
+
# merge environment variables carefully, otherwise full override
|
|
282
|
+
if isinstance(job_variables.get("env"), dict):
|
|
283
|
+
job_variables["env"].update(flow_run_vars.pop("env", {}))
|
|
284
|
+
job_variables.update(flow_run_vars)
|
|
285
|
+
|
|
286
|
+
configuration = await cls.from_template_and_values(
|
|
287
|
+
base_job_template=work_pool.base_job_template,
|
|
288
|
+
values=job_variables,
|
|
289
|
+
client=client,
|
|
290
|
+
)
|
|
291
|
+
try:
|
|
292
|
+
configuration.prepare_for_flow_run(
|
|
293
|
+
flow_run=flow_run,
|
|
294
|
+
deployment=deployment,
|
|
295
|
+
flow=flow,
|
|
296
|
+
work_pool=work_pool,
|
|
297
|
+
worker_name=worker_name,
|
|
298
|
+
worker_id=worker_id,
|
|
299
|
+
)
|
|
300
|
+
except TypeError:
|
|
301
|
+
warnings.warn(
|
|
302
|
+
"This worker is missing the `work_pool`, `worker_name`, or `worker_id` arguments "
|
|
303
|
+
"in its JobConfiguration.prepare_for_flow_run method. Please update "
|
|
304
|
+
"the worker's JobConfiguration class to accept these arguments to "
|
|
305
|
+
"avoid this warning.",
|
|
306
|
+
category=PrefectDeprecationWarning,
|
|
307
|
+
)
|
|
308
|
+
configuration.prepare_for_flow_run(
|
|
309
|
+
flow_run=flow_run, deployment=deployment, flow=flow
|
|
310
|
+
)
|
|
311
|
+
return configuration
|
|
312
|
+
|
|
254
313
|
@classmethod
|
|
255
314
|
def json_template(cls) -> dict[str, Any]:
|
|
256
315
|
"""Returns a dict with job configuration as keys and the corresponding templates as values
|
|
@@ -567,8 +626,6 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
|
567
626
|
heartbeat_interval_seconds: int | None = None,
|
|
568
627
|
*,
|
|
569
628
|
base_job_template: dict[str, Any] | None = None,
|
|
570
|
-
_cleanup_handlers: Iterable[WorkerCleanupHandler] | None = None,
|
|
571
|
-
_max_cleanup_concurrency: int | None = None,
|
|
572
629
|
):
|
|
573
630
|
"""
|
|
574
631
|
Base class for all Prefect workers.
|
|
@@ -607,14 +664,7 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
|
607
664
|
self._base_job_template = base_job_template
|
|
608
665
|
self._work_pool_name = work_pool_name
|
|
609
666
|
self._work_queues: set[str] = set(work_queues) if work_queues else set()
|
|
610
|
-
self._cleanup_handler_registry =
|
|
611
|
-
_cleanup_handlers
|
|
612
|
-
if _cleanup_handlers is not None
|
|
613
|
-
else self.__class__.cleanup_handlers
|
|
614
|
-
)
|
|
615
|
-
if _max_cleanup_concurrency is not None and _max_cleanup_concurrency < 0:
|
|
616
|
-
raise ValueError("Cleanup concurrency cannot be negative")
|
|
617
|
-
self._max_cleanup_concurrency_override = _max_cleanup_concurrency
|
|
667
|
+
self._cleanup_handler_registry = build_cleanup_handler_registry(self)
|
|
618
668
|
|
|
619
669
|
self._prefetch_seconds: float = (
|
|
620
670
|
prefetch_seconds or PREFECT_WORKER_PREFETCH_SECONDS.value()
|
|
@@ -687,15 +737,8 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
|
687
737
|
def max_cleanup_concurrency(self) -> int:
|
|
688
738
|
if not self._cleanup_handler_registry:
|
|
689
739
|
return 0
|
|
690
|
-
|
|
691
|
-
concurrency
|
|
692
|
-
self._max_cleanup_concurrency_override
|
|
693
|
-
if self._max_cleanup_concurrency_override is not None
|
|
694
|
-
else self.__class__.cleanup_max_concurrency
|
|
695
|
-
)
|
|
696
|
-
if concurrency is None:
|
|
697
|
-
return 1
|
|
698
|
-
return concurrency
|
|
740
|
+
concurrency = self.__class__.cleanup_max_concurrency
|
|
741
|
+
return 1 if concurrency is None else concurrency
|
|
699
742
|
|
|
700
743
|
def _cleanup_delivery_available(self) -> bool:
|
|
701
744
|
return bool(self._cleanup_handler_registry) and self.max_cleanup_concurrency > 0
|
|
@@ -1514,7 +1557,16 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
|
1514
1557
|
run_logger = self.get_flow_run_logger(flow_run)
|
|
1515
1558
|
|
|
1516
1559
|
try:
|
|
1517
|
-
|
|
1560
|
+
# Freeze a local copy of the work pool so a mid-flight snapshot
|
|
1561
|
+
# apply cannot retemplate the configuration we're building.
|
|
1562
|
+
work_pool = copy.deepcopy(self.work_pool)
|
|
1563
|
+
configuration = await self.job_configuration.resolve_for_flow_run(
|
|
1564
|
+
flow_run,
|
|
1565
|
+
client=self.client,
|
|
1566
|
+
work_pool=work_pool,
|
|
1567
|
+
worker_name=self.name,
|
|
1568
|
+
worker_id=self.backend_id,
|
|
1569
|
+
)
|
|
1518
1570
|
submitted_event = self._emit_flow_run_submitted_event(configuration)
|
|
1519
1571
|
await self._give_worker_labels_to_flow_run(flow_run.id)
|
|
1520
1572
|
|
|
@@ -1611,55 +1663,6 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
|
1611
1663
|
},
|
|
1612
1664
|
}
|
|
1613
1665
|
|
|
1614
|
-
async def _get_configuration(
|
|
1615
|
-
self,
|
|
1616
|
-
flow_run: "FlowRun",
|
|
1617
|
-
deployment: Optional["DeploymentResponse"] = None,
|
|
1618
|
-
) -> C:
|
|
1619
|
-
work_pool = copy.deepcopy(self.work_pool)
|
|
1620
|
-
|
|
1621
|
-
if not deployment and flow_run.deployment_id:
|
|
1622
|
-
deployment = await self.client.read_deployment(flow_run.deployment_id)
|
|
1623
|
-
|
|
1624
|
-
flow = await self.client.read_flow(flow_run.flow_id)
|
|
1625
|
-
|
|
1626
|
-
deployment_vars = getattr(deployment, "job_variables", {}) or {}
|
|
1627
|
-
flow_run_vars = flow_run.job_variables or {}
|
|
1628
|
-
job_variables = {**deployment_vars}
|
|
1629
|
-
|
|
1630
|
-
# merge environment variables carefully, otherwise full override
|
|
1631
|
-
if isinstance(job_variables.get("env"), dict):
|
|
1632
|
-
job_variables["env"].update(flow_run_vars.pop("env", {}))
|
|
1633
|
-
job_variables.update(flow_run_vars)
|
|
1634
|
-
|
|
1635
|
-
configuration = await self.job_configuration.from_template_and_values(
|
|
1636
|
-
base_job_template=work_pool.base_job_template,
|
|
1637
|
-
values=job_variables,
|
|
1638
|
-
client=self.client,
|
|
1639
|
-
)
|
|
1640
|
-
try:
|
|
1641
|
-
configuration.prepare_for_flow_run(
|
|
1642
|
-
flow_run=flow_run,
|
|
1643
|
-
deployment=deployment,
|
|
1644
|
-
flow=flow,
|
|
1645
|
-
work_pool=work_pool,
|
|
1646
|
-
worker_name=self.name,
|
|
1647
|
-
worker_id=self.backend_id,
|
|
1648
|
-
)
|
|
1649
|
-
except TypeError:
|
|
1650
|
-
warnings.warn(
|
|
1651
|
-
"This worker is missing the `work_pool`, `worker_name`, or `worker_id` arguments "
|
|
1652
|
-
"in its JobConfiguration.prepare_for_flow_run method. Please update "
|
|
1653
|
-
"the worker's JobConfiguration class to accept these arguments to "
|
|
1654
|
-
"avoid this warning.",
|
|
1655
|
-
category=PrefectDeprecationWarning,
|
|
1656
|
-
)
|
|
1657
|
-
# Handle older subclasses that don't accept work_pool, worker_name, and worker_id
|
|
1658
|
-
configuration.prepare_for_flow_run(
|
|
1659
|
-
flow_run=flow_run, deployment=deployment, flow=flow
|
|
1660
|
-
)
|
|
1661
|
-
return configuration
|
|
1662
|
-
|
|
1663
1666
|
async def _propose_pending_state(self, flow_run: "FlowRun") -> bool:
|
|
1664
1667
|
run_logger = self.get_flow_run_logger(flow_run)
|
|
1665
1668
|
state = flow_run.state
|
|
@@ -1804,9 +1807,17 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
|
|
|
1804
1807
|
)
|
|
1805
1808
|
return
|
|
1806
1809
|
|
|
1807
|
-
# Get configuration and kill infrastructure
|
|
1810
|
+
# Get configuration and kill infrastructure. Freeze a local work
|
|
1811
|
+
# pool copy so a mid-flight snapshot cannot retemplate the build.
|
|
1808
1812
|
try:
|
|
1809
|
-
|
|
1813
|
+
work_pool = copy.deepcopy(self.work_pool)
|
|
1814
|
+
configuration = await self.job_configuration.resolve_for_flow_run(
|
|
1815
|
+
flow_run,
|
|
1816
|
+
client=self.client,
|
|
1817
|
+
work_pool=work_pool,
|
|
1818
|
+
worker_name=self.name,
|
|
1819
|
+
worker_id=self.backend_id,
|
|
1820
|
+
)
|
|
1810
1821
|
except ObjectNotFound:
|
|
1811
1822
|
run_logger.warning(
|
|
1812
1823
|
"Cannot kill infrastructure: deployment not found. "
|