dbos 1.3.0a3__tar.gz → 1.3.0a5__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.
- {dbos-1.3.0a3 → dbos-1.3.0a5}/PKG-INFO +1 -1
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_sys_db.py +39 -32
- {dbos-1.3.0a3 → dbos-1.3.0a5}/pyproject.toml +1 -1
- {dbos-1.3.0a3 → dbos-1.3.0a5}/LICENSE +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/README.md +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/__init__.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/__main__.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_admin_server.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_app_db.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_classproperty.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_client.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_conductor/conductor.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_conductor/protocol.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_context.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_core.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_croniter.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_dbos.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_dbos_config.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_debug.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_docker_pg_helper.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_error.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_event_loop.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_fastapi.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_flask.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_kafka.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_kafka_message.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_logger.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/env.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/script.py.mako +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_outcome.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_queue.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_recovery.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_registrations.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_roles.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_scheduler.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_schemas/__init__.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_schemas/application_database.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_schemas/system_database.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_serialization.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/README.md +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_tracer.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_utils.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_workflow_commands.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/cli/_github_init.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/cli/_template_init.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/cli/cli.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/dbos-config.schema.json +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/py.typed +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/__init__.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/atexit_no_ctor.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/atexit_no_launch.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/classdefs.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/client_collateral.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/client_worker.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/conftest.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/dupname_classdefs1.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/dupname_classdefsa.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/more_classdefs.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/queuedworkflow.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_admin_server.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_async.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_classdecorators.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_cli.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_client.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_concurrency.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_config.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_croniter.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_dbos.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_debug.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_docker_secrets.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_failures.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_fastapi.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_fastapi_roles.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_flask.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_kafka.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_outcome.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_package.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_queue.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_scheduler.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_schema_migration.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_singleton.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_spans.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_sqlalchemy.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_workflow_introspection.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_workflow_management.py +0 -0
- {dbos-1.3.0a3 → dbos-1.3.0a5}/version/__init__.py +0 -0
@@ -483,6 +483,8 @@ class SystemDatabase:
|
|
483
483
|
status["queue_name"],
|
484
484
|
status["deduplication_id"],
|
485
485
|
)
|
486
|
+
else:
|
487
|
+
raise
|
486
488
|
row = results.fetchone()
|
487
489
|
if row is not None:
|
488
490
|
# Check the started workflow matches the expected name, class_name, config_name, and queue_name
|
@@ -1707,43 +1709,48 @@ class SystemDatabase:
|
|
1707
1709
|
if num_recent_queries >= queue.limiter["limit"]:
|
1708
1710
|
return []
|
1709
1711
|
|
1710
|
-
# Count how many workflows on this queue are currently PENDING both locally and globally.
|
1711
|
-
pending_tasks_query = (
|
1712
|
-
sa.select(
|
1713
|
-
SystemSchema.workflow_status.c.executor_id,
|
1714
|
-
sa.func.count().label("task_count"),
|
1715
|
-
)
|
1716
|
-
.select_from(SystemSchema.workflow_status)
|
1717
|
-
.where(SystemSchema.workflow_status.c.queue_name == queue.name)
|
1718
|
-
.where(
|
1719
|
-
SystemSchema.workflow_status.c.status
|
1720
|
-
== WorkflowStatusString.PENDING.value
|
1721
|
-
)
|
1722
|
-
.group_by(SystemSchema.workflow_status.c.executor_id)
|
1723
|
-
)
|
1724
|
-
pending_workflows = c.execute(pending_tasks_query).fetchall()
|
1725
|
-
pending_workflows_dict = {row[0]: row[1] for row in pending_workflows}
|
1726
|
-
local_pending_workflows = pending_workflows_dict.get(executor_id, 0)
|
1727
|
-
|
1728
1712
|
# Compute max_tasks, the number of workflows that can be dequeued given local and global concurrency limits,
|
1729
1713
|
max_tasks = float("inf")
|
1730
|
-
if queue.worker_concurrency is not None:
|
1731
|
-
#
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1714
|
+
if queue.worker_concurrency is not None or queue.concurrency is not None:
|
1715
|
+
# Count how many workflows on this queue are currently PENDING both locally and globally.
|
1716
|
+
pending_tasks_query = (
|
1717
|
+
sa.select(
|
1718
|
+
SystemSchema.workflow_status.c.executor_id,
|
1719
|
+
sa.func.count().label("task_count"),
|
1720
|
+
)
|
1721
|
+
.select_from(SystemSchema.workflow_status)
|
1722
|
+
.where(SystemSchema.workflow_status.c.queue_name == queue.name)
|
1723
|
+
.where(
|
1724
|
+
SystemSchema.workflow_status.c.status
|
1725
|
+
== WorkflowStatusString.PENDING.value
|
1726
|
+
)
|
1727
|
+
.group_by(SystemSchema.workflow_status.c.executor_id)
|
1728
|
+
)
|
1729
|
+
pending_workflows = c.execute(pending_tasks_query).fetchall()
|
1730
|
+
pending_workflows_dict = {row[0]: row[1] for row in pending_workflows}
|
1731
|
+
local_pending_workflows = pending_workflows_dict.get(executor_id, 0)
|
1732
|
+
|
1733
|
+
if queue.worker_concurrency is not None:
|
1734
|
+
# Print a warning if the local concurrency limit is violated
|
1735
|
+
if local_pending_workflows > queue.worker_concurrency:
|
1736
|
+
dbos_logger.warning(
|
1737
|
+
f"The number of local pending workflows ({local_pending_workflows}) on queue {queue.name} exceeds the local concurrency limit ({queue.worker_concurrency})"
|
1738
|
+
)
|
1739
|
+
max_tasks = max(
|
1740
|
+
0, queue.worker_concurrency - local_pending_workflows
|
1735
1741
|
)
|
1736
|
-
max_tasks = max(0, queue.worker_concurrency - local_pending_workflows)
|
1737
1742
|
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
|
1742
|
-
|
1743
|
-
|
1743
|
+
if queue.concurrency is not None:
|
1744
|
+
global_pending_workflows = sum(pending_workflows_dict.values())
|
1745
|
+
# Print a warning if the global concurrency limit is violated
|
1746
|
+
if global_pending_workflows > queue.concurrency:
|
1747
|
+
dbos_logger.warning(
|
1748
|
+
f"The total number of pending workflows ({global_pending_workflows}) on queue {queue.name} exceeds the global concurrency limit ({queue.concurrency})"
|
1749
|
+
)
|
1750
|
+
available_tasks = max(
|
1751
|
+
0, queue.concurrency - global_pending_workflows
|
1744
1752
|
)
|
1745
|
-
|
1746
|
-
max_tasks = min(max_tasks, available_tasks)
|
1753
|
+
max_tasks = min(max_tasks, available_tasks)
|
1747
1754
|
|
1748
1755
|
# Retrieve the first max_tasks workflows in the queue.
|
1749
1756
|
# Only retrieve workflows of the local version (or without version set)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|