mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-30 14:56:19 +00:00
## What changed? Makes changes summarized in https://github.com/temporalio/temporal/assets/52205/0660a021-588a-4573-94d3-301cae0c0040 ### Empty responses on server-timeout The behavior of `PollWorkflowExecutionUpdate` and `UpdateWorkflowExecution` was changed as follows: - They introduce a "server-imposed deadline" equal to current time plus `LongPollExpirationInterval` - If a timeout occurs due to the server-imposed deadline, then they do not return an error, but return a response with an empty outcome. - Otherwise, their behavior is unchanged (in particular, if a timeout occurs due context deadline expiry, they return the error as before) ### Non-blocking poll - Change the Update Poll endpoint so that omitting the `WaitPolicy` now means "do not wait; respond with current Update status without blocking". Previously omitting the `WaitPolicy` was interpreted to mean "attempt to wait until Completed" - Also return the `UpdateRef` ## Why? ### Empty responses on server-timeout - This makes the behavior of the endoint consistent with `GetWorkflowExecutionHistory`. - This makes sense, because that endpoint is used in an analogous way (e.g. `GetWorkflowExecutionHistory` is used for `wfHandle.result()` and `PollWorkflowExecutionUpdateRequest` is used for `updateHandle.result()`, and both involve polling for the result). - In particular, a polling client interprets timeout-on-server-imposed-deadline to mean that it should continue polling, and we would prefer not to use an error to communicate this non-exceptional situation. ### Non-blocking poll SDK clients may use non-blocking poll to, for example - Obtain current status of an Update (perhaps `updateHandle.describe()` - Determine whether an Update with a given ID already exists / is running ### How did you test it? - Unit tests - Modified Typescript SDK to not send `WaitPolicy`, ran a feature test against the modified server and modified SDK, and confirmed API communication as expected (this revealed that I needed to stop Frontend mutating the request to set `WaitPolicy` to `Completed`). - I changed the poll loop in sdk-typescript to no longer catch `DeadlineExceeded`, ran the `update/basic_async` feature test against the local SDK and against server binaries built prior to and with this commit, and confirmed that the change in this PR fixed the poll loop. ### Potential risks - Could break Update operations in SDKs ### Is hotfix candidate? - No
587 B
587 B
Update State Machine
The diagram below depicts the state machine implemented in update.go.
stateDiagram-v2
[*] --> Admitted: New
Admitted --> ProvisionallyRequested: onRequestMsg
ProvisionallyRequested --> Requested: commit
Requested --> ProvisionallyAccepted: onAcceptanceMsg
ProvisionallyAccepted --> Accepted: commit
Requested --> ProvisionallyCompleted: onRejectionMsg
ProvisionallyCompleted --> Completed: commit
ProvisionallyAccepted --> ProvisionallyCompleted: onResponse
Accepted --> ProvisionallyCompleted: onResponse