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.
Files changed (107) hide show
  1. {dbos-1.3.0a3 → dbos-1.3.0a5}/PKG-INFO +1 -1
  2. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_sys_db.py +39 -32
  3. {dbos-1.3.0a3 → dbos-1.3.0a5}/pyproject.toml +1 -1
  4. {dbos-1.3.0a3 → dbos-1.3.0a5}/LICENSE +0 -0
  5. {dbos-1.3.0a3 → dbos-1.3.0a5}/README.md +0 -0
  6. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/__init__.py +0 -0
  7. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/__main__.py +0 -0
  8. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_admin_server.py +0 -0
  9. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_app_db.py +0 -0
  10. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_classproperty.py +0 -0
  11. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_client.py +0 -0
  12. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_conductor/conductor.py +0 -0
  13. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_conductor/protocol.py +0 -0
  14. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_context.py +0 -0
  15. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_core.py +0 -0
  16. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_croniter.py +0 -0
  17. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_dbos.py +0 -0
  18. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_dbos_config.py +0 -0
  19. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_debug.py +0 -0
  20. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_docker_pg_helper.py +0 -0
  21. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_error.py +0 -0
  22. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_event_loop.py +0 -0
  23. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_fastapi.py +0 -0
  24. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_flask.py +0 -0
  25. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_kafka.py +0 -0
  26. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_kafka_message.py +0 -0
  27. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_logger.py +0 -0
  28. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/env.py +0 -0
  29. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/script.py.mako +0 -0
  30. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  31. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  32. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  33. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  34. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
  35. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  36. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  37. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  38. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  39. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  40. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  41. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  42. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_outcome.py +0 -0
  43. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_queue.py +0 -0
  44. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_recovery.py +0 -0
  45. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_registrations.py +0 -0
  46. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_roles.py +0 -0
  47. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_scheduler.py +0 -0
  48. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_schemas/__init__.py +0 -0
  49. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_schemas/application_database.py +0 -0
  50. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_schemas/system_database.py +0 -0
  51. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_serialization.py +0 -0
  52. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/README.md +0 -0
  53. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  54. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  55. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  56. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  57. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  58. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  59. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  60. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  61. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  62. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_tracer.py +0 -0
  63. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_utils.py +0 -0
  64. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/_workflow_commands.py +0 -0
  65. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/cli/_github_init.py +0 -0
  66. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/cli/_template_init.py +0 -0
  67. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/cli/cli.py +0 -0
  68. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/dbos-config.schema.json +0 -0
  69. {dbos-1.3.0a3 → dbos-1.3.0a5}/dbos/py.typed +0 -0
  70. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/__init__.py +0 -0
  71. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/atexit_no_ctor.py +0 -0
  72. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/atexit_no_launch.py +0 -0
  73. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/classdefs.py +0 -0
  74. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/client_collateral.py +0 -0
  75. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/client_worker.py +0 -0
  76. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/conftest.py +0 -0
  77. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/dupname_classdefs1.py +0 -0
  78. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/dupname_classdefsa.py +0 -0
  79. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/more_classdefs.py +0 -0
  80. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/queuedworkflow.py +0 -0
  81. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_admin_server.py +0 -0
  82. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_async.py +0 -0
  83. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_classdecorators.py +0 -0
  84. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_cli.py +0 -0
  85. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_client.py +0 -0
  86. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_concurrency.py +0 -0
  87. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_config.py +0 -0
  88. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_croniter.py +0 -0
  89. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_dbos.py +0 -0
  90. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_debug.py +0 -0
  91. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_docker_secrets.py +0 -0
  92. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_failures.py +0 -0
  93. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_fastapi.py +0 -0
  94. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_fastapi_roles.py +0 -0
  95. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_flask.py +0 -0
  96. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_kafka.py +0 -0
  97. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_outcome.py +0 -0
  98. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_package.py +0 -0
  99. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_queue.py +0 -0
  100. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_scheduler.py +0 -0
  101. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_schema_migration.py +0 -0
  102. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_singleton.py +0 -0
  103. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_spans.py +0 -0
  104. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_sqlalchemy.py +0 -0
  105. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_workflow_introspection.py +0 -0
  106. {dbos-1.3.0a3 → dbos-1.3.0a5}/tests/test_workflow_management.py +0 -0
  107. {dbos-1.3.0a3 → dbos-1.3.0a5}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.3.0a3
3
+ Version: 1.3.0a5
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -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
- # Print a warning if the local concurrency limit is violated
1732
- if local_pending_workflows > queue.worker_concurrency:
1733
- dbos_logger.warning(
1734
- f"The number of local pending workflows ({local_pending_workflows}) on queue {queue.name} exceeds the local concurrency limit ({queue.worker_concurrency})"
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
- if queue.concurrency is not None:
1739
- global_pending_workflows = sum(pending_workflows_dict.values())
1740
- # Print a warning if the global concurrency limit is violated
1741
- if global_pending_workflows > queue.concurrency:
1742
- dbos_logger.warning(
1743
- f"The total number of pending workflows ({global_pending_workflows}) on queue {queue.name} exceeds the global concurrency limit ({queue.concurrency})"
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
- available_tasks = max(0, queue.concurrency - global_pending_workflows)
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)
@@ -27,7 +27,7 @@ dependencies = [
27
27
  ]
28
28
  requires-python = ">=3.9"
29
29
  readme = "README.md"
30
- version = "1.3.0a3"
30
+ version = "1.3.0a5"
31
31
 
32
32
  [project.license]
33
33
  text = "MIT"
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