dbos 0.7.0a8__tar.gz → 0.7.1__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-0.7.0a8 → dbos-0.7.1}/PKG-INFO +1 -1
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/error.py +0 -11
- dbos-0.7.1/dbos/migrations/versions/50f3227f0b4b_fix_job_queue.py +34 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/queue.py +11 -4
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/system_database.py +12 -17
- {dbos-0.7.0a8 → dbos-0.7.1}/pyproject.toml +1 -1
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_dbos.py +22 -2
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_fastapi_roles.py +2 -2
- {dbos-0.7.0a8 → dbos-0.7.1}/LICENSE +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/README.md +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/__init__.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/admin_sever.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/application_database.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/cli.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/context.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/core.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/dbos-config.schema.json +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/dbos.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/dbos_config.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/decorators.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/fastapi.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/flask.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/kafka.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/kafka_message.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/logger.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/migrations/env.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/migrations/script.py.mako +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/migrations/versions/5c361fc04708_added_system_tables.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/py.typed +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/recovery.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/registrations.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/request.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/roles.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/scheduler/croniter.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/scheduler/scheduler.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/schemas/__init__.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/schemas/application_database.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/schemas/system_database.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/README.md +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/__package/__init__.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/__package/main.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/__package/schema.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/alembic.ini +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/dbos-config.yaml.dbos +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/migrations/env.py.dbos +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/migrations/script.py.mako +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/migrations/versions/2024_07_31_180642_init.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/start_postgres_docker.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/tracer.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/dbos/utils.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/__init__.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/atexit_no_ctor.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/atexit_no_launch.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/classdefs.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/conftest.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/more_classdefs.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/scheduler/test_croniter.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/scheduler/test_scheduler.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_admin_server.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_classdecorators.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_concurrency.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_config.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_failures.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_fastapi.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_flask.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_kafka.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_package.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_queue.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_schema_migration.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/tests/test_singleton.py +0 -0
- {dbos-0.7.0a8 → dbos-0.7.1}/version/__init__.py +0 -0
|
@@ -32,7 +32,6 @@ class DBOSErrorCode(Enum):
|
|
|
32
32
|
InitializationError = 3
|
|
33
33
|
WorkflowFunctionNotFound = 4
|
|
34
34
|
NonExistentWorkflowError = 5
|
|
35
|
-
DuplicateWorkflowEventError = 6
|
|
36
35
|
MaxStepRetriesExceeded = 7
|
|
37
36
|
NotAuthorized = 8
|
|
38
37
|
|
|
@@ -87,16 +86,6 @@ class DBOSNonExistentWorkflowError(DBOSException):
|
|
|
87
86
|
)
|
|
88
87
|
|
|
89
88
|
|
|
90
|
-
class DBOSDuplicateWorkflowEventError(DBOSException):
|
|
91
|
-
"""Exception raised when a workflow attempts to set an event value more than once per key."""
|
|
92
|
-
|
|
93
|
-
def __init__(self, workflow_id: str, key: str):
|
|
94
|
-
super().__init__(
|
|
95
|
-
f"Workflow {workflow_id} has already emitted an event with key {key}",
|
|
96
|
-
dbos_error_code=DBOSErrorCode.DuplicateWorkflowEventError.value,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
|
|
100
89
|
class DBOSNotAuthorizedError(DBOSException):
|
|
101
90
|
"""Exception raised by DBOS role-based security when the user is not authorized to access a function."""
|
|
102
91
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""fix_job_queue
|
|
2
|
+
|
|
3
|
+
Revision ID: 50f3227f0b4b
|
|
4
|
+
Revises: eab0cc1d9a14
|
|
5
|
+
Create Date: 2024-09-25 14:03:53.308068
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Sequence, Union
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision: str = "50f3227f0b4b"
|
|
15
|
+
down_revision: Union[str, None] = "eab0cc1d9a14"
|
|
16
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
17
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade() -> None:
|
|
21
|
+
op.drop_constraint("job_queue_pkey", "job_queue", schema="dbos", type_="primary")
|
|
22
|
+
|
|
23
|
+
op.create_primary_key(
|
|
24
|
+
"job_queue_pkey", "job_queue", ["workflow_uuid"], schema="dbos"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def downgrade() -> None:
|
|
29
|
+
# Reverting the changes
|
|
30
|
+
op.drop_constraint("job_queue_pkey", "job_queue", schema="dbos", type_="primary")
|
|
31
|
+
|
|
32
|
+
op.create_primary_key(
|
|
33
|
+
"job_queue_pkey", "job_queue", ["created_at_epoch_ms"], schema="dbos"
|
|
34
|
+
)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import threading
|
|
2
2
|
import time
|
|
3
|
+
import traceback
|
|
3
4
|
from typing import TYPE_CHECKING, Optional
|
|
4
5
|
|
|
5
6
|
from dbos.core import P, R, _execute_workflow_id, _start_workflow
|
|
6
|
-
from dbos.error import DBOSInitializationError
|
|
7
7
|
|
|
8
8
|
if TYPE_CHECKING:
|
|
9
9
|
from dbos.dbos import DBOS, Workflow, WorkflowHandle
|
|
@@ -31,6 +31,13 @@ def queue_thread(stop_event: threading.Event, dbos: "DBOS") -> None:
|
|
|
31
31
|
while not stop_event.is_set():
|
|
32
32
|
time.sleep(1)
|
|
33
33
|
for queue_name, queue in dbos._registry.queue_info_map.items():
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
try:
|
|
35
|
+
wf_ids = dbos._sys_db.start_queued_workflows(
|
|
36
|
+
queue_name, queue.concurrency
|
|
37
|
+
)
|
|
38
|
+
for id in wf_ids:
|
|
39
|
+
_execute_workflow_id(dbos, id)
|
|
40
|
+
except Exception:
|
|
41
|
+
dbos.logger.warning(
|
|
42
|
+
f"Exception encountered in queue thread: {traceback.format_exc()}"
|
|
43
|
+
)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
2
|
import os
|
|
3
|
-
import select
|
|
4
3
|
import threading
|
|
5
4
|
import time
|
|
6
5
|
from enum import Enum
|
|
@@ -14,11 +13,7 @@ from alembic.config import Config
|
|
|
14
13
|
from sqlalchemy.exc import DBAPIError
|
|
15
14
|
|
|
16
15
|
import dbos.utils as utils
|
|
17
|
-
from dbos.error import
|
|
18
|
-
DBOSDuplicateWorkflowEventError,
|
|
19
|
-
DBOSNonExistentWorkflowError,
|
|
20
|
-
DBOSWorkflowConflictIDError,
|
|
21
|
-
)
|
|
16
|
+
from dbos.error import DBOSNonExistentWorkflowError, DBOSWorkflowConflictIDError
|
|
22
17
|
|
|
23
18
|
from .dbos_config import ConfigFile
|
|
24
19
|
from .logger import dbos_logger
|
|
@@ -832,18 +827,18 @@ class SystemDatabase:
|
|
|
832
827
|
if recorded_output is not None:
|
|
833
828
|
return # Already sent before
|
|
834
829
|
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
)
|
|
830
|
+
c.execute(
|
|
831
|
+
pg.insert(SystemSchema.workflow_events)
|
|
832
|
+
.values(
|
|
833
|
+
workflow_uuid=workflow_uuid,
|
|
834
|
+
key=key,
|
|
835
|
+
value=utils.serialize(message),
|
|
842
836
|
)
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
837
|
+
.on_conflict_do_update(
|
|
838
|
+
index_elements=["workflow_uuid", "key"],
|
|
839
|
+
set_={"value": utils.serialize(message)},
|
|
840
|
+
)
|
|
841
|
+
)
|
|
847
842
|
output: OperationResultInternal = {
|
|
848
843
|
"workflow_uuid": workflow_uuid,
|
|
849
844
|
"function_id": function_id,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import datetime
|
|
2
|
+
import threading
|
|
2
3
|
import time
|
|
3
4
|
import uuid
|
|
4
|
-
from typing import
|
|
5
|
+
from typing import Optional
|
|
5
6
|
|
|
6
7
|
import pytest
|
|
7
8
|
import sqlalchemy as sa
|
|
@@ -13,7 +14,6 @@ from dbos import DBOS, ConfigFile, SetWorkflowID, WorkflowHandle, WorkflowStatus
|
|
|
13
14
|
from dbos.context import assert_current_dbos_context, get_local_dbos_context
|
|
14
15
|
from dbos.error import DBOSMaxStepRetriesExceeded
|
|
15
16
|
from dbos.system_database import GetWorkflowsInput
|
|
16
|
-
from tests.conftest import default_config
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def test_simple_workflow(dbos: DBOS) -> None:
|
|
@@ -882,3 +882,23 @@ def test_set_get_events(dbos: DBOS) -> None:
|
|
|
882
882
|
with pytest.raises(Exception) as exc_info:
|
|
883
883
|
dbos.set_event("key1", "value1")
|
|
884
884
|
assert "set_event() must be called from within a workflow" in str(exc_info.value)
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
def test_multi_set_event(dbos: DBOS) -> None:
|
|
888
|
+
event = threading.Event()
|
|
889
|
+
|
|
890
|
+
wfid = str(uuid.uuid4())
|
|
891
|
+
|
|
892
|
+
@DBOS.workflow()
|
|
893
|
+
def test_setevent_workflow() -> None:
|
|
894
|
+
assert DBOS.workflow_id == wfid
|
|
895
|
+
DBOS.set_event("key", "value1")
|
|
896
|
+
event.wait()
|
|
897
|
+
DBOS.set_event("key", "value2")
|
|
898
|
+
|
|
899
|
+
with SetWorkflowID(wfid):
|
|
900
|
+
handle = DBOS.start_workflow(test_setevent_workflow)
|
|
901
|
+
assert DBOS.get_event(wfid, "key") == "value1"
|
|
902
|
+
event.set()
|
|
903
|
+
assert handle.get_result() == None
|
|
904
|
+
assert DBOS.get_event(wfid, "key") == "value2"
|
|
@@ -18,7 +18,7 @@ from dbos import DBOS, DBOSContextEnsure
|
|
|
18
18
|
|
|
19
19
|
# Private API because this is a unit test
|
|
20
20
|
from dbos.context import assert_current_dbos_context
|
|
21
|
-
from dbos.error import
|
|
21
|
+
from dbos.error import DBOSInitializationError, DBOSNotAuthorizedError
|
|
22
22
|
from dbos.system_database import GetWorkflowsInput
|
|
23
23
|
from dbos.tracer import dbos_tracer
|
|
24
24
|
|
|
@@ -54,7 +54,7 @@ def test_simple_endpoint(dbos_fastapi: Tuple[DBOS, FastAPI]) -> None:
|
|
|
54
54
|
|
|
55
55
|
@app.get("/dbosinternalerror")
|
|
56
56
|
def test_dbos_error_internal() -> None:
|
|
57
|
-
raise
|
|
57
|
+
raise DBOSInitializationError("oh no")
|
|
58
58
|
|
|
59
59
|
@app.get("/open/{var1}")
|
|
60
60
|
@DBOS.required_roles([])
|
|
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
|
{dbos-0.7.0a8 → dbos-0.7.1}/dbos/templates/hello/migrations/versions/2024_07_31_180642_init.py
RENAMED
|
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
|