Skip to content

Commit ad7b75d

Browse files
committed
Add NonDeterminism Tracking
1 parent 09fd459 commit ad7b75d

21 files changed

+1931
-477
lines changed

cadence/_internal/workflow/context.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from typing import Iterator, Optional, Any, Unpack, Type, cast
55

66
from cadence._internal.workflow.statemachine.decision_manager import DecisionManager
7-
from cadence._internal.workflow.decisions_helper import DecisionsHelper
87
from cadence.api.v1.common_pb2 import ActivityType
98
from cadence.api.v1.decision_pb2 import ScheduleActivityTaskDecisionAttributes
109
from cadence.api.v1.tasklist_pb2 import TaskList, TaskListKind
@@ -21,7 +20,6 @@ def __init__(
2120
self._info = info
2221
self._replay_mode = True
2322
self._replay_current_time_milliseconds: Optional[int] = None
24-
self._decision_helper = DecisionsHelper()
2523
self._decision_manager = decision_manager
2624

2725
def info(self) -> WorkflowInfo:
@@ -70,9 +68,7 @@ async def execute_activity(
7068
)
7169

7270
activity_input = self.data_converter().to_data(list(args))
73-
activity_id = self._decision_helper.generate_activity_id(activity)
7471
schedule_attributes = ScheduleActivityTaskDecisionAttributes(
75-
activity_id=activity_id,
7672
activity_type=ActivityType(name=activity),
7773
domain=self.info().workflow_domain,
7874
task_list=TaskList(kind=TaskListKind.TASK_LIST_KIND_NORMAL, name=task_list),

cadence/_internal/workflow/decisions_helper.py

Lines changed: 0 additions & 312 deletions
This file was deleted.

cadence/_internal/workflow/deterministic_event_loop.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import traceback
12
from asyncio import AbstractEventLoop, Handle, TimerHandle, futures, tasks, Future, Task
23
from contextvars import Context
34
import logging
@@ -9,6 +10,12 @@
910

1011
logger = logging.getLogger(__name__)
1112

13+
14+
class FatalDecisionError(Exception):
15+
def __init__(self, *args) -> None:
16+
super().__init__(*args)
17+
18+
1219
_Ts = TypeVarTuple("_Ts")
1320
_T = TypeVar("_T")
1421

@@ -455,9 +462,34 @@ def default_exception_handler(self, context: dict[str, Any]) -> None:
455462
)
456463

457464
def call_exception_handler(self, context: dict[str, Any]) -> None:
458-
raise NotImplementedError(
459-
"Custom exception handlers not supported in deterministic event loop"
460-
)
465+
message = context.get("message")
466+
if not message:
467+
message = "Unhandled exception in event loop"
468+
469+
exception = context.get("exception")
470+
if isinstance(exception, BaseException):
471+
exc_info = exception
472+
else:
473+
exc_info = None
474+
475+
log_lines = [message]
476+
for key in sorted(context):
477+
if key in {"message", "exception"}:
478+
continue
479+
value = context[key]
480+
if key == "source_traceback":
481+
tb = "".join(traceback.format_list(value))
482+
value = "Object created at (most recent call last):\n"
483+
value += tb.rstrip()
484+
elif key == "handle_traceback":
485+
tb = "".join(traceback.format_list(value))
486+
value = "Handle created at (most recent call last):\n"
487+
value += tb.rstrip()
488+
else:
489+
value = repr(value)
490+
log_lines.append(f"{key}: {value}")
491+
492+
logger.error("\n".join(log_lines), exc_info=exc_info)
461493

462494
# Task factory
463495
def set_task_factory( # type: ignore[override]

0 commit comments

Comments
 (0)