頻発するクラッシュに関して
Posted: 2019年6月09日(日) 20:29
ここ最近シャレにならないレベルでクラッシュが頻発しているので、現状を報告しておきます。
1. 発生条件はまだはっきりと分かっていません。
確実なのは、ブロックのアップデート(要するにオブザーバーが反応するもの)が原因だという事です。
今のところ確認されているのはドア、ピストン、竹の3つで、ドアが1番多いです。
ただ、具体的にどういう状況で発生するのか分かりません。それゆえに再現させて調査することができないので苦労しています。
2. クラッシュが発生するのはメインワールドです。
エラーログを見る限り、今の所他の世界でのクラッシュは確認されていません。
単にみなさんがメインを多用しているからそうなっているだけかもしれませんが。
3. 持ち物がなくなる可能性
マルチ鯖ではチャンクデータの保存は10分おきに行われています。
一方でクラッシュした際には持ち物だけが保存されて終了したりするので、直近10分の間にマップ上に置いたブロックは巻き戻り、持ち物だけがなくなる、という事が起こる可能性もあります。
もちろん何も起こらない事もある。完全に運。
4. ソースコードレベルでの原因は分かっています。
発生しているのはConcurrentModificationExceptionで、HashSetをforでループしてる時に他のスレッドから変更しているのが原因です。
と言われて分かる人は居ませんよね……
HashSetをConcurrentHashMapのSetに変更すれば、恐らくこのバグは発生しなくなると思います。
ただ、その変更で新たなバグを発生させてしまったりパフォーマンスが落ちてしまう可能性は無きにしも非ずなので……Bukkit本体を弄る手法はあまりやりたくないかな。
そもそも、他のスレッドから変更されないはず……なのにそれをやってるプラグインがある、という可能性もある。
(もちろんBukkitのバグで他スレッドから変更される事を忘れている可能性だってある。)
どうしてもダメそうならこの方法での対応を検討していますが、原因が特定できていない状況ではあまりやりたくない修正です。
ちなみにですがSpigotのバグ報告には類似の報告がなく、だからこそBukkitのバグではなくプラグインやデータ破損の可能性が出てくるので面倒なんですが……
(恐らく同じと思しき報告自体はあったんですが、すでに修正されたバグ扱いになっている)
~~~ クラッシュした時は ~~~
立て直すので連絡してください。(自動で再起動するような仕組みにしても良いのですが、そういうのを「ちゃんと」機能させるのは案外難しいので……)
あと、クラッシュした時はいくつか情報を提供してもらえると助かります。
- どこで何をしていたか?
- 何かプラグインの機能を使ったりしたか?
- 村にいるなら、村人や襲撃の状態
- そのほか、何か気付いたことなどがあれば
1. 発生条件はまだはっきりと分かっていません。
確実なのは、ブロックのアップデート(要するにオブザーバーが反応するもの)が原因だという事です。
今のところ確認されているのはドア、ピストン、竹の3つで、ドアが1番多いです。
ただ、具体的にどういう状況で発生するのか分かりません。それゆえに再現させて調査することができないので苦労しています。
2. クラッシュが発生するのはメインワールドです。
エラーログを見る限り、今の所他の世界でのクラッシュは確認されていません。
単にみなさんがメインを多用しているからそうなっているだけかもしれませんが。
3. 持ち物がなくなる可能性
マルチ鯖ではチャンクデータの保存は10分おきに行われています。
一方でクラッシュした際には持ち物だけが保存されて終了したりするので、直近10分の間にマップ上に置いたブロックは巻き戻り、持ち物だけがなくなる、という事が起こる可能性もあります。
もちろん何も起こらない事もある。完全に運。
4. ソースコードレベルでの原因は分かっています。
発生しているのはConcurrentModificationExceptionで、HashSetをforでループしてる時に他のスレッドから変更しているのが原因です。
と言われて分かる人は居ませんよね……
HashSetをConcurrentHashMapのSetに変更すれば、恐らくこのバグは発生しなくなると思います。
ただ、その変更で新たなバグを発生させてしまったりパフォーマンスが落ちてしまう可能性は無きにしも非ずなので……Bukkit本体を弄る手法はあまりやりたくないかな。
そもそも、他のスレッドから変更されないはず……なのにそれをやってるプラグインがある、という可能性もある。
(もちろんBukkitのバグで他スレッドから変更される事を忘れている可能性だってある。)
どうしてもダメそうならこの方法での対応を検討していますが、原因が特定できていない状況ではあまりやりたくない修正です。
ちなみにですがSpigotのバグ報告には類似の報告がなく、だからこそBukkitのバグではなくプラグインやデータ破損の可能性が出てくるので面倒なんですが……
(恐らく同じと思しき報告自体はあったんですが、すでに修正されたバグ扱いになっている)
~~~ クラッシュした時は ~~~
立て直すので連絡してください。(自動で再起動するような仕組みにしても良いのですが、そういうのを「ちゃんと」機能させるのは案外難しいので……)
あと、クラッシュした時はいくつか情報を提供してもらえると助かります。
- どこで何をしていたか?
- 何かプラグインの機能を使ったりしたか?
- 村にいるなら、村人や襲撃の状態
- そのほか、何か気付いたことなどがあれば