dbos 1.3.0a2__tar.gz → 1.3.0a3__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.
- {dbos-1.3.0a2 → dbos-1.3.0a3}/PKG-INFO +1 -1
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_client.py +8 -1
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_core.py +22 -13
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_dbos.py +2 -0
- dbos-1.3.0a3/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +71 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_queue.py +11 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_schemas/system_database.py +9 -52
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_sys_db.py +112 -246
- {dbos-1.3.0a2 → dbos-1.3.0a3}/pyproject.toml +1 -1
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/client_collateral.py +1 -1
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/conftest.py +12 -1
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_dbos.py +1 -23
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_fastapi.py +1 -23
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_flask.py +1 -23
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_queue.py +2 -2
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_scheduler.py +1 -23
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_schema_migration.py +0 -4
- {dbos-1.3.0a2 → dbos-1.3.0a3}/LICENSE +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/README.md +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/__init__.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/__main__.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_admin_server.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_app_db.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_classproperty.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_conductor/conductor.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_conductor/protocol.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_context.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_croniter.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_dbos_config.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_debug.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_docker_pg_helper.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_error.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_event_loop.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_fastapi.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_flask.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_kafka.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_kafka_message.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_logger.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/env.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/script.py.mako +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_outcome.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_recovery.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_registrations.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_roles.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_scheduler.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_schemas/__init__.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_schemas/application_database.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_serialization.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/README.md +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_tracer.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_utils.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/_workflow_commands.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/cli/_github_init.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/cli/_template_init.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/cli/cli.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/dbos-config.schema.json +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/dbos/py.typed +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/__init__.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/atexit_no_ctor.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/atexit_no_launch.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/classdefs.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/client_worker.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/dupname_classdefs1.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/dupname_classdefsa.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/more_classdefs.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/queuedworkflow.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_admin_server.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_async.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_classdecorators.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_cli.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_client.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_concurrency.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_config.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_croniter.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_debug.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_docker_secrets.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_failures.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_fastapi_roles.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_kafka.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_outcome.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_package.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_singleton.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_spans.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_sqlalchemy.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_workflow_introspection.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/tests/test_workflow_management.py +0 -0
- {dbos-1.3.0a2 → dbos-1.3.0a3}/version/__init__.py +0 -0
@@ -163,6 +163,12 @@ class DBOSClient:
|
|
163
163
|
int(workflow_timeout * 1000) if workflow_timeout is not None else None
|
164
164
|
),
|
165
165
|
"workflow_deadline_epoch_ms": None,
|
166
|
+
"deduplication_id": enqueue_options_internal["deduplication_id"],
|
167
|
+
"priority": (
|
168
|
+
enqueue_options_internal["priority"]
|
169
|
+
if enqueue_options_internal["priority"] is not None
|
170
|
+
else 0
|
171
|
+
),
|
166
172
|
}
|
167
173
|
|
168
174
|
inputs: WorkflowInputs = {
|
@@ -174,7 +180,6 @@ class DBOSClient:
|
|
174
180
|
status,
|
175
181
|
_serialization.serialize_args(inputs),
|
176
182
|
max_recovery_attempts=None,
|
177
|
-
enqueue_options=enqueue_options_internal,
|
178
183
|
)
|
179
184
|
return workflow_id
|
180
185
|
|
@@ -230,6 +235,8 @@ class DBOSClient:
|
|
230
235
|
"app_version": None,
|
231
236
|
"workflow_timeout_ms": None,
|
232
237
|
"workflow_deadline_epoch_ms": None,
|
238
|
+
"deduplication_id": None,
|
239
|
+
"priority": 0,
|
233
240
|
}
|
234
241
|
with self._sys_db.engine.begin() as conn:
|
235
242
|
self._sys_db._insert_workflow_status(
|
@@ -279,6 +279,18 @@ def _init_workflow(
|
|
279
279
|
"updated_at": None,
|
280
280
|
"workflow_timeout_ms": workflow_timeout_ms,
|
281
281
|
"workflow_deadline_epoch_ms": workflow_deadline_epoch_ms,
|
282
|
+
"deduplication_id": (
|
283
|
+
enqueue_options["deduplication_id"] if enqueue_options is not None else None
|
284
|
+
),
|
285
|
+
"priority": (
|
286
|
+
(
|
287
|
+
enqueue_options["priority"]
|
288
|
+
if enqueue_options["priority"] is not None
|
289
|
+
else 0
|
290
|
+
)
|
291
|
+
if enqueue_options is not None
|
292
|
+
else 0
|
293
|
+
),
|
282
294
|
}
|
283
295
|
|
284
296
|
# If we have a class name, the first arg is the instance and do not serialize
|
@@ -290,7 +302,6 @@ def _init_workflow(
|
|
290
302
|
status,
|
291
303
|
_serialization.serialize_args(inputs),
|
292
304
|
max_recovery_attempts=max_recovery_attempts,
|
293
|
-
enqueue_options=enqueue_options,
|
294
305
|
)
|
295
306
|
|
296
307
|
if workflow_deadline_epoch_ms is not None:
|
@@ -342,13 +353,12 @@ def _get_wf_invoke_func(
|
|
342
353
|
return recorded_result
|
343
354
|
try:
|
344
355
|
output = func()
|
345
|
-
status["status"] = "SUCCESS"
|
346
|
-
status["output"] = _serialization.serialize(output)
|
347
356
|
if not dbos.debug_mode:
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
357
|
+
dbos._sys_db.update_workflow_outcome(
|
358
|
+
status["workflow_uuid"],
|
359
|
+
"SUCCESS",
|
360
|
+
output=_serialization.serialize(output),
|
361
|
+
)
|
352
362
|
return output
|
353
363
|
except DBOSWorkflowConflictIDError:
|
354
364
|
# Await the workflow result
|
@@ -357,13 +367,12 @@ def _get_wf_invoke_func(
|
|
357
367
|
except DBOSWorkflowCancelledError as error:
|
358
368
|
raise
|
359
369
|
except Exception as error:
|
360
|
-
status["status"] = "ERROR"
|
361
|
-
status["error"] = _serialization.serialize_exception(error)
|
362
370
|
if not dbos.debug_mode:
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
371
|
+
dbos._sys_db.update_workflow_outcome(
|
372
|
+
status["workflow_uuid"],
|
373
|
+
"ERROR",
|
374
|
+
error=_serialization.serialize_exception(error),
|
375
|
+
)
|
367
376
|
raise
|
368
377
|
|
369
378
|
return persist
|
@@ -215,6 +215,8 @@ class DBOSRegistry:
|
|
215
215
|
sources = sorted(
|
216
216
|
[inspect.getsource(wf) for wf in self.workflow_info_map.values()]
|
217
217
|
)
|
218
|
+
# Different DBOS versions should produce different app versions
|
219
|
+
sources.append(GlobalParams.dbos_version)
|
218
220
|
for source in sources:
|
219
221
|
hasher.update(source.encode("utf-8"))
|
220
222
|
return hasher.hexdigest()
|
@@ -0,0 +1,71 @@
|
|
1
|
+
"""consolidate_queues
|
2
|
+
|
3
|
+
Revision ID: 66478e1b95e5
|
4
|
+
Revises: 933e86bdac6a
|
5
|
+
Create Date: 2025-05-21 10:14:25.674613
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
from typing import Sequence, Union
|
10
|
+
|
11
|
+
import sqlalchemy as sa
|
12
|
+
from alembic import op
|
13
|
+
|
14
|
+
# revision identifiers, used by Alembic.
|
15
|
+
revision: str = "66478e1b95e5"
|
16
|
+
down_revision: Union[str, None] = "933e86bdac6a"
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
18
|
+
depends_on: Union[str, Sequence[str], None] = None
|
19
|
+
|
20
|
+
|
21
|
+
def upgrade() -> None:
|
22
|
+
# Add new columns to workflow_status table
|
23
|
+
op.add_column(
|
24
|
+
"workflow_status",
|
25
|
+
sa.Column("started_at_epoch_ms", sa.BigInteger(), nullable=True),
|
26
|
+
schema="dbos",
|
27
|
+
)
|
28
|
+
|
29
|
+
op.add_column(
|
30
|
+
"workflow_status",
|
31
|
+
sa.Column("deduplication_id", sa.Text(), nullable=True),
|
32
|
+
schema="dbos",
|
33
|
+
)
|
34
|
+
|
35
|
+
op.add_column(
|
36
|
+
"workflow_status",
|
37
|
+
sa.Column(
|
38
|
+
"priority", sa.Integer(), nullable=False, server_default=sa.text("'0'::int")
|
39
|
+
),
|
40
|
+
schema="dbos",
|
41
|
+
)
|
42
|
+
|
43
|
+
# Add unique constraint for deduplication_id
|
44
|
+
op.create_unique_constraint(
|
45
|
+
"uq_workflow_status_queue_name_dedup_id",
|
46
|
+
"workflow_status",
|
47
|
+
["queue_name", "deduplication_id"],
|
48
|
+
schema="dbos",
|
49
|
+
)
|
50
|
+
|
51
|
+
# Add index on status field
|
52
|
+
op.create_index(
|
53
|
+
"workflow_status_status_index", "workflow_status", ["status"], schema="dbos"
|
54
|
+
)
|
55
|
+
|
56
|
+
|
57
|
+
def downgrade() -> None:
|
58
|
+
# Drop indexes
|
59
|
+
op.drop_index(
|
60
|
+
"workflow_status_status_index", table_name="workflow_status", schema="dbos"
|
61
|
+
)
|
62
|
+
|
63
|
+
# Drop unique constraint
|
64
|
+
op.drop_constraint(
|
65
|
+
"uq_workflow_status_queue_name_dedup_id", "workflow_status", schema="dbos"
|
66
|
+
)
|
67
|
+
|
68
|
+
# Drop columns
|
69
|
+
op.drop_column("workflow_status", "priority", schema="dbos")
|
70
|
+
op.drop_column("workflow_status", "deduplication_id", schema="dbos")
|
71
|
+
op.drop_column("workflow_status", "started_at_epoch_ms", schema="dbos")
|
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Any, Callable, Coroutine, Optional, TypedDict
|
|
5
5
|
from psycopg import errors
|
6
6
|
from sqlalchemy.exc import OperationalError
|
7
7
|
|
8
|
+
from dbos._context import get_local_dbos_context
|
8
9
|
from dbos._logger import dbos_logger
|
9
10
|
from dbos._utils import GlobalParams
|
10
11
|
|
@@ -41,6 +42,7 @@ class Queue:
|
|
41
42
|
limiter: Optional[QueueRateLimit] = None,
|
42
43
|
*, # Disable positional arguments from here on
|
43
44
|
worker_concurrency: Optional[int] = None,
|
45
|
+
priority_enabled: bool = False,
|
44
46
|
) -> None:
|
45
47
|
if (
|
46
48
|
worker_concurrency is not None
|
@@ -54,6 +56,7 @@ class Queue:
|
|
54
56
|
self.concurrency = concurrency
|
55
57
|
self.worker_concurrency = worker_concurrency
|
56
58
|
self.limiter = limiter
|
59
|
+
self.priority_enabled = priority_enabled
|
57
60
|
from ._dbos import _get_or_create_dbos_registry
|
58
61
|
|
59
62
|
registry = _get_or_create_dbos_registry()
|
@@ -66,6 +69,14 @@ class Queue:
|
|
66
69
|
) -> "WorkflowHandle[R]":
|
67
70
|
from ._dbos import _get_dbos_instance
|
68
71
|
|
72
|
+
context = get_local_dbos_context()
|
73
|
+
if (
|
74
|
+
context is not None
|
75
|
+
and context.priority is not None
|
76
|
+
and not self.priority_enabled
|
77
|
+
):
|
78
|
+
dbos_logger.warning(f"Priority is not enabled for queue {self.name}. Setting priority will not have any effect.")
|
79
|
+
|
69
80
|
dbos = _get_dbos_instance()
|
70
81
|
return start_workflow(dbos, func, self.name, False, *args, **kwargs)
|
71
82
|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
from sqlalchemy import (
|
2
2
|
BigInteger,
|
3
|
-
Boolean,
|
4
3
|
Column,
|
5
4
|
ForeignKey,
|
6
5
|
Index,
|
@@ -57,8 +56,17 @@ class SystemSchema:
|
|
57
56
|
Column("queue_name", Text, nullable=True),
|
58
57
|
Column("workflow_timeout_ms", BigInteger, nullable=True),
|
59
58
|
Column("workflow_deadline_epoch_ms", BigInteger, nullable=True),
|
59
|
+
Column("started_at_epoch_ms", BigInteger(), nullable=True),
|
60
|
+
Column("deduplication_id", Text(), nullable=True),
|
61
|
+
Column("priority", Integer(), nullable=False, server_default=text("'0'::int")),
|
60
62
|
Index("workflow_status_created_at_index", "created_at"),
|
61
63
|
Index("workflow_status_executor_id_index", "executor_id"),
|
64
|
+
Index("workflow_status_status_index", "status"),
|
65
|
+
UniqueConstraint(
|
66
|
+
"queue_name",
|
67
|
+
"deduplication_id",
|
68
|
+
name="uq_workflow_status_queue_name_dedup_id",
|
69
|
+
),
|
62
70
|
)
|
63
71
|
|
64
72
|
operation_outputs = Table(
|
@@ -138,54 +146,3 @@ class SystemSchema:
|
|
138
146
|
Column("value", Text, nullable=False),
|
139
147
|
PrimaryKeyConstraint("workflow_uuid", "key"),
|
140
148
|
)
|
141
|
-
|
142
|
-
scheduler_state = Table(
|
143
|
-
"scheduler_state",
|
144
|
-
metadata_obj,
|
145
|
-
Column("workflow_fn_name", Text, primary_key=True, nullable=False),
|
146
|
-
Column("last_run_time", BigInteger, nullable=False),
|
147
|
-
)
|
148
|
-
|
149
|
-
workflow_queue = Table(
|
150
|
-
"workflow_queue",
|
151
|
-
metadata_obj,
|
152
|
-
Column(
|
153
|
-
"workflow_uuid",
|
154
|
-
Text,
|
155
|
-
ForeignKey(
|
156
|
-
"workflow_status.workflow_uuid", onupdate="CASCADE", ondelete="CASCADE"
|
157
|
-
),
|
158
|
-
nullable=False,
|
159
|
-
primary_key=True,
|
160
|
-
),
|
161
|
-
# Column("executor_id", Text), # This column is deprecated. Do *not* use it.
|
162
|
-
Column("queue_name", Text, nullable=False),
|
163
|
-
Column(
|
164
|
-
"created_at_epoch_ms",
|
165
|
-
BigInteger,
|
166
|
-
nullable=False,
|
167
|
-
server_default=text("(EXTRACT(epoch FROM now()) * 1000::numeric)::bigint"),
|
168
|
-
),
|
169
|
-
Column(
|
170
|
-
"started_at_epoch_ms",
|
171
|
-
BigInteger(),
|
172
|
-
),
|
173
|
-
Column(
|
174
|
-
"completed_at_epoch_ms",
|
175
|
-
BigInteger(),
|
176
|
-
),
|
177
|
-
Column(
|
178
|
-
"deduplication_id",
|
179
|
-
Text,
|
180
|
-
nullable=True,
|
181
|
-
),
|
182
|
-
Column(
|
183
|
-
"priority",
|
184
|
-
Integer,
|
185
|
-
nullable=False,
|
186
|
-
server_default=text("'0'::int"),
|
187
|
-
),
|
188
|
-
UniqueConstraint(
|
189
|
-
"queue_name", "deduplication_id", name="uq_workflow_queue_name_dedup_id"
|
190
|
-
),
|
191
|
-
)
|