dbos 0.23.0a13__tar.gz → 0.23.0a14__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 (97) hide show
  1. {dbos-0.23.0a13 → dbos-0.23.0a14}/PKG-INFO +1 -1
  2. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_schemas/system_database.py +1 -1
  3. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_sys_db.py +25 -22
  4. {dbos-0.23.0a13 → dbos-0.23.0a14}/pyproject.toml +1 -1
  5. {dbos-0.23.0a13 → dbos-0.23.0a14}/LICENSE +0 -0
  6. {dbos-0.23.0a13 → dbos-0.23.0a14}/README.md +0 -0
  7. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/__init__.py +0 -0
  8. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/__main__.py +0 -0
  9. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_admin_server.py +0 -0
  10. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_app_db.py +0 -0
  11. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_classproperty.py +0 -0
  12. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_cloudutils/authentication.py +0 -0
  13. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_cloudutils/cloudutils.py +0 -0
  14. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_cloudutils/databases.py +0 -0
  15. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_conductor/conductor.py +0 -0
  16. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_conductor/protocol.py +0 -0
  17. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_context.py +0 -0
  18. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_core.py +0 -0
  19. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_croniter.py +0 -0
  20. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_db_wizard.py +0 -0
  21. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_dbos.py +0 -0
  22. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_dbos_config.py +0 -0
  23. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_debug.py +0 -0
  24. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_error.py +0 -0
  25. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_fastapi.py +0 -0
  26. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_flask.py +0 -0
  27. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_kafka.py +0 -0
  28. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_kafka_message.py +0 -0
  29. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_logger.py +0 -0
  30. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/env.py +0 -0
  31. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/script.py.mako +0 -0
  32. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  33. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  34. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  35. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  36. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  37. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  38. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  39. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_outcome.py +0 -0
  40. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_queue.py +0 -0
  41. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_recovery.py +0 -0
  42. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_registrations.py +0 -0
  43. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_request.py +0 -0
  44. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_roles.py +0 -0
  45. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_scheduler.py +0 -0
  46. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_schemas/__init__.py +0 -0
  47. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_schemas/application_database.py +0 -0
  48. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_serialization.py +0 -0
  49. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/README.md +0 -0
  50. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  51. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/__package/main.py +0 -0
  52. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  53. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  54. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  55. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  56. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  57. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  58. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  59. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_tracer.py +0 -0
  60. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_utils.py +0 -0
  61. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/_workflow_commands.py +0 -0
  62. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/cli/_github_init.py +0 -0
  63. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/cli/_template_init.py +0 -0
  64. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/cli/cli.py +0 -0
  65. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/dbos-config.schema.json +0 -0
  66. {dbos-0.23.0a13 → dbos-0.23.0a14}/dbos/py.typed +0 -0
  67. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/__init__.py +0 -0
  68. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/atexit_no_ctor.py +0 -0
  69. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/atexit_no_launch.py +0 -0
  70. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/classdefs.py +0 -0
  71. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/conftest.py +0 -0
  72. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/more_classdefs.py +0 -0
  73. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/queuedworkflow.py +0 -0
  74. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_admin_server.py +0 -0
  75. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_async.py +0 -0
  76. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_classdecorators.py +0 -0
  77. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_concurrency.py +0 -0
  78. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_config.py +0 -0
  79. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_croniter.py +0 -0
  80. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_dbos.py +0 -0
  81. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_debug.py +0 -0
  82. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_failures.py +0 -0
  83. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_fastapi.py +0 -0
  84. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_fastapi_roles.py +0 -0
  85. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_flask.py +0 -0
  86. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_kafka.py +0 -0
  87. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_outcome.py +0 -0
  88. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_package.py +0 -0
  89. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_queue.py +0 -0
  90. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_scheduler.py +0 -0
  91. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_schema_migration.py +0 -0
  92. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_singleton.py +0 -0
  93. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_spans.py +0 -0
  94. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_sqlalchemy.py +0 -0
  95. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_workflow_cancel.py +0 -0
  96. {dbos-0.23.0a13 → dbos-0.23.0a14}/tests/test_workflow_cmds.py +0 -0
  97. {dbos-0.23.0a13 → dbos-0.23.0a14}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.23.0a13
3
+ Version: 0.23.0a14
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -154,7 +154,7 @@ class SystemSchema:
154
154
  nullable=False,
155
155
  primary_key=True,
156
156
  ),
157
- Column("executor_id", Text),
157
+ # Column("executor_id", Text), # This column is deprecated. Do *not* use it.
158
158
  Column("queue_name", Text, nullable=False),
159
159
  Column(
160
160
  "created_at_epoch_ms",
@@ -1324,24 +1324,32 @@ class SystemDatabase:
1324
1324
  # If there is a global or local concurrency limit N, select only the N oldest enqueued
1325
1325
  # functions, else select all of them.
1326
1326
 
1327
- # First lets figure out how many tasks the worker can dequeue
1327
+ # First lets figure out how many tasks are eligible for dequeue.
1328
+ # This means figuring out how many unstarted tasks are within the local and global concurrency limits
1328
1329
  running_tasks_query = (
1329
1330
  sa.select(
1330
- SystemSchema.workflow_queue.c.executor_id,
1331
+ SystemSchema.workflow_status.c.executor_id,
1331
1332
  sa.func.count().label("task_count"),
1332
1333
  )
1334
+ .select_from(
1335
+ SystemSchema.workflow_queue.join(
1336
+ SystemSchema.workflow_status,
1337
+ SystemSchema.workflow_queue.c.workflow_uuid
1338
+ == SystemSchema.workflow_status.c.workflow_uuid,
1339
+ )
1340
+ )
1333
1341
  .where(SystemSchema.workflow_queue.c.queue_name == queue.name)
1334
1342
  .where(
1335
- SystemSchema.workflow_queue.c.executor_id.isnot(
1343
+ SystemSchema.workflow_queue.c.started_at_epoch_ms.isnot(
1336
1344
  None
1337
- ) # Task is dequeued
1345
+ ) # Task is started
1338
1346
  )
1339
1347
  .where(
1340
1348
  SystemSchema.workflow_queue.c.completed_at_epoch_ms.is_(
1341
1349
  None
1342
- ) # Task is not completed
1350
+ ) # Task is not completed.
1343
1351
  )
1344
- .group_by(SystemSchema.workflow_queue.c.executor_id)
1352
+ .group_by(SystemSchema.workflow_status.c.executor_id)
1345
1353
  )
1346
1354
  running_tasks_result = c.execute(running_tasks_query).fetchall()
1347
1355
  running_tasks_result_dict = {row[0]: row[1] for row in running_tasks_result}
@@ -1351,12 +1359,6 @@ class SystemDatabase:
1351
1359
 
1352
1360
  max_tasks = float("inf")
1353
1361
  if queue.worker_concurrency is not None:
1354
- # Worker local concurrency limit should always be >= running_tasks_for_this_worker
1355
- # This should never happen but a check + warning doesn't hurt
1356
- if running_tasks_for_this_worker > queue.worker_concurrency:
1357
- dbos_logger.warning(
1358
- f"Number of tasks on this worker ({running_tasks_for_this_worker}) exceeds the worker concurrency limit ({queue.worker_concurrency})"
1359
- )
1360
1362
  max_tasks = max(
1361
1363
  0, queue.worker_concurrency - running_tasks_for_this_worker
1362
1364
  )
@@ -1371,16 +1373,14 @@ class SystemDatabase:
1371
1373
  available_tasks = max(0, queue.concurrency - total_running_tasks)
1372
1374
  max_tasks = min(max_tasks, available_tasks)
1373
1375
 
1374
- # Lookup tasks
1376
+ # Lookup unstarted/uncompleted tasks (not running)
1375
1377
  query = (
1376
1378
  sa.select(
1377
1379
  SystemSchema.workflow_queue.c.workflow_uuid,
1378
- SystemSchema.workflow_queue.c.started_at_epoch_ms,
1379
- SystemSchema.workflow_queue.c.executor_id,
1380
1380
  )
1381
1381
  .where(SystemSchema.workflow_queue.c.queue_name == queue.name)
1382
+ .where(SystemSchema.workflow_queue.c.started_at_epoch_ms == None)
1382
1383
  .where(SystemSchema.workflow_queue.c.completed_at_epoch_ms == None)
1383
- .where(SystemSchema.workflow_queue.c.executor_id == None)
1384
1384
  .order_by(SystemSchema.workflow_queue.c.created_at_epoch_ms.asc())
1385
1385
  .with_for_update(nowait=True) # Error out early
1386
1386
  )
@@ -1423,7 +1423,7 @@ class SystemDatabase:
1423
1423
  c.execute(
1424
1424
  SystemSchema.workflow_queue.update()
1425
1425
  .where(SystemSchema.workflow_queue.c.workflow_uuid == id)
1426
- .values(started_at_epoch_ms=start_time_ms, executor_id=executor_id)
1426
+ .values(started_at_epoch_ms=start_time_ms)
1427
1427
  )
1428
1428
  ret_ids.append(id)
1429
1429
 
@@ -1468,23 +1468,26 @@ class SystemDatabase:
1468
1468
 
1469
1469
  with self.engine.connect() as conn:
1470
1470
  with conn.begin() as transaction:
1471
+ # Reset the start time in the queue to mark it as not started
1471
1472
  res = conn.execute(
1472
1473
  sa.update(SystemSchema.workflow_queue)
1473
1474
  .where(SystemSchema.workflow_queue.c.workflow_uuid == workflow_id)
1474
- .values(executor_id=None, started_at_epoch_ms=None)
1475
+ .where(
1476
+ SystemSchema.workflow_queue.c.completed_at_epoch_ms.is_(None)
1477
+ )
1478
+ .values(started_at_epoch_ms=None)
1475
1479
  )
1476
1480
 
1477
- # If no rows were affected, the workflow is not anymore in the queue
1481
+ # If no rows were affected, the workflow is not anymore in the queue or was already completed
1478
1482
  if res.rowcount == 0:
1479
1483
  transaction.rollback()
1480
1484
  return False
1481
1485
 
1486
+ # Reset the status of the task to "ENQUEUED"
1482
1487
  res = conn.execute(
1483
1488
  sa.update(SystemSchema.workflow_status)
1484
1489
  .where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
1485
- .values(
1486
- executor_id=None, status=WorkflowStatusString.ENQUEUED.value
1487
- )
1490
+ .values(status=WorkflowStatusString.ENQUEUED.value)
1488
1491
  )
1489
1492
  if res.rowcount == 0:
1490
1493
  # This should never happen
@@ -28,7 +28,7 @@ dependencies = [
28
28
  ]
29
29
  requires-python = ">=3.9"
30
30
  readme = "README.md"
31
- version = "0.23.0a13"
31
+ version = "0.23.0a14"
32
32
 
33
33
  [project.license]
34
34
  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