Skip to content

Commit 7299487

Browse files
committed
fix: fixes for failures in build
Signed-off-by: Samantha Coyle <sam@diagrid.io>
1 parent 79c84e1 commit 7299487

6 files changed

Lines changed: 31 additions & 22 deletions

File tree

durabletask/task.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -434,31 +434,26 @@ def compute_next_delay(self) -> Optional[timedelta]:
434434
else:
435435
backoff_coefficient = self._retry_policy.backoff_coefficient
436436

437-
# Compute a deterministic "logical now" based on start time and accumulated delays,
438-
# rather than wall-clock time, to avoid non-determinism during replay.
437+
# Compute the next delay and the logical start time of the next attempt
438+
# deterministically from accumulated delays, avoiding non-determinism during replay.
439+
# range(1, attempt_count + 1) sums all delays up to and including the one about to
440+
# be taken, so we're checking whether attempt N+1 would start within the timeout.
439441
total_elapsed_seconds = 0.0
440-
for i in range(1, self._attempt_count):
441-
attempt_delay = (
442+
next_delay_f = 0.0
443+
for i in range(1, self._attempt_count + 1):
444+
next_delay_f = (
442445
math.pow(backoff_coefficient, i - 1)
443446
* self._retry_policy.first_retry_interval.total_seconds()
444447
)
445448
if self._retry_policy.max_retry_interval is not None:
446-
attempt_delay = min(
447-
attempt_delay,
449+
next_delay_f = min(
450+
next_delay_f,
448451
self._retry_policy.max_retry_interval.total_seconds(),
449452
)
450-
total_elapsed_seconds += attempt_delay
451-
logical_now = self._start_time + timedelta(seconds=total_elapsed_seconds)
452-
if logical_now < retry_expiration:
453-
next_delay_f = (
454-
math.pow(backoff_coefficient, self._attempt_count - 1)
455-
* self._retry_policy.first_retry_interval.total_seconds()
456-
)
453+
total_elapsed_seconds += next_delay_f
457454

458-
if self._retry_policy.max_retry_interval is not None:
459-
next_delay_f = min(
460-
next_delay_f, self._retry_policy.max_retry_interval.total_seconds()
461-
)
455+
logical_next_attempt_start = self._start_time + timedelta(seconds=total_elapsed_seconds)
456+
if logical_next_attempt_start < retry_expiration:
462457
return timedelta(seconds=next_delay_f)
463458

464459
return None

durabletask_tests/durabletask/test_orchestration_e2e_async.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,9 @@ def child(ctx: task.OrchestrationContext, _):
322322
assert state.runtime_status == OrchestrationStatus.TERMINATED
323323

324324
# Verify that child orchestration is also terminated
325-
child_state = await client.wait_for_orchestration_completion(child_instance_id, timeout=30)
325+
child_state = await client.wait_for_orchestration_completion(
326+
child_instance_id, timeout=30
327+
)
326328
assert child_state is not None
327329
assert child_state.runtime_status == OrchestrationStatus.TERMINATED
328330

ext/dapr-ext-workflow/dapr/ext/workflow/aio/dapr_workflow_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
from dapr.ext.workflow.workflow_state import WorkflowState
2525
from grpc.aio import AioRpcError
2626

27-
import durabletask.internal.protos as pb
27+
try:
28+
import durabletask.internal.protos as pb
29+
except ImportError:
30+
import durabletask.internal.orchestrator_service_pb2 as pb # type: ignore[no-redef]
2831
from dapr.clients import DaprInternalError
2932
from dapr.clients.http.client import DAPR_API_TOKEN_HEADER
3033
from dapr.conf import settings

ext/dapr-ext-workflow/dapr/ext/workflow/dapr_workflow_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
from dapr.ext.workflow.workflow_state import WorkflowState
2525
from grpc import RpcError
2626

27-
import durabletask.internal.protos as pb
27+
try:
28+
import durabletask.internal.protos as pb
29+
except ImportError:
30+
import durabletask.internal.orchestrator_service_pb2 as pb # type: ignore[no-redef]
2831
from dapr.clients import DaprInternalError
2932
from dapr.clients.http.client import DAPR_API_TOKEN_HEADER
3033
from dapr.conf import settings

ext/dapr-ext-workflow/tests/test_workflow_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
from dapr.ext.workflow.dapr_workflow_context import DaprWorkflowContext
2323
from grpc import RpcError
2424

25-
import durabletask.internal.protos as pb
25+
try:
26+
import durabletask.internal.protos as pb
27+
except ImportError:
28+
import durabletask.internal.orchestrator_service_pb2 as pb # type: ignore[no-redef]
2629
from durabletask import client
2730

2831
mock_schedule_result = 'workflow001'

ext/dapr-ext-workflow/tests/test_workflow_client_aio.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
from dapr.ext.workflow.dapr_workflow_context import DaprWorkflowContext
2323
from grpc.aio import AioRpcError
2424

25-
import durabletask.internal.protos as pb
25+
try:
26+
import durabletask.internal.protos as pb
27+
except ImportError:
28+
import durabletask.internal.orchestrator_service_pb2 as pb # type: ignore[no-redef]
2629
from durabletask import client
2730

2831
mock_schedule_result = 'workflow001'

0 commit comments

Comments
 (0)