Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

A failed commit becomes a permanent OrchestrationFailed without parent notification; the fallback abandon never runs

オープン
#58 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
48/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
活発
技術スタック
rust

調査の方向性

Start with process_orchestration_item and ack_orchestration_with_changes in src/runtime/dispatchers/orchestration.rs, then read the related design in #55. Trace the retry and error branches, including both abandon_orchestration_item calls; done means the chosen failure behavior executes asynchronously and does not leave parent notification or activity cancellation missing.

索引モデルが issue の本文から書いたものです。

説明

bug

Summary

When ack_orchestration_item fails, the runtime commits an OrchestrationFailed event for the instance. It does this for every error that the provider calls non-retryable, and for a retryable error that lasts longer than about 310 ms. So a database problem that goes away can end an orchestration for good.

The same code path has two more problems:

  • The failure is committed without messages. A parent orchestration gets no SubOrchFailed and waits forever.
  • The fallback call to abandon_orchestration_item never runs.

Where

Details

  1. Retry budget. A retryable error is retried 5 times, with waits of 10, 20, 40, 80 and 160 ms. Then the error is returned (L1191-L1206). A non-retryable error is returned at once (L1183-L1188).
  2. Failure commit. The caller builds OrchestrationFailed from the history it fetched and commits it with the same lock token (L975-L1001). If the database is healthy again at that moment, the commit works and the instance is Failed.
  3. No messages. That commit passes empty worker_items, orchestrator_items and cancelled_activities (L990-L999). If the instance is a sub-orchestration, its parent is not told. In-flight activities are not cancelled.
  4. The abandon never runs. Both fallback paths call drop(self.history_store.abandon_orchestration_item(...)) (L1009-L1013 and L1200-L1204). abandon_orchestration_item is an async fn. A future that is dropped without .await does nothing. The lock is only released when it times out.

Which errors are non-retryable depends on the provider. duroxide-pg classifies almost every SQLSTATE as permanent, including a statement timeout: microsoft/duroxide-pg#30.

How this was checked

Found by reading the code. Not reproduced.

Suggested fix

  • Do not fail the instance for an infrastructure error on commit. Abandon the item with a backoff, and let max_attempts end a message that can never commit.
  • If the failure commit stays, queue SubOrchFailed for the parent and cancel the in-flight activities, as the normal failure path does.
  • .await the two abandon_orchestration_item calls.

Tracked in #55.

主要言語
Rust
スター
226
フォーク
62
平均マージ
20時間 46分
マージ済み PR(30日)
6

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

microsoft/duroxide のほかの issue

microsoft/duroxide の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。