[mayaa-user:1061] ReferenceCacheの不具合報告
水野謙
[E-MAIL ADDRESS DELETED]
2017年 1月 16日 (月) 20:16:28 JST
お世話になっております。
インターファクトリーの水野と申します。私自身がこのMLに投稿するのは初めてですが、
以前弊社に在籍していた石上さん経由で大変お世話になっておりました。
さて表題の件ですが、NamespaceImpl#getInstance および deserialize に書かれている下記ロジックが
期待通りに動作していないと思われる不具合を発見しました。
if (_cache.contains(namespace) == false) {
_cache.add(namespace);
}
ReferenceCache#add にて、要素を SoftReference 等でラップしてから追加していますが、
contains メソッドは ArrayList の実装がそのまま使われるため、常に false を返していると思われます。
このため、重複する要素が多数 _cache に追加され、弊社本番環境では起動後半日の運用で
2万を超える要素数となっておりました。
ArrayList#contains は内部的に indexOf を呼び出しているので、下記のように indexOf を
オーバーライドすることで解消できそうです。
public int indexOf(Object o) {
for (int i = 0; i < size(); i++) {
if (((Reference)get(i)).get().equals(o)) {
return i;
}
}
return -1;
}
なお、こちらは未検証ですが、URLImpl#setValue にある下記ロジックにも類似の問題がありそうです。
if (_value != null) {
_cache.remove(this);
}
参考までに本不具合に気付いた経緯についてですが、弊社本番環境にてごくまれに、
性能が突然極端に低下し、CPUリソースが枯渇する現象が発生しておりました。
スレッドダンプを取得したところNamespaceImpl.getInstanceにてモニタ取得待ちで待機している
スレッドが大量にあり、付近のロジックを調査して発見した次第です。
だいぶ前の話ではありますが、[mayaa-user:1027] にて石川様が報告されている現象も
同一の原因かもしれません。
ご確認の上、修正のご検討をいただけますでしょうか。
なお、弊社環境用には既に修正版を作成済みのため、弊社側の状況としては特に急いではおりません。
よろしくお願いいたします。
--
株式会社インターファクトリー 水野 謙
mizuno.ken @ interfactory.co.jp
〒102-0071
東京都千代田区富士見2-10-2 飯田橋グラン・ブルーム4階
TEL:03-5211-0056 / FAX:03-5211-0059
http://www.interfactory.co.jp
mayaa-user メーリングリストの案内