JavaScript is required to use Bungie.net

Destiny 2のサービス一時停止とロールバックについて

本日(2月12日水曜日)、臨時修正2.7.1.1の配信後、ごく一部のプレイヤーが通貨や材料を失うという問題が再発生したという報告を受けました。類似する問題が最初に発生したのは臨時修正2.7.1がリリースされた1月28日でしたが、そのときは全プレイヤーが通貨や材料を失い、アカウントのロールバックを行いました。本日も同様の対応として、プレイヤーのアカウントを午前1時30分(日本時間)の時点(2.7.1.1のリリース前)まで巻き戻しました。

どちらの問題も発生の原因とプレイヤーへの影響は共通しており、比較的短期間で連続したことを受けて、なぜこの問題が起きたのか、それをどのように修正したのか、そして今後の発生を防ぐためにどのような対策を講じたのかをご説明したいと思います。まず、この問題が発生してしまった原因についてお話いたします。今回の問題は、所持品の管理に関する不具合と、不具合の修正後に一連のサーバー設定によって同様の不具合が再度ゲームに反映されてしまったことに起因します。

所持品の管理

Destiny 2では、クエストは通貨や材料といった所持品アイテムと同じように扱われています。すべてのアイテムは、タイムスタンプ(いつプレイヤーの所持品に加わったのかという情報)が記録されています。このタイムスタンプ情報は、クエストを受注順に並び替えるために使用されます。本作ではプレイヤーがログインするたびに所持品が整理されます。これは、例えば「特定のアイテムをプレイヤーが一度に所持できる上限数」など、コンテンツに変更が加えられた際にプレイヤーの所持品が正しく対応していることを確認するためです。

数ヶ月前、クエストログにおける並び順が正しく機能していないという報告をプレイヤーから受け、修正に取りかかりました。その際の開発チームの調査により、ログイン時の処理により一部のクエストのタイムスタンプがリセットされており、それによって受注順の並びがずれていることが判明しました。その問題を受け、クエストのタイムスタンプはリセットの対象外とすることで修正を図りました。この修正の考え方そのものは妥当なものでしたが、わずかな副作用により、想定よりも多くの処理が無効化されてしまいました。このような副作用が積み重なった結果、ゲームはスタック可能なアイテム(通貨や材料など)に対して誤った上限を算出してしまい、その上限を超えたアイテムが失われました。この修正が重要なことは認識していたので、通常の対応に従い2名の専門家にコードのレビューを依頼しましたが、残念ながらこの不具合を事前に発見することはできませんでした。

数日後、内部のテストチームより問題が報告されました。しかし、この時は、デバッグ用に使用しているツールの問題であって、ゲーム自体の不具合ではないという誤った結論を出してしまいました。結果的にはこちらの調査でも見過ごされ、不具合は2.7.1に含まれたままリリースされてしまいました。実際の環境で不具合が発見され、すぐに修正方法を模索しましたが、そこで次の問題が訪れました。ゲームサーバーの設定です。

サーバー設定

「影の砦」などの大規模なリリースの前は、必ず実際のプレイヤーの行動をできるだけ模倣した包括的なストレステストを実施しています。しかし、実際のプレイヤー数を完全に再現できるわけではないため、前述のテストに加え、リリース後もサービスの状況を細かくモニタリングしています。

昨年の10月、「影の砦」のリリース後のCPU使用量やプレイヤーのアクセス数の増加に伴い、サーバーを増強することにしました(この時に追加されたのが「ワールドサーバー」です)。この時点まで使用したことがないほどのサーバー増強となりました。これほど多くのサーバーを運用することで、プレイヤーの皆さんには感じられない程度ではありましたが、ごくわずかな副作用が生じました。例えば、一部(全体の1%未満)のサーバーが起動時にクラッシュしてしまうという問題がありました。これは稼働しているサーバー数が多すぎたために、バックエンドの特定のデータベースが処理しきれなかったが原因でした。この問題への対応策として、サーバーのクラッシュが検知されるたびに手動的に再起動することにしました。プレイヤーに影響を及ぼすこともなかったので、この問題は無事に解決したものと思われました。

それから少し時間が進みます。ちょうど2週間前のことです。更新2.7.1には前述の不具合が含まれており、キャラクターデータの破損、そして初のキャラクターデータのロールバックへとつながります。問題にいち早く対処するため、この時はゲームコードのフルビルドを展開するのではなく、サーバーにパッチを適用しました。パッチを適用する際には、キャラクターデータを処理するコードをオーバーライドするようにサーバー設定を変更し、その変更が正しく適用されるようにワールドサーバーを再起動しました。 

そして本日、2月12日に、「真紅の日々」の開始にあわせて、更新2.7.1.1を配信しました。リリース後、やはり無数のサーバーが同時に起動したことにより、一部のワールドサーバーがクラッシュしはじめました。そして以前と同じように、手動でサーバーを再起動すれば問題なく運用できると私たちは考えていました。ですが、この考えは誤りでした。 

この時点ではまだ把握できていませんでしたが、クラッシュしたワールドサーバーは、クラッシュによってこれまでのキャラクターデータ破損の修正が適用されていない状態になっていました。つまり、一部のワールドサーバーでは、キャラクターデータの破損を引き起こす古いコードが実行されていたのです。サーバーにはバージョンの相違を検知する仕組みが備わっていますが、クラッシュしたワールドサーバーを手動で再起動させたことによって、その検知プロセスもスキップされていました。本日に至るまで、これらのオーバーライドや検知プロセスがスキップされることはあり得ないと考えていました。

新しいビルドをテストする通常手順に従い、テストチームはそれぞれ複数のテストアカウントを使ってプレイヤーのゲーム体験に問題がないことを確認しています。ですが、本作は数百台におよぶサーバーで構成されており、内部テストでは不運なことに“良い”サーバーでのみ行われ、古いコードが実行されていたごく一部のサーバーがテストされてしまいました。そのため、問題を発見できず、リリースへとつながりました。

本日、2.7.1.1の配信後に、一部のプレイヤーから通貨がなくなっているという報告が届きはじめました。開発チームは即座に調査を開始し、午前3時30分(日本時間)にサーバーを停止しました。この間に、無数のプレイヤーがゲームへログイン、あるいはサードパーティーのサービスを通じてゲームキャラクターにアクセスしました。そして調査の結果、決して起こるはずがないと思われていた事態が発生していることが判明しました。一部のワールドサーバーが、2.7.1で生じたデータ破損の不具合を修正する設定を反映していない状態で稼働していたのです。そして残念ながら、古い設定のまま稼働していたサーバーの影響を受けてしまったキャラクターは、キャラクターデータ破損の不具合に見舞われてしまいました。

今回の問題が1月28日に発生したものと同様のものであると特定し、発生原因も把握した時点で、開発チームは影響を受けたアカウントを個別に識別する(そして、その過程で何かを見落としてしまうリスクを冒す)よりかは、全キャラクターをパッチ2.7.1.1の配信直前の状態に巻き戻すことが最善だと判断しました。 


今後の対策

同様の問題がこれ以上発生しないよう、複数の安全策を講じます。 

1) サーバーが想定とは異なるバージョンで起動できないよう、緊急の修正を適用する際の安全策を追加しました。この変更は本日より、ゲームサーバーを起動する段階から実装されています。
2) ごく一部のワールドサーバーが起動時にクラッシュしてしまう不具合を修正しました。この修正はシーズン10とともに実装されます。 
3) キャラクターデータの破損の修正は、実行可能な変更として次回の更新に含まれます。これにより、サーバー設定のオーバーライドは不要になります。(残念ながら臨時修正2.7.1.1は開発が進みすぎており、含めることができませんでした)
4) 今後を見据えて、データのロールバックと復旧をより素早く行える方法を調査中です。
5) 将来的に、サーバーが設定データの読み込みをスキップできてしまう問題を修正します。
6) アカウントログイン時点で発生するクリーンアップ処理のコードに安全策を追加します。この処理は非常に重要なデータを扱うため、今後不具合が生じないようにするための施策です。
7) リリースに向けた作業の中で、もっと早い段階でこのような不具合を発見できるよう、開発手順を見直しています。 

本日のロールバックにより、すべてのキャラクターは午前1時30分(日本時間)時点の状態に戻っています。また、現在開発チームは臨時修正2.7.1.2(2月13日リリース予定)の準備を進めています。この臨時修正では、「無限ドーンブレード問題」も修正される予定です。

本日のサービスの一時停止およびキャラクターデータのロールバックは、「真紅の日々」の開幕と重なってしまったこともあり、結果として皆さんにも多大なご迷惑をおかけしてしまいました。私たちとしても、今回の問題は事前に避けることができたはずのものとして考えており、非常に忸怩たる思いを抱いています。このような結果となってしまい、この度は誠に申し訳ございません。今後は同様の問題が起きないよう、引き続き尽力してまいります。これまで同様、Destinyで何らかの問題に遭遇した場合は、BungieのヘルプサイトやTwitter(@BungieHelp)までお知らせください。皆さんのご理解とご協力に感謝いたします!

このコンテンツはご覧いただけません。
preload icon
preload icon
preload icon