prefect-client 3.7.1.dev6__tar.gz → 3.7.1.dev8__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.dev6 → prefect_client-3.7.1.dev8}/PKG-INFO +1 -1
- prefect_client-3.7.1.dev8/src/prefect/_build_info.py +5 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/AGENTS.md +2 -2
- prefect_client-3.7.1.dev8/src/prefect/concurrency/_leases.py +230 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/AGENTS.md +2 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/server.py +7 -1
- prefect_client-3.7.1.dev8/src/prefect/workers/_cleanup_handlers.py +142 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/__init__.py +2 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_protocol.py +24 -3
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_state.py +34 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_sync.py +21 -3
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/base.py +97 -80
- prefect_client-3.7.1.dev6/src/prefect/_build_info.py +0 -5
- prefect_client-3.7.1.dev6/src/prefect/concurrency/_leases.py +0 -190
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/.gitignore +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/LICENSE +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/README.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/hatch_build.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/pyproject.toml +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/__main__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/agent.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/automations.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/base.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/context.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/engine.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/related.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/flows.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/futures.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/main.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/plugins.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/py.typed +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/results.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/schedules.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/serializers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/states.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/tasks.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/transactions.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/types/names.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/variables.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/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
|
|
@@ -257,7 +257,13 @@ def _build_ui_path(base_url: str, relative_path: str) -> str:
|
|
|
257
257
|
return normalized_relative_path
|
|
258
258
|
|
|
259
259
|
if normalized_relative_path == "/":
|
|
260
|
-
|
|
260
|
+
# Preserve the trailing slash so the redirect target falls inside
|
|
261
|
+
# the bundle's mount. Starlette's `Mount` only routes requests
|
|
262
|
+
# whose path starts with `{mount}/`; a bare `{mount}` falls through
|
|
263
|
+
# to whatever else matches, which in practice is the V1 SPA mount
|
|
264
|
+
# at "/" — that returns V1's index.html under the `/v2` URL and
|
|
265
|
+
# the V1 router can't resolve the route.
|
|
266
|
+
return f"{normalized_base_url}/"
|
|
261
267
|
|
|
262
268
|
return f"{normalized_base_url}{normalized_relative_path}"
|
|
263
269
|
|
|
@@ -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
|
+
]
|
|
@@ -9,6 +9,7 @@ from prefect.workers._worker_channel._state import (
|
|
|
9
9
|
WorkerChannelState,
|
|
10
10
|
WorkerChannelStatus,
|
|
11
11
|
WorkerChannelTerminalError,
|
|
12
|
+
WorkPoolSnapshotState,
|
|
12
13
|
)
|
|
13
14
|
from prefect.workers._worker_channel._sync import WorkPoolWorkerChannel
|
|
14
15
|
|
|
@@ -21,5 +22,6 @@ __all__ = [
|
|
|
21
22
|
"WorkerChannelState",
|
|
22
23
|
"WorkerChannelStatus",
|
|
23
24
|
"WorkerChannelTerminalError",
|
|
25
|
+
"WorkPoolSnapshotState",
|
|
24
26
|
"WorkPoolWorkerChannel",
|
|
25
27
|
]
|
|
@@ -27,6 +27,7 @@ from prefect.client.schemas.worker_channel import (
|
|
|
27
27
|
WorkerHelloFrame,
|
|
28
28
|
WorkerReadyFrame,
|
|
29
29
|
WorkPoolSnapshotFrame,
|
|
30
|
+
WorkPoolSnapshotPayload,
|
|
30
31
|
validate_worker_channel_frame,
|
|
31
32
|
)
|
|
32
33
|
from prefect.settings import get_current_settings
|
|
@@ -38,6 +39,7 @@ from prefect.workers._worker_channel._state import (
|
|
|
38
39
|
WorkerChannelRetryableError,
|
|
39
40
|
WorkerChannelSession,
|
|
40
41
|
WorkerChannelTerminalError,
|
|
42
|
+
WorkPoolSnapshotState,
|
|
41
43
|
)
|
|
42
44
|
|
|
43
45
|
|
|
@@ -77,6 +79,7 @@ class WorkerChannelProtocolHandler:
|
|
|
77
79
|
self._current_session = CurrentWorkerChannelSession()
|
|
78
80
|
self._worker_id: UUID | None = None
|
|
79
81
|
self._worker_metadata_sent = False
|
|
82
|
+
self._work_pool_snapshots = WorkPoolSnapshotState()
|
|
80
83
|
|
|
81
84
|
@property
|
|
82
85
|
def worker_id(self) -> UUID | None:
|
|
@@ -86,6 +89,10 @@ class WorkerChannelProtocolHandler:
|
|
|
86
89
|
def worker_metadata_sent(self) -> bool:
|
|
87
90
|
return self._worker_metadata_sent
|
|
88
91
|
|
|
92
|
+
@property
|
|
93
|
+
def work_pool_snapshots_available(self) -> bool:
|
|
94
|
+
return self._work_pool_snapshots.snapshots_available
|
|
95
|
+
|
|
89
96
|
async def handshake(
|
|
90
97
|
self, websocket: websockets.asyncio.client.ClientConnection
|
|
91
98
|
) -> WorkerReadyFrame:
|
|
@@ -175,12 +182,26 @@ class WorkerChannelProtocolHandler:
|
|
|
175
182
|
)
|
|
176
183
|
|
|
177
184
|
def _handle_ready(self, ready: WorkerReadyFrame) -> None:
|
|
178
|
-
self.
|
|
185
|
+
self.reset_work_pool_snapshot_sequence()
|
|
186
|
+
self.handle_work_pool_snapshot(ready.payload.initial_snapshot)
|
|
179
187
|
worker_id = ready.payload.worker_id
|
|
180
188
|
if worker_id is not None:
|
|
181
189
|
self.record_worker_id(worker_id)
|
|
182
190
|
|
|
183
|
-
def
|
|
191
|
+
def reset_work_pool_snapshot_sequence(self) -> None:
|
|
192
|
+
self._work_pool_snapshots.reset_connection_sequence()
|
|
193
|
+
|
|
194
|
+
def handle_work_pool_snapshot(self, snapshot: WorkPoolSnapshotPayload) -> bool:
|
|
195
|
+
work_pool = self._work_pool_snapshots.apply_snapshot(snapshot)
|
|
196
|
+
if work_pool is None:
|
|
197
|
+
return False
|
|
198
|
+
|
|
199
|
+
if self._on_work_pool_snapshot is not None:
|
|
200
|
+
self._on_work_pool_snapshot(work_pool)
|
|
201
|
+
return True
|
|
202
|
+
|
|
203
|
+
def record_rest_work_pool_snapshot(self, work_pool: WorkPool) -> None:
|
|
204
|
+
work_pool = self._work_pool_snapshots.replace_from_rest(work_pool)
|
|
184
205
|
if self._on_work_pool_snapshot is not None:
|
|
185
206
|
self._on_work_pool_snapshot(work_pool)
|
|
186
207
|
|
|
@@ -299,7 +320,7 @@ class WorkerChannelProtocolHandler:
|
|
|
299
320
|
) from exc
|
|
300
321
|
|
|
301
322
|
if isinstance(frame, WorkPoolSnapshotFrame):
|
|
302
|
-
self.handle_work_pool_snapshot(frame.payload
|
|
323
|
+
self.handle_work_pool_snapshot(frame.payload)
|
|
303
324
|
continue
|
|
304
325
|
|
|
305
326
|
if isinstance(frame, CleanupMessageFrame):
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import copy
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from enum import Enum
|
|
6
7
|
from typing import Protocol
|
|
@@ -10,10 +11,12 @@ import websockets.asyncio.client
|
|
|
10
11
|
import websockets.exceptions
|
|
11
12
|
|
|
12
13
|
from prefect.client.orchestration import PrefectClient
|
|
14
|
+
from prefect.client.schemas.objects import WorkPool
|
|
13
15
|
from prefect.client.schemas.worker_channel import (
|
|
14
16
|
WorkerChannelCapability,
|
|
15
17
|
WorkerChannelFrame,
|
|
16
18
|
WorkerReadyFrame,
|
|
19
|
+
WorkPoolSnapshotPayload,
|
|
17
20
|
)
|
|
18
21
|
|
|
19
22
|
|
|
@@ -77,6 +80,34 @@ class WorkerChannelState:
|
|
|
77
80
|
WorkerChannelFallbackState = WorkerChannelState
|
|
78
81
|
|
|
79
82
|
|
|
83
|
+
@dataclass
|
|
84
|
+
class WorkPoolSnapshotState:
|
|
85
|
+
work_pool: WorkPool | None = None
|
|
86
|
+
last_applied_sequence: int | None = None
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def snapshots_available(self) -> bool:
|
|
90
|
+
return self.last_applied_sequence is not None
|
|
91
|
+
|
|
92
|
+
def reset_connection_sequence(self) -> None:
|
|
93
|
+
self.last_applied_sequence = None
|
|
94
|
+
|
|
95
|
+
def apply_snapshot(self, snapshot: WorkPoolSnapshotPayload) -> WorkPool | None:
|
|
96
|
+
if (
|
|
97
|
+
self.last_applied_sequence is not None
|
|
98
|
+
and snapshot.snapshot_sequence <= self.last_applied_sequence
|
|
99
|
+
):
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
self.last_applied_sequence = snapshot.snapshot_sequence
|
|
103
|
+
self.work_pool = copy.deepcopy(snapshot.work_pool)
|
|
104
|
+
return self.work_pool
|
|
105
|
+
|
|
106
|
+
def replace_from_rest(self, work_pool: WorkPool) -> WorkPool:
|
|
107
|
+
self.work_pool = copy.deepcopy(work_pool)
|
|
108
|
+
return self.work_pool
|
|
109
|
+
|
|
110
|
+
|
|
80
111
|
@dataclass
|
|
81
112
|
class WorkerChannelSession:
|
|
82
113
|
"""One successfully negotiated worker-channel WebSocket session."""
|
|
@@ -146,6 +177,9 @@ class WorkerChannel(Protocol):
|
|
|
146
177
|
@property
|
|
147
178
|
def rest_fallback_enabled(self) -> bool: ...
|
|
148
179
|
|
|
180
|
+
@property
|
|
181
|
+
def snapshots_available(self) -> bool: ...
|
|
182
|
+
|
|
149
183
|
def set_client(self, client: PrefectClient) -> None: ...
|
|
150
184
|
|
|
151
185
|
async def sync(self, task_group: anyio.abc.TaskGroup | None) -> None: ...
|
{prefect_client-3.7.1.dev6 → prefect_client-3.7.1.dev8}/src/prefect/workers/_worker_channel/_sync.py
RENAMED
|
@@ -112,6 +112,10 @@ class WorkPoolWorkerChannel:
|
|
|
112
112
|
def rest_fallback_enabled(self) -> bool:
|
|
113
113
|
return self.state.rest_fallback_enabled
|
|
114
114
|
|
|
115
|
+
@property
|
|
116
|
+
def snapshots_available(self) -> bool:
|
|
117
|
+
return self._protocol.work_pool_snapshots_available
|
|
118
|
+
|
|
115
119
|
@property
|
|
116
120
|
def worker_id(self) -> UUID | None:
|
|
117
121
|
return self._protocol.worker_id
|
|
@@ -128,7 +132,7 @@ class WorkPoolWorkerChannel:
|
|
|
128
132
|
self._run_scope.cancel()
|
|
129
133
|
|
|
130
134
|
async def sync(self, task_group: anyio.abc.TaskGroup | None) -> None:
|
|
131
|
-
if self.state.healthy:
|
|
135
|
+
if self.state.healthy and self.snapshots_available:
|
|
132
136
|
return
|
|
133
137
|
|
|
134
138
|
if task_group is not None:
|
|
@@ -138,7 +142,7 @@ class WorkPoolWorkerChannel:
|
|
|
138
142
|
if self.url is None:
|
|
139
143
|
self.state.mark_terminal("endpoint_unavailable")
|
|
140
144
|
|
|
141
|
-
if channel_started:
|
|
145
|
+
if channel_started and self.snapshots_available:
|
|
142
146
|
return
|
|
143
147
|
|
|
144
148
|
await self._sync_rest_work_pool()
|
|
@@ -317,13 +321,27 @@ class WorkPoolWorkerChannel:
|
|
|
317
321
|
)
|
|
318
322
|
return
|
|
319
323
|
|
|
324
|
+
if self.state.healthy and self.snapshots_available:
|
|
325
|
+
self._logger.debug(
|
|
326
|
+
"Skipping REST work pool sync because the worker channel applied a "
|
|
327
|
+
"snapshot while REST sync was in flight."
|
|
328
|
+
)
|
|
329
|
+
return
|
|
330
|
+
|
|
320
331
|
if not work_pool.base_job_template:
|
|
321
332
|
await self._set_work_pool_template(
|
|
322
333
|
work_pool, self.default_base_job_template
|
|
323
334
|
)
|
|
324
335
|
work_pool.base_job_template = self.default_base_job_template
|
|
325
336
|
|
|
326
|
-
self.
|
|
337
|
+
if self.state.healthy and self.snapshots_available:
|
|
338
|
+
self._logger.debug(
|
|
339
|
+
"Skipping REST work pool snapshot because the worker channel applied "
|
|
340
|
+
"a snapshot while REST sync was in flight."
|
|
341
|
+
)
|
|
342
|
+
return
|
|
343
|
+
|
|
344
|
+
self._protocol.record_rest_work_pool_snapshot(work_pool)
|
|
327
345
|
|
|
328
346
|
async def _set_work_pool_template(
|
|
329
347
|
self, work_pool: WorkPool, job_template: dict[str, Any]
|