4646 RunOptions ,
4747 P ,
4848)
49- from restate .exceptions import TerminalError , SdkInternalBaseException , SdkInternalException , SuspendedException
49+ from restate .exceptions import (
50+ TerminalError ,
51+ SdkInternalBaseException ,
52+ SdkInternalException ,
53+ SuspendedException ,
54+ RetryableError ,
55+ )
5056from restate .handler import Handler , handler_from_callable , invoke_handler
5157from restate .serde import BytesSerde , DefaultSerde , Serde
5258from restate .server_types import ReceiveChannel , Send
@@ -404,6 +410,10 @@ async def enter(self):
404410 restate_context_is_replaying .set (False )
405411 self .vm .sys_write_output_failure (failure )
406412 self .vm .sys_end ()
413+ except RetryableError as r :
414+ stacktrace = "" .join (traceback .format_exception (r ))
415+ restate_context_is_replaying .set (False )
416+ self .vm .notify_error (r .message , stacktrace , r .retry_after )
407417 # pylint: disable=W0718
408418 except asyncio .CancelledError :
409419 pass
@@ -422,6 +432,11 @@ async def enter(self):
422432 self .vm .sys_write_output_failure (failure )
423433 self .vm .sys_end ()
424434 break
435+ elif isinstance (cause , RetryableError ):
436+ stacktrace = "" .join (traceback .format_exception (cause ))
437+ restate_context_is_replaying .set (False )
438+ self .vm .notify_error (cause .message , stacktrace , cause .retry_after )
439+ break
425440 elif isinstance (cause , SdkInternalBaseException ):
426441 break
427442 cause = cause .__cause__
@@ -674,6 +689,18 @@ async def create_run_coroutine(
674689 except TerminalError as t :
675690 failure = Failure (code = t .status_code , message = t .message )
676691 self .vm .propose_run_completion_failure (handle , failure )
692+ except RetryableError as r :
693+ failure = Failure (code = r .status_code , message = r .message )
694+ end = time .time ()
695+ attempt_duration = int ((end - start ) * 1000 )
696+ self .vm .propose_run_completion_transient_with_delay_override (
697+ handle ,
698+ failure ,
699+ attempt_duration_ms = attempt_duration ,
700+ delay_override = r .retry_after ,
701+ max_retry_attempts_override = max_attempts ,
702+ max_retry_duration_override = max_duration ,
703+ )
677704 except asyncio .CancelledError as e :
678705 raise e from None
679706 except SdkInternalBaseException as e :
0 commit comments