Ai-Akaishi/OhMyDat

ガベージコレクタ時にワールドが落ちる

Closed this issue · 3 comments

nea-c commented

これは私たち(マルチ開発)の問題の可能性が大なのですが、
操作ミスのコマンドなどでスコアが残留します
他の人のライブラリでも残留するスコアが発生したりします。

*のスコア参照はスコアホルダーになった対象 全て を参照するため、
その残留スコアが大量に発生している際に新規OhMyDatIDが発行されると
scoreboard players listにて得られるスコアホルダーすべてのスコアを参照しようとしてワールドが固まる/落ちるなどの動作が起こります。

*を使わなければ実現できないであろう操作ですが、可能であれば使わないほうがいい操作のため報告しました。

可能であれば、修正のほどよろしくお願いいたします。
不可能であればこのIssueは閉じてもらって大丈夫です。

ご連絡ありがとうございます。
Minecraftではエンティティが(読み込み範囲外で)アンロードされるだけではスコアは消えず、(死亡やkill等で)完全に削除されるとスコアが消えます。
アンロードされている対象は*を使った操作でのみ検知することができます。
その仕組みを利用してスコアが消えたエンティティの個別ストレージを解放することで別の個体に割り当てられるようにしています。(65535個のストレージを使いまわしています)
*を使わない場合、新たな個体に割り当てられなくなる問題や、不要なデータが削除されずストレージデータが際限なく大きくなってしまう問題が起こります。

またワールドが落ちる原因ですが、*操作自体が原因の可能性は低そうです。数万のスコアホルダーが存在したとしても、単一スコア操作のコマンドをその数実行しただけにすぎません。
単一スコア操作の無限ループファンクションを想像していただければ、それだけでフリーズやクラッシュは考えにくいことが分かりやすいかもしれません。

一度開かれたストレージファイルはワールド保存時(一定時間ごとやコマブロを開くなどのpause時)に保存されます。その際、ファイルサイズが大きすぎるとフリーズやクラッシュすることが知られています。
広範囲な地形データや長時間にわたるnbtデータを記録するといった、ストレージサイズの大きくなるデータパックを利用する場合はより注意が必要です。
その場合、削除されたエンティティのストレージが正しくGCされることは、フリーズやクラッシュの回避に必要な操作になります。

どういった状況でスコアが残留しているか分かりませんが、スコアが残留しないようにすることで、OhMyDatは自動的にストレージ容量を削減し、ワールドが固まる/落ちるといった問題を回避してくれると思います。

nea-c commented

ありがとうございます。
やはり*を使わないようにすることは不可能な感じなんですね
スコアが残留するものは残留しないように全て修正する必要がありそうですね

*が原因で固まったり落ちたりするわけではないと思われます。
*が原因と特定できる情報があればいただけると幸いです。