Tomcat 5 on Kaffe

Tomat 5のクラスタリング関連のコードがなぜかKaffeで動かなくなってしまった。

kaffe-bin: ../../../kaffe/kaffe/kaffevm/soft.c:254: soft_lookupinterfacemethod: Assertion `cls->state >= CSTATE_USABLE' が失敗しました.

で落ちる。gdbで調べてみるとorg/apache/catalina/cluster/session/SessionMessageImplクラスの初期化が行われていないようだ。SessionMessageImplはクラスタ内のノード間の通信(セッション情報の更新、削除など)パケットを表し、serializeされて直接受け渡しされる。

org/apache/catalina/cluster/tcp/SimpleTcpCluster#messageDataReceived()においてSessionMessageImplクラスのオブジェクトをObjectIntputStreamからreadObject()で読み出すところが問題。普通のObjectIntputStreamを使ってくれれば問題ないのだが、Tomcat 5のクラスタリングモジュールはorg/apache/catalina/cluster/session/ReplicationStreamという、ObjectIntputStreamを拡張した独自のクラスを用いている。こいつが中で

    public Class findReplicationClass(String name)
        throws ClassNotFoundException, IOException {
        return Class.forName(name, false, getClass().getClassLoader());
    }

としており、Class.forName()の第2引数にfalseを渡しているせいで"name"で表されるSessionMessageImplクラスが初期化されないのが原因であった。

SunのJDKでは正しく動作しているので、Kaffeのクラスライブラリのバグと考えられる。