dbos 1.2.0a9__tar.gz → 1.3.0a2__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.

Potentially problematic release.


This version of dbos might be problematic. Click here for more details.

Files changed (106) hide show
  1. {dbos-1.2.0a9 → dbos-1.3.0a2}/PKG-INFO +1 -1
  2. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_dbos.py +1 -5
  3. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_event_loop.py +7 -10
  4. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_sys_db.py +27 -27
  5. {dbos-1.2.0a9 → dbos-1.3.0a2}/pyproject.toml +1 -1
  6. {dbos-1.2.0a9 → dbos-1.3.0a2}/LICENSE +0 -0
  7. {dbos-1.2.0a9 → dbos-1.3.0a2}/README.md +0 -0
  8. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/__init__.py +0 -0
  9. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/__main__.py +0 -0
  10. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_admin_server.py +0 -0
  11. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_app_db.py +0 -0
  12. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_classproperty.py +0 -0
  13. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_client.py +0 -0
  14. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_conductor/conductor.py +0 -0
  15. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_conductor/protocol.py +0 -0
  16. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_context.py +0 -0
  17. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_core.py +0 -0
  18. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_croniter.py +0 -0
  19. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_dbos_config.py +0 -0
  20. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_debug.py +0 -0
  21. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_docker_pg_helper.py +0 -0
  22. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_error.py +0 -0
  23. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_fastapi.py +0 -0
  24. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_flask.py +0 -0
  25. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_kafka.py +0 -0
  26. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_kafka_message.py +0 -0
  27. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_logger.py +0 -0
  28. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/env.py +0 -0
  29. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/script.py.mako +0 -0
  30. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  31. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  32. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  33. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  34. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  35. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  36. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  37. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  38. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  39. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  40. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  41. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_outcome.py +0 -0
  42. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_queue.py +0 -0
  43. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_recovery.py +0 -0
  44. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_registrations.py +0 -0
  45. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_roles.py +0 -0
  46. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_scheduler.py +0 -0
  47. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_schemas/__init__.py +0 -0
  48. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_schemas/application_database.py +0 -0
  49. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_schemas/system_database.py +0 -0
  50. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_serialization.py +0 -0
  51. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/README.md +0 -0
  52. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  53. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  54. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  55. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  56. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  57. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  58. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  59. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  60. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  61. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_tracer.py +0 -0
  62. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_utils.py +0 -0
  63. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/_workflow_commands.py +0 -0
  64. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/cli/_github_init.py +0 -0
  65. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/cli/_template_init.py +0 -0
  66. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/cli/cli.py +0 -0
  67. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/dbos-config.schema.json +0 -0
  68. {dbos-1.2.0a9 → dbos-1.3.0a2}/dbos/py.typed +0 -0
  69. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/__init__.py +0 -0
  70. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/atexit_no_ctor.py +0 -0
  71. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/atexit_no_launch.py +0 -0
  72. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/classdefs.py +0 -0
  73. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/client_collateral.py +0 -0
  74. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/client_worker.py +0 -0
  75. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/conftest.py +0 -0
  76. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/dupname_classdefs1.py +0 -0
  77. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/dupname_classdefsa.py +0 -0
  78. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/more_classdefs.py +0 -0
  79. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/queuedworkflow.py +0 -0
  80. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_admin_server.py +0 -0
  81. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_async.py +0 -0
  82. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_classdecorators.py +0 -0
  83. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_cli.py +0 -0
  84. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_client.py +0 -0
  85. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_concurrency.py +0 -0
  86. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_config.py +0 -0
  87. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_croniter.py +0 -0
  88. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_dbos.py +0 -0
  89. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_debug.py +0 -0
  90. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_docker_secrets.py +0 -0
  91. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_failures.py +0 -0
  92. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_fastapi.py +0 -0
  93. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_fastapi_roles.py +0 -0
  94. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_flask.py +0 -0
  95. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_kafka.py +0 -0
  96. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_outcome.py +0 -0
  97. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_package.py +0 -0
  98. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_queue.py +0 -0
  99. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_scheduler.py +0 -0
  100. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_schema_migration.py +0 -0
  101. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_singleton.py +0 -0
  102. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_spans.py +0 -0
  103. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_sqlalchemy.py +0 -0
  104. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_workflow_introspection.py +0 -0
  105. {dbos-1.2.0a9 → dbos-1.3.0a2}/tests/test_workflow_management.py +0 -0
  106. {dbos-1.2.0a9 → dbos-1.3.0a2}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.2.0a9
3
+ Version: 1.3.0a2
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -297,7 +297,6 @@ class DBOS:
297
297
 
298
298
  self._launched: bool = False
299
299
  self._debug_mode: bool = False
300
- self._configured_threadpool: bool = False
301
300
  self._sys_db_field: Optional[SystemDatabase] = None
302
301
  self._app_db_field: Optional[ApplicationDatabase] = None
303
302
  self._registry: DBOSRegistry = _get_or_create_dbos_registry()
@@ -410,7 +409,7 @@ class DBOS:
410
409
  GlobalParams.executor_id = str(uuid.uuid4())
411
410
  dbos_logger.info(f"Executor ID: {GlobalParams.executor_id}")
412
411
  dbos_logger.info(f"Application version: {GlobalParams.app_version}")
413
- self._executor_field = ThreadPoolExecutor(max_workers=64)
412
+ self._executor_field = ThreadPoolExecutor(max_workers=sys.maxsize)
414
413
  self._background_event_loop.start()
415
414
  assert self._config["database_url"] is not None
416
415
  assert self._config["database"]["sys_db_engine_kwargs"] is not None
@@ -941,11 +940,8 @@ class DBOS:
941
940
 
942
941
  This function is called before the first call to asyncio.to_thread.
943
942
  """
944
- if _get_dbos_instance()._configured_threadpool:
945
- return
946
943
  loop = asyncio.get_running_loop()
947
944
  loop.set_default_executor(_get_dbos_instance()._executor)
948
- _get_dbos_instance()._configured_threadpool = True
949
945
 
950
946
  @classmethod
951
947
  def resume_workflow(cls, workflow_id: str) -> WorkflowHandle[Any]:
@@ -1,6 +1,5 @@
1
1
  import asyncio
2
2
  import threading
3
- from concurrent.futures import ThreadPoolExecutor
4
3
  from typing import Any, Coroutine, Optional, TypeVar
5
4
 
6
5
 
@@ -34,17 +33,15 @@ class BackgroundEventLoop:
34
33
 
35
34
  def _run_event_loop(self) -> None:
36
35
  self._loop = asyncio.new_event_loop()
37
- with ThreadPoolExecutor(max_workers=64) as thread_pool:
38
- self._loop.set_default_executor(thread_pool)
39
- asyncio.set_event_loop(self._loop)
36
+ asyncio.set_event_loop(self._loop)
40
37
 
41
- self._running = True
42
- self._ready.set() # Signal that the loop is ready
38
+ self._running = True
39
+ self._ready.set() # Signal that the loop is ready
43
40
 
44
- try:
45
- self._loop.run_forever()
46
- finally:
47
- self._loop.close()
41
+ try:
42
+ self._loop.run_forever()
43
+ finally:
44
+ self._loop.close()
48
45
 
49
46
  async def _shutdown(self) -> None:
50
47
  if self._loop is None:
@@ -1385,35 +1385,35 @@ class SystemDatabase:
1385
1385
  payload = f"{workflow_uuid}::{topic}"
1386
1386
  condition = threading.Condition()
1387
1387
  # Must acquire first before adding to the map. Otherwise, the notification listener may notify it before the condition is acquired and waited.
1388
- condition.acquire()
1389
- success, _ = self.notifications_map.set(payload, condition)
1390
- if not success:
1391
- # This should not happen, but if it does, it means the workflow is executed concurrently.
1392
- condition.release()
1393
- self.notifications_map.pop(payload)
1394
- raise DBOSWorkflowConflictIDError(workflow_uuid)
1388
+ try:
1389
+ condition.acquire()
1390
+ success, _ = self.notifications_map.set(payload, condition)
1391
+ if not success:
1392
+ # This should not happen, but if it does, it means the workflow is executed concurrently.
1393
+ raise DBOSWorkflowConflictIDError(workflow_uuid)
1395
1394
 
1396
- # Check if the key is already in the database. If not, wait for the notification.
1397
- init_recv: Sequence[Any]
1398
- with self.engine.begin() as c:
1399
- init_recv = c.execute(
1400
- sa.select(
1401
- SystemSchema.notifications.c.topic,
1402
- ).where(
1403
- SystemSchema.notifications.c.destination_uuid == workflow_uuid,
1404
- SystemSchema.notifications.c.topic == topic,
1405
- )
1406
- ).fetchall()
1395
+ # Check if the key is already in the database. If not, wait for the notification.
1396
+ init_recv: Sequence[Any]
1397
+ with self.engine.begin() as c:
1398
+ init_recv = c.execute(
1399
+ sa.select(
1400
+ SystemSchema.notifications.c.topic,
1401
+ ).where(
1402
+ SystemSchema.notifications.c.destination_uuid == workflow_uuid,
1403
+ SystemSchema.notifications.c.topic == topic,
1404
+ )
1405
+ ).fetchall()
1407
1406
 
1408
- if len(init_recv) == 0:
1409
- # Wait for the notification
1410
- # Support OAOO sleep
1411
- actual_timeout = self.sleep(
1412
- workflow_uuid, timeout_function_id, timeout_seconds, skip_sleep=True
1413
- )
1414
- condition.wait(timeout=actual_timeout)
1415
- condition.release()
1416
- self.notifications_map.pop(payload)
1407
+ if len(init_recv) == 0:
1408
+ # Wait for the notification
1409
+ # Support OAOO sleep
1410
+ actual_timeout = self.sleep(
1411
+ workflow_uuid, timeout_function_id, timeout_seconds, skip_sleep=True
1412
+ )
1413
+ condition.wait(timeout=actual_timeout)
1414
+ finally:
1415
+ condition.release()
1416
+ self.notifications_map.pop(payload)
1417
1417
 
1418
1418
  # Transactionally consume and return the message if it's in the database, otherwise return null.
1419
1419
  with self.engine.begin() as c:
@@ -27,7 +27,7 @@ dependencies = [
27
27
  ]
28
28
  requires-python = ">=3.9"
29
29
  readme = "README.md"
30
- version = "1.2.0a9"
30
+ version = "1.3.0a2"
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