Spigot 1.8.3 + Hawkeye issue

鯖をCraftBukkit 1.7.2 -> Spigot 1.8.3 に変えてみたところ案の定いろいろ問題が出たけども、その中で最も危険だった問題点をメモしておく。

1.8.3 への移行直後、Spigot鯖とは別のネットワークに置いてあったMySQL鯖に対してHawkeyeがすごい勢いでクエリを投げはじめ、送りきれないQueueが大量に蓄積されていってサーバが非常に重くなる現象が発生、まともにゲームができなくなってしまった。

取り急ぎHawkeyeの接続先をSpigot鯖のローカルのMySQLに変えたのだけれども、その後しばらく運営していると、サーバの空き容量が激減していることに気づき、いろいろ調べた結果MySQLのデータベースがこんなんなっていた。

root@nagato:/var/lib/mysql# ls -lah  
total 80G  
drwx------ 10 mysql mysql 4.0K May  7 17:47 .  
drwxr-xr-x 59 root  root  4.0K Nov  5  2014 ..  
-rw-rw----  1 mysql mysql  80G May  9 02:11 ibdata1
...

3日前までは合計10MBも使っていなかったようなDBが80GBだと…!?

中身を見ようにもselectするとOutOfMemoryになってしまうような状況なので、Hawkeyeの書き込み先tableを変えて数分動かしてみたところ、秒速3500行、時速にして1260万行のデータがMySQLに送られていることが判明。

|   25077 | 2015-05-09 01:18:37 |         1 |     28 |        1 | -127 | 61 |  211 | +263:1~1                  |
|   25078 | 2015-05-09 01:18:37 |         1 |     28 |        1 | -127 | 61 |  211 | +263:1~1                  |
|   25079 | 2015-05-09 01:18:37 |         1 |     28 |        1 | -127 | 61 |  211 | +263:1~1                  |
|   25080 | 2015-05-09 01:18:37 |         1 |     28 |        1 | -127 | 61 |  211 | +263:1~1                  |
|   25081 | 2015-05-09 01:18:37 |         1 |     28 |        1 | -127 | 61 |  211 | +263:1~1                  |
|   25082 | 2015-05-09 01:18:37 |         1 |     28 |        1 |  -84 | 56 |  187 | +17:1~1                   |
|   25083 | 2015-05-09 01:18:37 |         1 |     28 |        1 |  -84 | 56 |  187 | +17:1~1                   |
|   25084 | 2015-05-09 01:18:37 |         1 |     28 |        1 |  -84 | 56 |  187 | +17:1~1                   |
...

これらのデータが何を意味しているかというと、こちら。

ホッパー 中身が詰まった

接続先が一杯で内容物を移動できないホッパーのchest transaction(28)が大量に記録されていたのだった。1.8になってEventの挙動が変わったのか?

まあホッパー内にある(=運搬するような)アイテムの情報が重要である可能性はほぼないと考えられるので、ホッパーのログをfilterしてしまうことにした。

対策

plugins/Hawkeye/config.yml のcontainedtransaction-filter: hopperの部分をfalseに書き換える。

containertransaction-filter:  
  chest: true
  doublechest: true
  furnace: true
  dispenser: true
  hopper: false
  dropper: true

結果、Hawkeyeのデータ量は15分で800行ぐらい(秒速1行以下)となりました。 めでたしめでたし。

そして肥大化したDBだけが残った。