PlantUMLでCPUが暴走!?

前回の投稿で「投稿を絶やさぬように」と口を叩いておきながら半年以上滞っていた北本です。

ここ数日、仕事でPlantUMLを使用していました。PlantUMLについては、当ブログでも過去に何度が取り上げられているので繰り返しになりますが、簡潔に説明するとテキストでの記述によりUMLの画像を生成できるツールです。シーケンス図、ユースケース図、クラス図、状態遷移図など様々なUMLの図の他、UML以外の図にもいくらか対応しているようです。

PlantUMLの大きな特徴は、こちらで細かい指定をしなくてもレイアウトを自動的にやってくれる点です(裏を返せば、こちらからあまり細かいレイアウト指定をできない)。このおかげで、図の作成や修正が容易に行えるのですが、万能ではなく思うようなレイアウトにならないことが多々あります。直線的なシーケンス図ではあまり問題は起こりませんが、状態遷移図の場合、複雑なものになると矢印同士が絡まって読みづらい図ができてしまうこともあります。矢印の方向や長さをこちらで大まかに指定する方法もありますが、それを用いても上手く調整するのは難しいです。

ここで本題です。先日PlantUMLを使っていて偶然にもバグに遭遇しました。図の描画がおかしくなるとかそういったレベルのものではありません。なんと、CPUが暴走してしまう少々危ないバグです。

ある時、PlantUMLを開いてみると、図が作成されず、ずっとpending(処理中)と表示されたままに。PlantUMLを何度か開き直してみても図は作成されず、おまけにPCの動作がもっさりとしてきました。そして、タスクマネージャーを確認してみるとCPU使用率が100%になっていました。

どうやら、特定のテキスト(後述)をPlantUMLに読み込ませると、ずっとpendingと表示され続け(かなり長い時間待つとエラー発生を示す画像が生成される)、pendingと表示されている間にPlantUMLを終了させてしまうと、PlantUMLが呼び出しているGraphvizのdot.exeが終了後もなお動作し続けてしまうようです。それに気付かず何度もPlantUMLの起動を繰り返すと、dot.exeが多重に起動して、しまいにはCPU使用率が100%になってしまうわけです。

その状況を再現できるテキストを紹介します。最初にバグを確認した時のテキストから文を削っていき、バグが発生する恐らく最低限の条件まで落とし込んだのが以下です。これをPlantUMLで読み込むと前述のバグが発生します。実際に確認する場合は自己責任で。

@startuml
state A{
  state a1
  state a2
}

state B{
  state b1
  state b2
}

a1 -> b1
b1 -> a1

a2 -> a1
b1 -> b2
@enduml

なお、PlantUMLにはオンライン版もありますが、そちらで同テキストを入力した場合も、タイムアウトでサーバからエラーが返ってきます。こちらはオフライン版のようにエラーが返ってくるまですごく時間がかかるということはありません。

上記のテキストの->を一箇所-->に変える(“-“の数で矢印の長さを調整できる)だけでもバグが発生しなくなるので、発生条件はかなり際どいようです。

この件については、英語でメールを書いてバグ報告もしました(ちゃんと通じていますように!)。いずれ修正されることでしょう。

PlantUMLを使い始めて数日でこのようなバグに遭遇したのは、ある意味、運が良いというか、こうしてブログに書くネタもできておいしかったかもしれません。