Horde/UBA: タスク実行中のAgentPCがシャットダウンした時にタスクがリトライされず、Exit Code 4でビルドが失敗する

お世話になっております。

<br/>

現在、UE 5.6 (Main branch) にて Horde + UBA 環境を検証しています。

ビルド実行中にRemote Agent PCがシャットダウンした際、そのAgentに割り振られていたタスクが他のAgentに再割り当てされず、ビルド全体が失敗する現象が発生しています。

<br/>

現象: タスク処理中のAgentがシャットダウン/再起動すると、以下の挙動となります。

  1. コンパイラが Exited with error code 4. This build will fail を返す。
  2. その直後にログでAgentの切断(Client session disconnected)が記録される。
  3. ビルドが失敗扱いとなる

<br/>

そこで質問なのですが、Agentがタスク実行中に切断された場合、Exit Code 4 で失敗させるのではなく、タスクをリトライさせるための設定(BuildConfiguration.xml等)は存在しますでしょうか?

すみませんがご回答よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

現在Agentに割り当てられたタスクが失敗した場合、リトライや再割り当てするような機能はございませんでした。元々ビルドを開始したAgentはシャットダウンをしないことを前提としていたのでこのように失敗においてビルド全体に影響するようになっておりますが、開発チームにもこの内容について改善の予定があるかどうか確認しておりますので、こちらについて追加でコメントがありましたらお伝えしたいと思います。

[Attachment Removed]

お世話になっております。

ご返答が遅くなりまして申し訳ございません。Horde+UBAの分散ビルド環境において、UBA executerは(UBTの一部として「コンパイル」を行っているマシン上でローカルに実行される部分)は、リモート障害を処理するように設計されています。分散タスク(個々のコンパイルまたはリンク)が失敗すると、UBA executer はそのタスクをローカルで実行するように再スケジュールしなおすため、リモート障害(ネットワーク切断、リモートエージェントからの無応答、リモートエージェントがタスクを実行できない等)のリモート障害を処理できるはずです。ただしUBAエージェントは障害が発生した際には復帰できますが、PCシャットダウンなどのケースではUBAエージェント自体が復帰できない状況となるので、ビルドタスクが失敗する可能性があります。現在検証なされている環境では、Horde Agentは複数台稼働しており、1台のHorde Agentがシャットダウンしてもビルドが継続しない、といった状況でしたでしょうか?

[Attachment Removed]

ご回答ありがとうございます。

現在検証している環境では、Agentを数十台で稼働させております

Agentがシャットダウンした際は下記ログが出ていました

[334/2720] (Wall: 0.08s CPU: 0.09s) Compile [x64] xxxx.cpp [RemoteExecutor: xxx]

Compile [x64] xxx.cpp [RemoteExecutor: xxx]: Exited with error code 4 . The build will fail.

UbaSessionServer - Client session xxx disconnected. Returned 8 process(s) to queue

[Worker22] Exiting…

[Worker22] UbaSessionClient - Cancelling 8 processes and wait for them to exit

このログの後もビルド自体は継続していたのですが、最終的にビルドエラー扱いとなっていました。

このファイルをもう一度ビルドしたらビルドが成功したのでソース起因のビルドエラーでは無いことは確認しています。

[Attachment Removed]

お世話になっております。ご確認頂きありがとうございます。

状況としましては、以下の理解でよろしいでしょうか?

  • 複数台Agentがある環境で分散ビルドを実施しており、1台のAgentのPCをシャットダウンするとビルドエラーが発生して全体のビルドタスクも停止した
  • (シャットダウンしたAgentを復旧させる、もしくは復旧させないままで)再ビルドを実施したところビルドエラーは発生せずに全体のビルドも成功した

[Attachment Removed]

はい、その認識で合っています。​

[Attachment Removed]

こちらお時間を頂いておりまして申し訳ございません。

再リトライでビルドは成功しているかと思いますが、この再現環境の準備に少し時間が掛かっておりました。こちら次のアップデートがありましたらコメントを追加してお知らせしたいと思います。

[Attachment Removed]

お世話になっております。

本件ご返答までにお時間を要しており申し訳ございません。現状の実装を元に動作がどのように動くかを調べたところ、もしリモートエージェントのPCでビルド中のタスクが何らかの要因で終了してしまったケースにおいては、サーバーでは切断を検知した後にその同一のタスクを別のエージェントに割り当てて再実行するような動作となるはずで、もしリモートエージェントが切断をしたタイミングでサーバーのタスクが終了してしまった場合は、切断を検出するまでの間にUBTなどからタスクを終了させるような通知やエラーの検出が発生している、という可能性は考えられます。もしそうであるとしたら、ビルドタスクを処理するサーバー側およびエージェントPC側でのログ(コンソールに出力されるログ)および UBTのログ(Engine\Programs\UnrealBuildTool\Log.txt)を突き合わせる必要があるのですが、リモートタスクが失敗した際の両方のログなどがもしありましたらご共有頂けますと幸いです。

[Attachment Removed]

お世話になっております

こちらでも少し検証していたのですが、確かにAgnetPCがシャットダウンされてもタスクを再割り当てしているような挙動を行い、正常にビルドが進むのを確認しました。

改めてExit Code 4でエラーが返ってきたときの状況を思い返したところ、windowsアップデートによるシャットダウン時にこのエラーが発生しておりました。

ログが残っていなかったためログの提供が出来なくて申し訳ないのですが、

windowsアップデートによるシャットダウンだと、切断を検出するまでの間にUBTなどからタスクを終了させるような通知やエラーの検出が発生する可能性はありますでしょうか?

[Attachment Removed]

詳細な状況についてお知らせ頂きありがとうございます。結論として、PCのシャットダウンとWindowsアップデートによる計画的なシャットダウンでの挙動は異なり、後者のケースでは例外としてこのような問題が発生する可能性があります。

Agentによる分散ビルド中のタスクが再度キューに積まれる仕組みとして以下のようになっています

・UBT はコーディネータ側でアクションをスケジュールする

・UBA セッションサーバがリモート Agent(クライアントセッション)にタスクを流す

・Agent 上で 実際のコンパイルプロセスが動き、終わると 終了コードやログがサーバ/UBT に返却

・Agent がシャットダウンなどで落ちるとTCP 切断として OnDisconnected などが動き、論理アクションの再キュー(再スケジュール)が走る

手動シャットダウンのようなケースでは、上記のように通信が先に終了→サーバは切断として処理→まだ正常な ProcessFinished が来ていない → 再スケジュール という想定されたプロセスによって、ビルドが継続します。

一方で、Windowsアップデートの計画シャットダウンで起きうることとしては、Agent 上の コンパイラが OS により先に終了すると、UBA クライアントが まだサーバに届く経路を少し持っている間に、終了コード付きのプロセス終了がサーバに届く、あるいは 異常終了に近い状態が 何らかの終了コードとして UBT に通知されます。それとは別に TCP切断は 別タイミングで検出されるため、「失敗としての終了報告」が「セッション切断」より先になる並びとなってしまうためです。

これが発生しているかどうかは、ログから「Exited with error code …」と「Client session … disconnected」の前後、Trace.uba(Visualizer) で ProcessExited と SessionDisconnect の順を見ることで分かるかと推測されます。

[Attachment Removed]

ご返答いただきありがとうございます。

一旦、この問題に関しては運用側で解決を図ろうかと思います。

念のためお聞きしたいのですが、上記ケースでビルドエラーとなってしまうのを回避する手段はありますでしょうか?

[Attachment Removed]

Windows Updateによるシャットダウンはプロセスを強制終了させるため確実に回避できる保証はありませんが、-UBAForcedRetryRemote (bForcedRetryRemote=true) を利用することで、リモートビルドがエラーコード付きで失敗として返ってきたものをローカルで再実行する可能性はあります(実際に手元で確認できたわけではありません)。とはいえ、Windows Updateによるスケジュールをビルド実行時間帯以外で行う事の方が確実ではあります。

[Attachment Removed]

-UBAForcedRetryRemote (bForcedRetryRemote=true)を利用させていただきます。

これで変わらずにエラーが出たとしても出来るだけ運用で回避するようにはしてみようと思います。

[Attachment Removed]