ミドルウェア周りで問題が発生したときの調べ方の例

JDKのバージョンを上げたらTomcat Connectors (JK2)のエラーが出たとのこと。
職場で、以下のフォーラムで出ているのと同様の報告をもらって調べました。

May 6, 2008 1:36:33 PM org.apache.commons.modeler.Registry unregisterComponent
SEVERE: Error unregistering mbean
javax.management.RuntimeOperationsException: Object name cannot be null
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.isRegistered(DefaultMBeanServerInterceptor.java:545)
at com.sun.jmx.mbeanserver.JmxMBeanServer.isRegistered(JmxMBeanServer.java:619)
at org.apache.commons.modeler.Registry.unregisterComponent(Registry.java:642)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:706)
Welcome | Oracle Community

これは、結局Tomcat-users MLのこの投稿のスレッドで指摘された問題で、JDKのバージョンがあがるとJMXまわりのSunのクラスJmxMBeanServerの振る舞いが厳格になったための模様。このスレッドを受けて、Tomcat-dev MLにあるこのコミットで修正されていました。SVNリポジトリでも見られます。
結論としては、根本的に、上記エラーが発生したTomcatのバージョンが古いのであって、最新版ではこの問題は修正されているはずです。

これを調べていて思ったのは、こういうを調べるのは自分たちは当たり前になってるけど、その分野で調べなれてない人は大変そうだということ。
参考として、今回の推理過程を挙げます。

  1. スタックトレース見る限り、JK2まわりっぽい。
  2. そこでnullじゃいけないところにnullがわたっているっぽい
  3. JMXなんて特に使ってないから、JDKの挙動の変更にJKがついていけてないっぽい。だからJKのソースを追えばいい
  4. Apache系のソースは、或る時点でCVSからSVNに移行されたんだよね
  5. そうやって移行されたソースは、普通Webインタフェースで見るときは、変なtagsみたいなパスの下にタグ名でぶら下がってる構造をしてる
  6. 少なくともTomcat4.1のときは、このJK2のこの部分はTomcatのバージョンにあわせてリリースされていた
  7. 以上の知識から、問題がおきたサーバで使ってるバージョンのChannelSocket.javaと最新版とのdiffを採ったら、「nullチェック」を追加している、怪しい修正と考えられた。
  8. その修正のコミットログ(上記)を見て、その確信を深くする。コミットログに記載されていた人名でググると、Tomcat-users MLの記事を発見
  9. そこからTomcat-devへのリンクを発見。デッドリンクになっていたけど、再びググって別な場所にTomcat-dev MLのアーカイブを発見し、コミットログを確認

これ.NETとかCでやれといわれても、多分私は同じペースではできないです。上のケースでは、JKやApacheサイトの運営状況などについての情報を必要としました。.NETなら、MSDN and/or CLI的な知識が必要なのでしょうし、Cなら、MFC/Win32API(Windowsの場合), POSIX/Linuxシステムコール/gcc等の知識が必要になるのでしょう。