dbos 1.1.0a3__py3-none-any.whl → 1.1.0a4__py3-none-any.whl
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/_context.py +6 -0
- dbos/_error.py +14 -0
- dbos/_sys_db.py +22 -4
- {dbos-1.1.0a3.dist-info → dbos-1.1.0a4.dist-info}/METADATA +1 -1
- {dbos-1.1.0a3.dist-info → dbos-1.1.0a4.dist-info}/RECORD +8 -8
- {dbos-1.1.0a3.dist-info → dbos-1.1.0a4.dist-info}/WHEEL +0 -0
- {dbos-1.1.0a3.dist-info → dbos-1.1.0a4.dist-info}/entry_points.txt +0 -0
- {dbos-1.1.0a3.dist-info → dbos-1.1.0a4.dist-info}/licenses/LICENSE +0 -0
dbos/_context.py
CHANGED
@@ -392,6 +392,7 @@ class SetWorkflowTimeout:
|
|
392
392
|
else None
|
393
393
|
)
|
394
394
|
self.saved_workflow_timeout: Optional[int] = None
|
395
|
+
self.saved_workflow_deadline_epoch_ms: Optional[int] = None
|
395
396
|
|
396
397
|
def __enter__(self) -> SetWorkflowTimeout:
|
397
398
|
# Code to create a basic context
|
@@ -402,6 +403,8 @@ class SetWorkflowTimeout:
|
|
402
403
|
ctx = assert_current_dbos_context()
|
403
404
|
self.saved_workflow_timeout = ctx.workflow_timeout_ms
|
404
405
|
ctx.workflow_timeout_ms = self.workflow_timeout_ms
|
406
|
+
self.saved_workflow_deadline_epoch_ms = ctx.workflow_deadline_epoch_ms
|
407
|
+
ctx.workflow_deadline_epoch_ms = None
|
405
408
|
return self
|
406
409
|
|
407
410
|
def __exit__(
|
@@ -411,6 +414,9 @@ class SetWorkflowTimeout:
|
|
411
414
|
traceback: Optional[TracebackType],
|
412
415
|
) -> Literal[False]:
|
413
416
|
assert_current_dbos_context().workflow_timeout_ms = self.saved_workflow_timeout
|
417
|
+
assert_current_dbos_context().workflow_deadline_epoch_ms = (
|
418
|
+
self.saved_workflow_deadline_epoch_ms
|
419
|
+
)
|
414
420
|
# Code to clean up the basic context if we created it
|
415
421
|
if self.created_ctx:
|
416
422
|
_clear_local_dbos_context()
|
dbos/_error.py
CHANGED
@@ -62,6 +62,7 @@ class DBOSErrorCode(Enum):
|
|
62
62
|
WorkflowCancelled = 10
|
63
63
|
UnexpectedStep = 11
|
64
64
|
QueueDeduplicated = 12
|
65
|
+
AwaitedWorkflowCancelled = 13
|
65
66
|
ConflictingRegistrationError = 25
|
66
67
|
|
67
68
|
|
@@ -206,6 +207,19 @@ class DBOSQueueDeduplicatedError(DBOSException):
|
|
206
207
|
)
|
207
208
|
|
208
209
|
|
210
|
+
class DBOSAwaitedWorkflowCancelledError(DBOSException):
|
211
|
+
def __init__(self, workflow_id: str):
|
212
|
+
self.workflow_id = workflow_id
|
213
|
+
super().__init__(
|
214
|
+
f"Awaited workflow {workflow_id} was cancelled",
|
215
|
+
dbos_error_code=DBOSErrorCode.AwaitedWorkflowCancelled.value,
|
216
|
+
)
|
217
|
+
|
218
|
+
def __reduce__(self) -> Any:
|
219
|
+
# Tell jsonpickle how to reconstruct this object
|
220
|
+
return (self.__class__, (self.workflow_id,))
|
221
|
+
|
222
|
+
|
209
223
|
#######################################
|
210
224
|
## BaseException
|
211
225
|
#######################################
|
dbos/_sys_db.py
CHANGED
@@ -32,6 +32,7 @@ from dbos._utils import INTERNAL_QUEUE_NAME
|
|
32
32
|
from . import _serialization
|
33
33
|
from ._context import get_local_dbos_context
|
34
34
|
from ._error import (
|
35
|
+
DBOSAwaitedWorkflowCancelledError,
|
35
36
|
DBOSConflictingWorkflowError,
|
36
37
|
DBOSDeadLetterQueueError,
|
37
38
|
DBOSNonExistentWorkflowError,
|
@@ -96,6 +97,10 @@ class WorkflowStatus:
|
|
96
97
|
executor_id: Optional[str]
|
97
98
|
# The application version on which this workflow was started
|
98
99
|
app_version: Optional[str]
|
100
|
+
# The start-to-close timeout of the workflow in ms
|
101
|
+
workflow_timeout_ms: Optional[int]
|
102
|
+
# The deadline of a workflow, computed by adding its timeout to its start time.
|
103
|
+
workflow_deadline_epoch_ms: Optional[int]
|
99
104
|
|
100
105
|
# INTERNAL FIELDS
|
101
106
|
|
@@ -761,9 +766,9 @@ class SystemDatabase:
|
|
761
766
|
error = row[2]
|
762
767
|
raise _serialization.deserialize_exception(error)
|
763
768
|
elif status == WorkflowStatusString.CANCELLED.value:
|
764
|
-
# Raise
|
769
|
+
# Raise AwaitedWorkflowCancelledError here, not the cancellation exception
|
765
770
|
# because the awaiting workflow is not being cancelled.
|
766
|
-
raise
|
771
|
+
raise DBOSAwaitedWorkflowCancelledError(workflow_id)
|
767
772
|
else:
|
768
773
|
pass # CB: I guess we're assuming the WF will show up eventually.
|
769
774
|
time.sleep(1)
|
@@ -837,6 +842,8 @@ class SystemDatabase:
|
|
837
842
|
SystemSchema.workflow_inputs.c.inputs,
|
838
843
|
SystemSchema.workflow_status.c.output,
|
839
844
|
SystemSchema.workflow_status.c.error,
|
845
|
+
SystemSchema.workflow_status.c.workflow_deadline_epoch_ms,
|
846
|
+
SystemSchema.workflow_status.c.workflow_timeout_ms,
|
840
847
|
).join(
|
841
848
|
SystemSchema.workflow_inputs,
|
842
849
|
SystemSchema.workflow_status.c.workflow_uuid
|
@@ -918,6 +925,8 @@ class SystemDatabase:
|
|
918
925
|
info.input = inputs
|
919
926
|
info.output = output
|
920
927
|
info.error = exception
|
928
|
+
info.workflow_deadline_epoch_ms = row[18]
|
929
|
+
info.workflow_timeout_ms = row[19]
|
921
930
|
|
922
931
|
infos.append(info)
|
923
932
|
return infos
|
@@ -947,6 +956,8 @@ class SystemDatabase:
|
|
947
956
|
SystemSchema.workflow_inputs.c.inputs,
|
948
957
|
SystemSchema.workflow_status.c.output,
|
949
958
|
SystemSchema.workflow_status.c.error,
|
959
|
+
SystemSchema.workflow_status.c.workflow_deadline_epoch_ms,
|
960
|
+
SystemSchema.workflow_status.c.workflow_timeout_ms,
|
950
961
|
).select_from(
|
951
962
|
SystemSchema.workflow_queue.join(
|
952
963
|
SystemSchema.workflow_status,
|
@@ -1024,6 +1035,8 @@ class SystemDatabase:
|
|
1024
1035
|
info.input = inputs
|
1025
1036
|
info.output = output
|
1026
1037
|
info.error = exception
|
1038
|
+
info.workflow_deadline_epoch_ms = row[18]
|
1039
|
+
info.workflow_timeout_ms = row[19]
|
1027
1040
|
|
1028
1041
|
infos.append(info)
|
1029
1042
|
|
@@ -1827,8 +1840,13 @@ class SystemDatabase:
|
|
1827
1840
|
# If a timeout is set, set the deadline on dequeue
|
1828
1841
|
workflow_deadline_epoch_ms=sa.case(
|
1829
1842
|
(
|
1830
|
-
|
1831
|
-
|
1843
|
+
sa.and_(
|
1844
|
+
SystemSchema.workflow_status.c.workflow_timeout_ms.isnot(
|
1845
|
+
None
|
1846
|
+
),
|
1847
|
+
SystemSchema.workflow_status.c.workflow_deadline_epoch_ms.is_(
|
1848
|
+
None
|
1849
|
+
),
|
1832
1850
|
),
|
1833
1851
|
sa.func.extract("epoch", sa.func.now()) * 1000
|
1834
1852
|
+ SystemSchema.workflow_status.c.workflow_timeout_ms,
|
@@ -1,7 +1,7 @@
|
|
1
|
-
dbos-1.1.
|
2
|
-
dbos-1.1.
|
3
|
-
dbos-1.1.
|
4
|
-
dbos-1.1.
|
1
|
+
dbos-1.1.0a4.dist-info/METADATA,sha256=U7kpwMutGlWwRdkgX-Zt_y9g_6hPYwZ5NFyMbTW4S48,13267
|
2
|
+
dbos-1.1.0a4.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
|
3
|
+
dbos-1.1.0a4.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
|
4
|
+
dbos-1.1.0a4.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
|
5
5
|
dbos/__init__.py,sha256=NssPCubaBxdiKarOWa-wViz1hdJSkmBGcpLX_gQ4NeA,891
|
6
6
|
dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
|
7
7
|
dbos/_admin_server.py,sha256=A_28_nJ1nBBYDmCxtklJR9O2v14JRMtD1rAo_D4y8Kc,9764
|
@@ -10,14 +10,14 @@ dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
|
|
10
10
|
dbos/_client.py,sha256=-nK2GjS9D0qnD2DkRDs7gKxNECwYlsvW6hFCjADlnv0,14186
|
11
11
|
dbos/_conductor/conductor.py,sha256=o0IaZjwnZ2TOyHeP2H4iSX6UnXLXQ4uODvWAKD9hHMs,21703
|
12
12
|
dbos/_conductor/protocol.py,sha256=wgOFZxmS81bv0WCB9dAyg0s6QzldpzVKQDoSPeaX0Ws,6967
|
13
|
-
dbos/_context.py,sha256=
|
13
|
+
dbos/_context.py,sha256=5ajoWAmToAfzzmMLylnJZoL4Ny9rBwZWuG05sXadMIA,24798
|
14
14
|
dbos/_core.py,sha256=UDpSgRA9m_YuViNXR9tVgNFLC-zxKZPxjlkj2a-Kj00,48317
|
15
15
|
dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
|
16
16
|
dbos/_dbos.py,sha256=f5s9cVgsiMkAkpvctLHE6sjVAEuC-eFEpRddYBIKxiA,46430
|
17
17
|
dbos/_dbos_config.py,sha256=IufNrIC-M2xSNTXyT_KXlEdfB3j03pPLv_nE0fEq4_U,20955
|
18
18
|
dbos/_debug.py,sha256=MNlQVZ6TscGCRQeEEL0VE8Uignvr6dPeDDDefS3xgIE,1823
|
19
19
|
dbos/_docker_pg_helper.py,sha256=tLJXWqZ4S-ExcaPnxg_i6cVxL6ZxrYlZjaGsklY-s2I,6115
|
20
|
-
dbos/_error.py,sha256=
|
20
|
+
dbos/_error.py,sha256=q0OQJZTbR8FFHV9hEpAGpz9oWBT5L509zUhmyff7FJw,8500
|
21
21
|
dbos/_event_loop.py,sha256=NmaLbEQFfEK36S_0KhVD39YdYrGce3qSKCTJ-5RqKQ0,2136
|
22
22
|
dbos/_fastapi.py,sha256=m4SL3H9P-NBQ_ZrbFxAWMOqNyIi3HGEn2ODR7xAK038,3118
|
23
23
|
dbos/_flask.py,sha256=Npnakt-a3W5OykONFRkDRnumaDhTQmA0NPdUCGRYKXE,1652
|
@@ -47,7 +47,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
dbos/_schemas/application_database.py,sha256=SypAS9l9EsaBHFn9FR8jmnqt01M74d9AF1AMa4m2hhI,1040
|
48
48
|
dbos/_schemas/system_database.py,sha256=3Z0L72bOgHnusK1hBaETWU9RfiLBP0QnS-fdu41i0yY,5835
|
49
49
|
dbos/_serialization.py,sha256=bWuwhXSQcGmiazvhJHA5gwhrRWxtmFmcCFQSDJnqqkU,3666
|
50
|
-
dbos/_sys_db.py,sha256=
|
50
|
+
dbos/_sys_db.py,sha256=gVa5arMBT8rKHkycPS8HyRzfvQdQRxYqIclw0Fcp6CM,84240
|
51
51
|
dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
|
52
52
|
dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
53
53
|
dbos/_templates/dbos-db-starter/__package/main.py.dbos,sha256=aQnBPSSQpkB8ERfhf7gB7P9tsU6OPKhZscfeh0yiaD8,2702
|
@@ -67,4 +67,4 @@ dbos/cli/cli.py,sha256=HinoCGrAUTiSeq7AAoCFfhdiE0uDw7vLMuDMN1_YTLI,20705
|
|
67
67
|
dbos/dbos-config.schema.json,sha256=CjaspeYmOkx6Ip_pcxtmfXJTn_YGdSx_0pcPBF7KZmo,6060
|
68
68
|
dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
|
69
69
|
version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
|
70
|
-
dbos-1.1.
|
70
|
+
dbos-1.1.0a4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|