特定のチャンクでログインができなくなるエラーの対処方法
ある日自分のサーバにログインしたときに、ある特定の場所に入った瞬間ログアウトしてしまう問題に直面しました。
忘れないようにこの時行った対処方法を書いていこうと思います。
特定のチャンク付近(yukimomoでは、スポーン周辺)で誰もログインすることができなくなる。
yukimomoのマインクラフトサーバーで、二度起こったエラーです。
- こいつのやっかないなところは、ログインできない場所に管理者のユーザーでもログインすることができなくなる点。
- 近づいたら、問答無用でキックされてしまい、再度ログインすることが出来なくなる点。
二回起こって調査を続けたことで、大体わかってきました。
まず、サーバーのLogには、以下のメッセージが出てログインを試みたユーザーをキックしています。
io.netty.handler.codec.EncoderException: String too big (was 32789 bytes encoded, max 32767)
管理者権限を付与したユーザーでもログインが出来なかったため、ログイン出来たらまず動かないことだと思います。
そして、以下のメッセージが運悪く原因の近くでログアウトしていた、もしくは原因に近づいて蹴られたユーザーがサーバーログインしようとすると表示されるエラーになります。
Internal Exception:io.netty.handler.codec.DecoderException:java.lang.IndexOutOfBoundsException:resderIndex(9)+length(1) exceeds writerIndex(9):UnpooledHeapByteBuf(ridx: 9,widx:9, cap:9)
このエラーが出てしまったユーザーは、原因をサーバー上から取り除かないかぎりログインすることできません。
※ただし、TPコマンドをログインした一瞬で、ログイン出来ているユーザーから安全地帯にテレポしてもらえれば復活可能ですが、根本的な解決にはなりませんし、TPコマンドを使えるユーザーがいなければなりません。
yukimomoで問題解決できた方法を2つ記載します。
方法1.ユーザーの特定からロールバック
問題が発生した時のサーバーログを詳しく見てみる。
まず、問題が発生した際、私はログをかたっぱしから読みます。
本番稼働しているシステムなどは、早期復旧が求められますので止まった時間帯のログを先に見るのがよいでしょう。
ここで、注目しなければならないのは、誰がエラーを発生させたか。を突き止めることです。
どのようにして、このエラーを発生させるかは、起こした人に聞くのが一番ということですね。
嵐に使えちゃう方法かもしれないので、ここではあまり深堀しません。
誰がエラーを発生させたか特定できればここからは、ロールバック作業です。
yukimomoではHawkeyeのプラグインでロールバックを行いますが、ロールバックが出来るプラグインであれば何でもよいと思います。
エラーを発生させたユーザーの行動をエラー前までロールバック
特定したユーザー一人だけの行動をロールバックすることで、サーバーへの被害を最小限かつ早急に復旧させることが可能です。
実際に1度目のエラーは、ユーザーの行動のロールバックのみで解消しました。ここで、注意が必要なのですが、方法1.では設置したアイテムがある場合しか復旧できない点です。1度目は、看板に入力された文字数が規定を上回ったことによりその看板がロードされたタイミングでキックされてたわけです。
なので、看板を設置したユーザーの行動をその看板を設置した前の時間まで戻してあげれば問題解決というわけなのです。
方法2.MCeditで消す。
方法1.で解消しなかった場合、原因のアイテムが設置されていない可能性を疑わなければなりません。
アイテム化している状態の可能性です。
私は、これを見つける方法で悪戦苦闘してました。
まず、方法1.を試し治ることを祈りましょう。方法2.は、実際にMCeditで原因のアイテムを消す作業になります。
MCEditをダウンロード
ここでは、割愛します。別記事で今後書こうかな。。。
MCEditで、対象のワールドを編集
ここが一番大変な作業ですが、ログインできない場所、怪しいところを探索します。yukimomoサーバは、まだ開拓されている場所が少ないことからなんとか見つけることが出来ました。
緑の四角が沢山落ちている場所をDeleteして、復旧しました。。。
見つけるのが大変な場合が多いと思います。頑張って探してみてください。
最後に
いかがでしょうか。この記事を読んでいる方は、同じエラーが発生した方かと思いますが、ワールドデータをなるべく傷つけないように復旧する方法でした。
原因はサインハックと呼ばれているもの一部のチートだということです。悪さをしているユーザーを突き止めて、BANすることをお勧めします。1回目でBANせず、様子を見ていたのですが2回起こると流石に、ごめんなさいですね。同じユーザーの方でしたし。
また、バックアップを取っていてワールドデータが巻き戻っても問題場合は、純粋にバックアップしたあったワールドデータを置き換えてもいいかも。。。
いろいろ手間がかかるので^^